Этот документ представляет собой отдельный справочник, описывающий общеизвестное текстовое представление геометрии, которое полностью указано в стандарте доступа к простым функциям, раздел 7 (ЗАДАЧА: предоставьте ссылку непосредственно на этот раздел, если в Интернете есть HTML-версия).
ВНИМАНИЕ: эта работа находится в стадии разработки и пока не должна считаться окончательной. Но мы надеемся относительно скоро получить законченную версию.
ЗАДАЧА: Опишите, что такое WKT и для чего он используется.
Этот репозиторий призван стать исчерпывающим справочником по общеизвестным текстам. Если вы когда-либо терпели неудачу, пытаясь найти официальную ссылку, пожалуйста, помогите! Запросы на извлечение приветствуются. Нам потребуется некоторая официальная проверка, прежде чем это станет окончательным справочником, но мы должны повторить, чтобы сделать его более полезным. В тексте много задач, и мы, скорее всего, перейдем к использованию проблем с GitHub. Но мы также надеемся сделать это «мелочью», а не большой проблемой, просто дойти до итеративного улучшения и «отправить его».
Формально определение хорошо известного текста приведено ниже, но его легче понять, начав с нескольких примеров.
Тип геометрии | Текстовое буквальное представление | Комментарий |
---|---|---|
Точка | ТОЧКА (10 10) | точка |
ЛинияСтрока | ЛИНЕЙНАЯ СТРУНА (10 10, 20 20, 30 40) | LineString с 3 точками |
Полигон | ПОЛИГОН ((10 10, 10 20, 20 20, 20 15, 10 10)) | Многоугольник с 1 внешним кольцом и 0 внутренними кольцами |
Многоточечный | МНОГОТОЧЕЧНЫЙ ((10 10), (20 20)) | MultiPoint с 2 точками |
Мультилинейная строка | МНОГОСТРОЧНАЯ СТРОКА ((10 10, 20 20), (15 15, 30 15)) | MultiLineString с двумя строками |
Мультиполигон | МУЛЬТИПОЛИГОН ( ((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60 )) ) | MultiPolygon с двумя полигонами |
GeomCollection | GeometryCollection ( ТОЧКА (10 10), ТОЧКА (30 30), LINESTRING (15 15, 20 20)) | GeometryCollection, состоящий из двух значений Point и значения LineString. |
Многогранник | Многогранник 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)) ) | Куб-многогранник, угол в начале координат и противоположный угол в точке (1, 1, 1). |
Олово | Tin 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)), ) | Тетраэдр (4 треугольные грани), угол в начале координат и цифра координат каждой единицы. |
Точка | Точка Z (10 10 5) | 3D-точка |
Точка | Точка ЗМ (10 10 5 40) | та же 3D-точка со значением M 40 |
Точка | Точка М (10 10 40) | 2D-точка со значением M 40 |
TODO: Вернитесь к этим примерам, они взяты прямо из спецификации, но, вероятно, лучше начать с ядра. В Википедии это делается намного лучше, возможно, просто скопируйте их, а также с красивыми картинками: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
Примечание. Базовая спецификация содержит четыре определения BNF для 2D, 3D и «измеренной» версий каждого. На данный момент мы просто включим 2-й (неизмеренный)
Общеизвестное текстовое представление геометрии определено ниже с использованием BNF.
Текстовое представление реализуемых типов геометрии должно соответствовать этой грамматике. Хорошо известный текст нечувствителен к регистру.
Примечание. Все производства разделены по типам координат. Это означает, что любые два подэлемента любого элемента всегда будут иметь один и тот же тип координат, который будет типом координат более крупного содержащего его элемента.
Грамматика в этом и следующем разделах была разработана для поддержки компактного и читаемого текстового представления геометрических объектов. Представление геометрического объекта, состоящего из набора однородных компонентов, не включает теги для каждого встроенного компонента. Этот первый набор продукций предназначен для определения литерала двойной точности.
<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: Получите лучшее форматирование здесь. CQL.bnf выглядит намного чище, но, похоже, он использует другой BNF, поэтому нужно разобраться, как все это работает. Вероятно, их можно было бы разместить в отдельных документах и сохранить чистоту основного документа — просто расскажите, как это работает, и приведите примеры.
Следующая БНФ определяет двумерную геометрию в координатных пространствах (x, y). За исключением добавления многогранных поверхностей, эти структуры не изменились по сравнению с предыдущими редакциями настоящего стандарта.
<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>