Este documento fornece uma referência independente que descreve a representação de texto bem conhecida da geometria, que é totalmente especificada no padrão Simple Features Access, seção 7 (TODO: forneça um link diretamente para essa seção quando houver uma versão html online).
AVISO: Este é um trabalho em andamento e ainda não deve ser considerado definitivo de forma alguma. Mas esperamos ter uma versão finalizada relativamente em breve.
TODO: Descreva o que é WKT e para que é usado.
Este repositório pretende ser uma referência definitiva para Texto Conhecido. Se você já ficou frustrado ao tentar encontrar a referência oficial, por favor ajude! Solicitações pull são incentivadas. Precisaremos de uma revisão oficial antes que esta se torne uma referência definitiva, mas devemos iterar para torná-la mais útil. Muitas tarefas ao longo do texto e provavelmente evoluiremos para o uso de problemas do github. Mas também esperamos tornar isso uma coisa “pequena”, e não grande coisa, apenas chegar a uma melhoria iterativa e “enviá-la”.
O Texto Bem Conhecido é formalmente definido abaixo, mas é mais fácil entendê-lo começando com alguns exemplos.
Tipo de geometria | Representação Literal de Texto | Comentário |
---|---|---|
Apontar | PONTO (10 10) | um ponto |
LinhaString | LINESTRING (10 10, 20 20, 30 40) | um LineString com 3 pontos |
Polígono | POLÍGONO ((10 10, 10 20, 20 20, 20 15, 10 10)) | um polígono com 1 exteriorRing e 0 interiorRings |
Multiponto | MULTIPONTO ((10 10), (20 20)) | um MultiPoint com 2 pontos |
MultiLineString | MULTILINESTRING ((10 10, 20 20), (15 15, 30 15)) | um MultiLineString com 2 cadeias de linha |
Multipolígono | MULTIPOLÍGONO (((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60 )) ) | um MultiPolygon com 2 polígonos |
Coleção Geom | GeometryCollection ( PONTO (10 10), PONTO (30 30), LINESTRING (15 15, 20 20) ) | um GeometryCollection que consiste em 2 valores de ponto e um valor 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)) ) | Um cubo poliedro, canto na origem e canto oposto em (1, 1, 1). |
Estanho | Lata 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)), ) | Um tetraedro (4 faces triangulares), canto na origem e cada dígito coordenado unitário. |
Apontar | Ponto Z (10 10 5) | Um ponto 3D |
Apontar | Ponto ZM (10 10 5 40) | o mesmo ponto 3D com valor M de 40 |
Apontar | Ponto M (10 10 40) | um ponto 2D com valor M de 40 |
TODO: Revisite estes exemplos, eles vêm direto das especificações, mas provavelmente é melhor começar com o núcleo. A Wikipedia faz isso muito melhor, talvez apenas copie a deles, com belas fotos também: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
Nota: A especificação principal possui 4 definições de BNF, para versões 2D, 3D e 'medidas' de cada uma. Por enquanto incluiremos apenas o 2d (não medido)
A conhecida representação textual da geometria é definida abaixo usando BNF.
A representação textual dos Tipos de Geometria instanciáveis implementados deve estar em conformidade com esta gramática. Texto bem conhecido não diferencia maiúsculas de minúsculas.
Nota: Todas as produções são segregadas por tipo de coordenadas. Isso significa que quaisquer dois subelementos de qualquer elemento sempre terão o mesmo tipo de coordenada, que será o tipo de coordenada do elemento que o contém maior.
A gramática nesta e na cláusula seguinte foi projetada para suportar uma representação textual compacta e legível de objetos geométricos. A representação de um objeto geométrico que consiste em um conjunto de componentes homogêneos não inclui as tags de cada componente incorporado. Este primeiro conjunto de produções serve para definir um literal de precisão dupla.
<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: Obtenha uma formatação melhor aqui. O CQL.bnf parece muito mais limpo, mas parece usar BNF diferente, então preciso descobrir como tudo isso funciona. Eles provavelmente poderiam ir em documentos separados e manter o documento principal mais limpo - basta falar sobre como funciona e dar exemplos
A BNF a seguir define geometrias bidimensionais em espaços de coordenadas (x, y). Com exceção da adição de superfícies poliédricas, estas estruturas permanecem inalteradas em relação às edições anteriores desta 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>