Suite

WKT : Quel est le raisonnement derrière le concept de POINT VIDE ?


Dans les formats de données tels que WKT et WKB, nous avons des moyens de représenter des géométries "vides". Tout cela a du sens : un "LINESTRING EMPTY" est un type LINESTRING avec 0 sommet. Idem avec un MULTIPOINT, un POLYGONE, etc.

Mais qu'en est-il du POINT VIDE ? Pour commencer, il n'y a pas de représentation WKB pour un POINT VIDE, seulement WKT. GeoJSON ne définit pas non plus ce cas dans sa spécification.

Selon la définition Wikipédia d'un point géométrique,"les points n'ont aucune longueur, surface, volume ou tout autre attribut dimensionnel". Alors, comment peut-il être vide, et pourquoi la spécification WKT le permet-elle ?


Désolé d'avoir ravivé un ancien fil de discussion, la même question s'est posée dans le contexte de la spécification du géopackage, alors j'ai pensé que je pourrais aussi bien y répondre ici aussi. La raison pour laquelle vous avez besoin de tous ces types de géométrie vides est que la spécification ISO SQL/MM partie 3 les requiert (pas explicitement, mais indirectement).

Par exempleST_Intersectiondoit pouvoir retourner une valeur « il n'y a pas d'intersection ». Le type de la valeur renvoyée (quoiST_GeometryTyperetournera lorsqu'il sera appelé sur la valeur) dépend des types d'arguments.ST_Intersection(ST_GeomFromText('POINT (1 1)'), ST_GeomFromText('POINT (0 0)')par exemple est spécifié dans la section 5.1.22 comme renvoyant 'un ensemble vide de type point'. Cela doit donc retourner une valeur valideST_Géométrievaleur,ST_EstVidedevrait revenirvraipour elle etST_GeometryTypedevrait revenirST_Point.

Alors, que devriez-vous obtenir lorsque vous exécutezST_AsTextetST_AsBinarysur cette valeur renvoyée ? Pour WKT, la seule réponse correcte que je pense estPOINT VIDE. Pour WKB, cela est mal défini. WKB ne fournit pas d'équivalent de WKTVIDERet les points n'ont pas de représentation vide naturelle. C'est pourquoi dans GeoPackage il y a un bit d'en-tête vide et il est nécessaire d'utiliserNaNcomme coordonnées du point. L'intention est d'éviter que des personnes utilisent accidentellement des ensembles de points vides comme valeur de points régulière. NaN fonctionne comme un élément absorbant, il est donc assez évident que vous ayez fait une erreur, car le résultat de vos calculs est très probablement également NaN.

Notez que dans de nombreuses implémentations, comme PostGIS par exemple, l'exemple ci-dessus renverraGÉOMÉTRIECOLLECTION VIDEau lieu. C'est à proprement parler non conforme à la spécification ISO puisque le type de la valeur de retour n'est pas correct.

Alors pour répondre à la question « pourquoi avez-vous tous ces différents types vides dans WKT et WKB » ? Parce que WKT et WKB sont, pour autant que je sache, définis dans la spécification SQL/MM partie 3, cette spécification définit des ensembles vides typés distincts pour chaque type de géométrie et, par conséquent, WKT et WKB doivent avoir une représentation pour ces ensembles vides typés .


Ceci est probablement répondu dans Géométries vides dans GEOMETRYCOLLECTION qui fait également référence à http://trac.osgeo.org/postgis/wiki/DevWikiEmptyGeometry. Un cas d'utilisation pratique pour de nombreux programmes SIG comme QGIS qui ne peuvent contenir qu'une sorte de géométries sur une seule couche est de permettre d'importer des attributs dans une nouvelle couche et de l'initialiser correctement afin qu'il puisse accepter les géométries qui peuvent venir plus tard. Par conséquent, POINT EMPTY est utile et différent de LINESTRING EMPTY.

Ce WKT définit POINT EMPTY mais WKB n'est pas un problème connu. Dans les récents OGC GeoPackage, les géométries vides standard sont marquées d'un indicateur spécial http://www.geopackage.org/spec/. L'une des raisons en est simplement le cas POINT EMPTY et il est mentionné dans le texte standard :

"Well-Known Binary tel que défini dans ISO 13249-3 [12] ne fournit pas un codage standardisé pour un ensemble de points vide (c'est-à-dire, Point Empty in Well-Known Text). Dans GeoPackages, ces points DOIVENT être codés comme un point où chaque la valeur de la coordonnée est définie sur une valeur NaN silencieuse IEEE-754."