Une extension de GeoJSON à la 3D et aux dimensions supérieures.

Installation

pnpm add -D @types/hyper-geojson@github:kamataryo/types__hyper-geojson#main

Utilisation

Un solide est une liste de faces, chacune un polygone tourné vers l’extérieur.
cube.ts
import type { Polyhedron } from 'hyper-geojson'

// A unit cube: six square faces, each turned to face outward
export const cube: Polyhedron = {
  type: 'Polyhedron',
  coordinates: [
    [[[0, 0, 0], [0, 0, 1], [0, 1, 1], [0, 1, 0], [0, 0, 0]]],
    [[[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1], [0, 0, 0]]],
    [[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0], [0, 0, 0]]],
    [[[1, 1, 1], [1, 0, 1], [1, 0, 0], [1, 1, 0], [1, 1, 1]]],
    [[[1, 1, 1], [1, 1, 0], [0, 1, 0], [0, 1, 1], [1, 1, 1]]],
    [[[1, 1, 1], [0, 1, 1], [0, 0, 1], [1, 0, 1], [1, 1, 1]]],
  ],
}
Les entités portent des polyèdres, des polychores et des polytopes plus grands, et l’imbrication indique à TypeScript jusqu’où regarder.
corners.ts
import type { HyperFeature, HyperPosition, Polychoron } from 'hyper-geojson'

// Every corner of a polychoron: cells, then faces, then rings, then positions
export function corners(feature: HyperFeature<Polychoron>): HyperPosition[] {
  return feature.geometry.coordinates.flat(3)
}
Si l’imbrication est fausse, TypeScript vous le signale.
depth.ts
import type { Polytope } from 'hyper-geojson'

// A 5-polytope nests its positions five levels deep
export const fine: Polytope<5> = {
  type: 'Polytope5',
  coordinates: [[[[[[0, 0, 0, 0, 0]]]]]],
}

export const tooShallow: Polytope<5> = {
  type: 'Polytope5',
  // @ts-expect-error four levels are one too few
  coordinates: [[[[[0, 0, 0, 0, 0]]]]],
}

Visionneuse

Exemple
Vue de Petrie
Vues de coordonnées

cells

Éditeur en direct

    Règle d’orientation

    Chaque bord est tourné à l’opposé de ce qu’il borde. C’est la règle de la main droite de GeoJSON, étendue à toutes les dimensions :

    Ainsi, les deux voisins de chaque bord commun le parcourent en sens opposés : chaque arête d’un polyèdre par deux faces, chaque face d’un polychore par deux cellules. Le nombre d’enroulement d’un point vaut alors 1 à l’intérieur du solide, et 0 à l’extérieur ou dans un vide.

    Un vide n’a pas besoin de son propre niveau d’imbrication : c’est un bord tourné dans l’autre sens. Les types ne vérifient que la profondeur d’imbrication : un bord vrillé ou ouvert passe donc la vérification, comme un anneau ouvert en GeoJSON.