Ce document fournit une référence autonome décrivant la représentation textuelle bien connue de la géométrie, qui est entièrement spécifiée dans la norme Simple Features Access, section 7 (TODO : fournir un lien directement vers cette section lorsqu'il existe une version HTML en ligne).
AVERTISSEMENT : Il s'agit d'un travail en cours et ne doit en aucun cas être considéré comme définitif. Mais nous espérons avoir une version terminée relativement prochainement.
À FAIRE : Décrivez ce qu'est WKT et à quoi il sert.
Ce référentiel vise à être une référence définitive pour Well Known Text. Si vous avez déjà été frustré en essayant de trouver la référence officielle, aidez-nous ! Les demandes de tirage sont encouragées. Nous aurons besoin d'une révision officielle avant que cela devienne une référence définitive, mais nous devrions répéter pour le rendre plus utile. Beaucoup de choses à faire tout au long du texte, et nous évoluerons probablement vers l'utilisation des problèmes github. Mais nous espérons également en faire une « petite » chose, pas une grosse affaire, simplement parvenir à une amélioration itérative et « l'expédier ».
Le texte bien connu est formellement défini ci-dessous, mais il est plus facile de s'en faire une idée en commençant par quelques exemples.
Type de géométrie | Représentation littérale du texte | Commentaire |
---|---|---|
Indiquer | POINT (10 10) | un point |
Chaîne de ligne | CORDON DE LIGNE (10 10, 20 20, 30 40) | une LineString avec 3 points |
Polygone | POLYGONE ((10 10, 10 20, 20 20, 20 15, 10 10)) | un polygone avec 1 anneau extérieur et 0 anneau intérieur |
Multipoint | MULTIPOINT ((10 10), (20 20)) | un MultiPoint avec 2 points |
Chaîne MultiLigne | CHAÎNE MULTILIGNE ((10 10, 20 20), (15 15, 30 15)) | un MultiLineString avec 2 lignes |
MultiPolygone | MULTIPOLYGONE ( ((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60 )) ) | un MultiPolygon avec 2 polygones |
Collection Géom | GeometryCollection ( POINT (10 10), POINT (30 30), LINESTRING (15 15, 20 20) ) | une GeometryCollection composée de 2 valeurs Point et d'une valeur LineString |
Polyèdre | Polyèdre Z ( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)) , ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), (( 0 0 1, 1 0 1, 1 1 1, 0 1 1. 0 0 1)) ) | Un cube polyèdre, coin à l'origine et coin opposé en (1, 1, 1). |
Étain | Étain Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 0 0 1, 0 0 0)), ((1 0 0, 0 1 0, 0 0 1, 1 0 0)), ) | Un tétraèdre (4 faces triangulaires), coin à l'origine et chaque unité a un chiffre de coordination. |
Indiquer | Point Z (10 10 5) | Un point 3D |
Indiquer | Point ZM (10 10 5 40) | le même point 3D avec une valeur M de 40 |
Indiquer | Point M (10 10 40) | un point 2D avec une valeur M de 40 |
À FAIRE : Revisitez ces exemples, ils proviennent directement des spécifications, mais il est probablement préférable de commencer par le noyau. Wikipédia le fait beaucoup mieux, peut-être simplement copier les leurs, avec également de belles images : https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
Remarque : La spécification principale comporte 4 définitions BNF, pour les versions 2D, 3D et « mesurées » de chacune. Pour l'instant, nous n'incluons que le 2ème (non mesuré)
La représentation textuelle bien connue de la géométrie est définie ci-dessous à l'aide de BNF.
La représentation textuelle des types de géométrie instanciables implémentés doit être conforme à cette grammaire. Le texte bien connu n’est pas sensible à la casse.
Remarque : Toutes les productions sont séparées par type de coordonnées. Cela signifie que deux sous-éléments d'un élément auront toujours le même type de coordonnées, qui sera le type de coordonnées de l'élément conteneur le plus grand.
La grammaire de cette clause et de la suivante a été conçue pour prendre en charge une représentation textuelle compacte et lisible des objets géométriques. La représentation d'un objet géométrique constitué d'un ensemble de composants homogènes n'inclut pas les balises de chaque composant incorporé. Ce premier ensemble de productions consiste à définir un littéral à double précision.
<x> ::= <signed numeric literal>
<y> ::= <signed numeric literal>
<z> ::= <signed numeric literal>
<m> ::= <signed numeric literal>
<quoted name> ::= <double quote> <name> <double quote>
<name> ::= <letters>
<letters> ::= (<letter>)*
<letter> ::= <simple Latin letter>|<digit>|<special>
<simple Latin letter> ::= <simple Latin upper case letter>|<simple Latin lower case letter>
<signed numeric literal> ::= {<sign>}<unsigned numeric literal>
<unsigned numeric literal> ::= <exact numeric literal>|<approximate numeric literal>
<approximate numeric
literal> ::=
<mantissa>E<exponent>
<mantissa> ::= <exact numeric literal>
<exponent> ::= <signed integer>
<exact numeric literal> ::= <unsigned integer>{<decimal point>{<unsigned integer>}}|<decimal point><unsigned integer>
<signed integer> ::= {<sign>}<unsigned integer>
<unsigned integer> ::= (<digit>)*
<left delimiter> ::= <left paren>|<left bracket> // must match balancing right delimiter
<right delimiter> ::= <right paren>|<right bracket> // must match balancing left delimiter
<special> ::= <right paren>|<left paren>|<minus sign>|<underscore>|<period>|<quote>|<space>
<sign> ::= <plus sign> | <minus sign>
<decimal point> ::= <period> | <comma>
<empty set> ::= EMPTY
<minus sign> ::= -
<left paren> ::= (
<right paren> ::= )
<left bracket> ::= [
<right bracket> ::= ]
<period> ::= .
<plus sign> ::= +
<double quote> ::= "
<quote> ::= '
<comma> ,
<underscore> ::= _
<digit> ::= 0|1|2|3|4|5|6|7|8|9
<simple Latin lower caseletter> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<simple Latin upper case letter> ::= A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
<space>= " "// unicode "U+0020" (space)
À FAIRE : Obtenez un meilleur formatage ici. Le CQL.bnf semble beaucoup plus propre, mais il semble utiliser un BNF différent, il faut donc comprendre comment tout cela fonctionne. Ceux-ci pourraient probablement être placés dans des documents séparés et garder le document principal plus propre - il suffit d'expliquer comment cela fonctionne et de donner des exemples.
Le BNF suivant définit des géométries bidimensionnelles dans des espaces de coordonnées (x, y). À l'exception de l'ajout de surfaces polyédriques, ces structures restent inchangées par rapport aux éditions antérieures de cette norme.
<point> ::= <x> <y>
<geometry tagged text> ::= <point tagged text> | <linestring tagged text> | <polygon tagged text> | <triangle tagged text> | <polyhedralsurface tagged text> | <tin tagged text> | <multipoint tagged text> | <multilinestring tagged text> | <multipolygon tagged text>| <geometrycollection tagged text>
<point tagged text> ::= point <point text>
<linestring tagged text> ::= linestring <linestring text>
<polygon tagged text> ::= polygon <polygon text>
<polyhedralsurface tagged text> ::= polyhedralsurface <polyhedralsurface text>
<triangle tagged text> ::= triangle <polygon text>
<tin tagged text> tin <polyhedralsurface text>
<multipoint tagged text> ::= multipoint <multipoint text>
<multilinestring tagged text> ::= multilinestring <multilinestring text>
<multipolygon tagged text> ::= multipolygon <multipolygon text>
<geometrycollection tagged text> ::= geometrycollection
<geometrycollection text>
<point text> ::= <empty set> | <left paren> <point> <right paren>
<linestring text> ::= <empty set> | <left paren> <point> {<comma> <point>}* <right paren>
<polygon text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
<polyhedralsurface text> ::= <empty set> | <left paren> <polygon text> {<comma> <polygon text>}* <right paren>
<multipoint text> ::= <empty set> | <left paren> <point text> {<comma> <point text>}* <right paren>
<multilinestring text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
<multipolygon text> ::= <empty set> | <left paren> <polygon text> {<comma> <polygon text>}* <right paren>
<geometrycollection text> ::= <empty set> | <left paren> <geometry tagged text> {<comma> <geometry tagged text>}* <right paren>