Este documento proporciona una referencia independiente que describe la conocida representación textual de la geometría, que está completamente especificada en el estándar de acceso a características simples, sección 7 (TODO: proporcione un enlace directo a esa sección cuando haya una versión html en línea).
ADVERTENCIA: Este es un trabajo en progreso y aún no debe considerarse definitivo de ninguna manera. Pero esperamos tener una versión terminada relativamente pronto.
TODO: Describe qué es WKT y para qué se utiliza.
Este repositorio pretende ser una referencia definitiva para el texto conocido. Si alguna vez se ha sentido frustrado al intentar encontrar la referencia oficial, ¡ayúdenos! Se recomiendan las solicitudes de extracción. Necesitaremos alguna revisión oficial antes de que esto se convierta en una referencia definitiva, pero deberíamos iterarlo para hacerlo más útil. Hay muchos todos a lo largo del texto y probablemente evolucionaremos hacia el uso de problemas de github. Pero también esperamos que esto sea una "pequeña" cosa, no un gran problema, simplemente llegar a una mejora iterativa y "enviarlo".
El texto conocido se define formalmente a continuación, pero es más fácil entenderlo comenzando con algunos ejemplos.
Tipo de geometría | Representación literal de texto | Comentario |
---|---|---|
Punto | PUNTO (10 10) | un punto |
cadena de línea | LINESTRING (10 10, 20 20, 30 40) | un LineString con 3 puntos |
Polígono | POLÍGONO ((10 10, 10 20, 20 20, 20 15, 10 10)) | un polígono con 1 anillo exterior y 0 anillos interiores |
multipunto | MULTIPUNTO ((10 10), (20 20)) | un MultiPoint con 2 puntos |
cadena multilínea | MULTILINESTRING ((10 10, 20 20), (15 15, 30 15)) | un MultiLineString con 2 cadenas lineales |
Multipolígono | MULTIPOLÍGONO (((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60 )) ) | un MultiPolygon con 2 polígonos |
Colección Geom | ColecciónGeometría (PUNTO (10 10), PUNTO (30 30), LINESTRING (15 15, 20 20) ) | una GeometryCollection que consta de 2 valores de puntos y un valor de LineString |
Poliedro | Poliedro 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 cubo poliedro, esquina en el origen y esquina opuesta en (1, 1, 1). |
Estaño | Estaño 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 tetraedro (4 caras triangulares), esquina en el origen y cada unidad coordinada por dígito. |
Punto | Punto Z (10 10 5) | Un punto 3D |
Punto | Punto ZM (10 10 5 40) | el mismo punto 3D con valor M de 40 |
Punto | Punto M (10 10 40) | un punto 2D con valor M de 40 |
TODO: Revise estos ejemplos, provienen directamente de las especificaciones, pero probablemente sea mejor comenzar con el núcleo. Wikipedia lo hace mucho mejor, tal vez simplemente copie el de ellos, con bonitas imágenes también: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
Nota: La especificación principal tiene 4 definiciones de BNF, para versiones 2d, 3d y "medidas" de cada una. Por ahora solo incluiremos el 2d (no medido)
La conocida representación textual de la geometría se define a continuación utilizando BNF.
La representación de texto de los tipos de geometría instanciables implementados deberá ajustarse a esta gramática. El texto conocido no distingue entre mayúsculas y minúsculas.
Nota: Todas las producciones están segregadas por tipo de coordenadas. Esto significa que dos subelementos cualesquiera de cualquier elemento siempre tendrán el mismo tipo de coordenadas, que será el tipo de coordenadas del elemento contenedor más grande.
La gramática en esta cláusula y en la siguiente ha sido diseñada para soportar una representación textual compacta y legible de objetos geométricos. La representación de un objeto geométrico que consta de un conjunto de componentes homogéneos no incluye las etiquetas para cada componente incrustado. Este primer conjunto de producciones pretende definir un literal de doble precisión.
<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)
TODO: Obtenga un mejor formato aquí. El CQL.bnf se siente mucho más limpio, pero parece usar BNF diferente, por lo que es necesario descubrir cómo funciona todo. Probablemente podrían ir en documentos separados y mantener el documento principal más limpio; simplemente hable sobre cómo funciona y dé ejemplos.
El siguiente BNF define geometrías bidimensionales en espacios de coordenadas (x, y). Con la excepción de la adición de superficies poliédricas, estas estructuras no cambian con respecto a ediciones anteriores de esta norma.
<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>