User:Vovanium/API

From OpenStreetMap Wiki
Jump to navigation Jump to search

GIS API, как я его вижу

Геометрические объекты

Геометрические объекты характеризуются некоторым качеством (свойством, ролью) и расположением в пространстве.

Точка

Точка задаётся двумя координатами.

Отрезок

Отрезок задаётся двумя точками: началом и концом. Отрезок ориентирован, то есть порядок начала и конца важен. Ориентация отрезка имеет два основных значения: направление и различие лево-право. Пример направления — одностороннее движение. Пример различия сторон — обрыв.

Два отрезка с противоположными направлениями — независимы.

Контур

Отрезок контура это по сути тот же отрезок но с рядом оговорок:

  1. контур всегда замкнут, что в локальном смысле означает, что к концу одного отрезка всегда примыкает начало другого;
  2. контур всегда обходится в одном направлении — против часовой стрелки, то есть внутренняя часть области всегда слева, если смотреть по направлению обхода.

На ПО БД ГИС при этом ложится задача примитивной проверки валидности контуров согласно правилу 1: она не должна допускать пакеты изменений, нарушающие это правило.

Что вообще понимать под контуром, если явной связи между его элементами нет? Связность смотрится на выборке по определённому качеству (свойству, роли)

Здравый смысл подсказывает, что должны соблюдаться ещё правила:

  1. контур не должен самопересекаться или самосовпадать;
  2. контур не должен многократно вкладываться.

Проверка данных условий более трудоёмка, и видится нецелесообразным проводить её в реальном времени в составе ПО БД. Ошибки самопересечения и вложения стоит обнаруживать локально в редакторе или сторонними валидаторами.

Пакеты данных

Структура ГИС-пакета

пакет-гео ::= заголовок данные

данные ::= { ключ значение множество-объектов } { список-ролей } множество-объектов ::= { объект } объект :: = точка | линия | контур | отношение точка ::= широта долгота линия ::= точка точка контур ::= точка точка список-ролей ::= отношение { номер ключ объект }

Цели и средства

Предложение этого API — попытка разрешить набор проблем существующего и улучшить производительность в целом.

Улучшение геометрической производительности

Применение направленного обхода контура позволяет обрабатывать площадные объекты без полной загрузки их геометрии.

Отсутствие необходимости в порядке элементов контура снимает многие ограничения на геометрию объектов. Отпадает необходимость в отношениях типа multipolygon.

Площадные объекты могут быть поистине неограниченными в размерах. Отпадает потребность разрезать леса и русла рек на куски.

Отсутсвует необходимость в отдельной обработке береговых линий.

Нет ограничений на размер отношений или ломаных: отношения свободно загружаются по частям а ломаные отсутствуют как класс.

Снижение избыточности и издержек

Элементы геометрии не имеют уникальных номеров. Их идентификаторами служат координаты. Это убирает операцию перемещения как класс (возможно только уничтожить старый объект и создать новый).

Ломаные линии не хранятся одним объектом, а значит, легко разделяются.