/ Розробникам / Виправлення меж

Виправлення меж

Межі полів рідко надходять ідеальними. Launch Pad пропускає кожну межу через автоматичний конвеєр виправлення геометрії, який виявляє некоректні фігури та відновлює їх ще до планування, тож плани проходів завжди генеруються з чистої, коректної геометрії.

Більшість проблем із межами непомітні

Некоректна геометрія напрочуд часто трапляється в реальних даних про межі, і здебільшого її неможливо побачити на карті: самоперетин може ховатися в одній-єдиній вершині. Більшість клієнтів навіть не здогадуються, що їхні межі мають такі проблеми, адже Launch Pad виправляє їх автоматично. Якщо ви інтегруєтеся з API і вам цікаво, чому зчитана назад межа трохи відрізняється від надісланої, ця сторінка пояснює, що сталося і чому.

Звідки береться некоректна геометрія

Ручне редагування

Коли полігон малюють на карті, а потім додають, видаляють або перетягують вершини, можуть виникати самоперетини й накладання без жодних видимих ознак.

Сторонні сервіси

Межі, змінені підключеними платформами (наприклад, John Deere Operations Center), можуть повертатися топологічно пошкодженими.

Файли зі змішаним вмістом

Завантажені файли іноді містять зайві точки, лінії або колекції геометрій замість чистих полігонів.

Більше, ніж базова операція "make valid"

Більшість ГІС-стеків виправляють пошкоджену геометрію однією операцією "make valid" (приведення геометрії до валідного стану). Це усуває топологічну помилку, але такий інструмент надто грубий і не зважає на те, якою має бути придатна для роботи межа поля. Натомість Launch Pad застосовує послідовність цільових корекцій, а загальне виправлення "make valid" залишає як запасний варіант для випадків, які цільові кроки не можуть усунути.

Фільтрація

Точки, лінії та інша неплощинна геометрія видаляються, тож далі проходять лише полігони.

Розділення

Зовнішні межі з самоперетинами розділяються на окремі коректні полігони, замість того щоб відкидати частину поля.

Об'єднання

Отвори, що накладаються чи перетинаються, об'єднуються в один отвір, як цього вимагає специфікація.

Буферизація

Кільця буферизуються з невеликим допуском, щоб отвори ніколи не мали спільного ребра із зовнішньою межею.

Реконструкція

Отвори віднімаються від зовнішніх меж, щоб відбудувати чистий MultiPolygon, а кожен отвір, що виходить за свою оболонку, обрізається.

Видалення дрібних фрагментів

Дрібні фрагменти, менші за мінімальну площу, відкидаються, якщо тільки вони не є єдиною частиною поля.

Нормалізація

Напрямок обходу кілець відповідає правилу правої руки GeoJSON, а координати зводяться до 2D, будь-які значення висоти вилучаються.

Резервне виправлення

Універсальне виправлення "make valid" обробляє самоперетини та інші помилки, що лишилися після цільових кроків.

Що означає "валідний"

Результатом конвеєра завжди є валідний MultiPolygon, що відповідає правилам валідності полігона та MultiPolygon зі специфікації OGC Simple Features Specification:

  • Кожен полігон має рівно одне зовнішнє кільце, і це кільце є коректним полігоном: замкненою лінією щонайменше з 3 різними точками та без самоперетинів.
  • Внутрішні кільця, якщо вони є, являють собою коректні полігони, що повністю лежать усередині свого зовнішнього кільця.
  • Внутрішні кільця не перетинаються між собою; ті, що перетинаються, об'єднуються в одне.

Зовнішнє кільце (оболонка)

Зовнішня межа полігона. У кожного полігона вона рівно одна.

Внутрішнє кільце (отвір)

Внутрішня межа, вирізана з полігона, наприклад заболочена ділянка або купа каміння. Полігон може мати багато отворів.

MultiPolygon

Колекція полігонів. Поле з двома окремими ділянками є одним MultiPolygon із двома полігонами.

Об'єднання

Операція об'єднання геометрій: поєднання фігур, що накладаються, в одну фігуру.

Як працює конвеєр

  1. 1
    Нормалізація вхідних даних. Зберігається лише полігональна геометрія. Точки, лінії та інші неплощинні елементи колекцій геометрій відкидаються, а зовнішні кільця виділяються.
  2. 2
    Перевірка кожного кільця. Кожен зовнішній полігон по черзі проходить перевірку, а потім і кожне внутрішнє кільце.
  3. 3
    Виправлення самоперетинів. Зовнішні кільця з самоперетинами розділяються на окремі полігони. Внутрішні кільця, що перетинаються, об'єднуються. Якщо об'єднання не усуває перетин усередині головної оболонки, полігон передається на загальне виправлення "make valid".
  4. 4
    Буферизація кілець. Кожне кільце буферизується з невеликим допуском, щоб внутрішні кільця ніколи не мали спільного ребра із зовнішнім кільцем.
  5. 5
    Відбудова результату. Внутрішні кільця віднімаються від зовнішніх, формуючи підсумковий валідний MultiPolygon. Отвори, що опиняються поза оболонкою, обрізаються по оболонці, яка їх містить, а отвір, що повністю лежить поза всіма оболонками, зберігається як окремий полігон, а не відкидається.

Якщо вхідні дані неможливо врятувати, наприклад коли після видалення некоректних частин нічого не залишається, Launch Pad повідомляє про помилку, а не вигадує фігуру, і кожен крок виправлення фіксується в журналі, тож результат можна перевірити.

Примітка: Обробка виконується в проєктованій системі координат, тому відстані вимірюються в метрах, а результат конвертується назад у WGS84. Саме тому буферні допуски задаються в метрах, а не в градусах.

Приклади до і після

П'ять показових випадків пошкодженої вхідної геометрії (синім) і виправленого результату (жовтим). Розгорніть WKT, щоб побачити точні координати.

Випадок 1: Змішані типи геометрії

На вході GeometryCollection замість MultiPolygon, і поряд зі справжнім полігоном вона містить LineString і Point. Лінія та точка видаляються, а з полігона виділяється зовнішнє кільце.

Вхідна геометрія
Вхідна геометрія, що містить полігон разом із зайвою лінією та точкою
Вхідний WKT
GEOMETRYCOLLECTION (LINESTRING (131 125, 305 326),
  POINT (260 130),
  POLYGON ((130 330, 223 330, 223 245, 130 245, 130 330)))
Результат
Результат: один чистий полігон, лінію та точку видалено
WKT результату
MULTIPOLYGON (((130 330, 223 330, 223 245, 130 245, 130 330)))

Випадок 2: Межа із самоперетином

Зовнішнє кільце перетинає само себе, утворюючи фігуру-метелик. Це не коректний полігон, і багато планувальників відхилили б його або мовчки відкинули одну з половин. Механізм очищення розділяє кільце в точці перетину на два коректні полігони, зберігаючи всю намальовану площу.

Вхідна геометрія
Вхідний полігон, контур якого перетинає сам себе, утворюючи фігуру-метелик із підсвіченою точкою перетину
Вхідний WKT
POLYGON ((120 110, 120 360, 340 130, 310 360, 120 110))
Результат
Результат: метелик розділено на два коректні полігони, що сходяться в одній точці
WKT результату
MULTIPOLYGON (((120 110, 120 360, 225.87639311043566 249.3110435663627, 120 110)),
  ((225.87639311043566 249.3110435663627, 310 360, 340 130, 225.87639311043566 249.3110435663627)))

Випадок 3: Отвори, що накладаються

Два внутрішні кільця перетинаються між собою, що заборонено специфікацією. Отвори об'єднуються в один, і полігон відтворюється з єдиним об'єднаним отвором.

Вхідна геометрія
Вхідна геометрія з двома отворами, що накладаються, всередині межі поля
Вхідний WKT
-- outer boundary
POLYGON ((130 460, 550 460, 550 30, 130 30, 130 460))
-- inner boundary
MULTIPOLYGON (((230 110, 410 290, 470 100, 230 110)),
  ((370 380, 400 140, 200 200, 370 380)))
Результат
Результат: отвори, що накладалися, об'єднано в один отвір усередині межі
WKT результату
MULTIPOLYGON (((130 460, 550 460, 550 30, 130 30, 130 460),
  (292.3076923076923 172.30769230769232, 200 200, 370 380, 384.44444444444446 264.44444444444446, 410 290, 470 100, 230 110, 292.3076923076923 172.30769230769232)))

Випадок 4: Зовнішні кільця, що накладаються

Кілька зовнішніх кілець накладаються та самоперетинаються, разом замикаючи порожню кишеню. Кільця буферизуються й об'єднуються в єдиний контур, а замкнена кишеня зберігається як повноцінний отвір.

Вхідна геометрія
Вхідна геометрія з кількома прямокутниками, що накладаються один на одного, утворюючи петлю
Вхідний WKT
MULTIPOLYGON (((107 153, 134.3 153, 134.3 121.6, 107 121.6, 107 153),
  (120 147, 120 176.2, 130.5 176.2, 130.5 147, 120 147)),
  ((125 174, 163 174, 163 168, 125 168, 125 174)),
  ((157.5 178.6, 191 178.6, 191 156, 157.5 156, 157.5 178.6),
    (170 166, 185 166, 185 135, 170 135, 170 166)),
  ((180 140, 180 136, 120 136, 120 140, 180 140)))
Результат
Результат: прямокутники об'єднано в один контур, що замикає єдиний отвір
WKT результату
MULTIPOLYGON (((170 136, 134.3 136, 134.3 121.6, 107 121.6, 107 153, 120 153, 120 176.2, 130.5 176.2, 130.5 174, 157.5 174, 157.5 178.6, 191 178.6, 191 156, 185 156, 185 135, 170 135, 170 136),
  (130.5 168, 130.5 153, 134.3 153, 134.3 140, 170 140, 170 156, 157.5 156, 157.5 168, 130.5 168)))

Випадок 5: Отвори поза оболонкою

Поле має два окремі зовнішні кільця, а отвори їх не враховують: один отвір перекриває проміжок між двома оболонками, інші виступають за краї. Кожна оболонка відбудовується окремо, і кожен отвір обрізається по оболонці, що його містить, з невеликим буфером, щоб жоден отвір не мав спільного ребра зі своєю оболонкою.

Вхідна геометрія
Вхідна геометрія з двома окремими контурами та отворами, що перетинають їх або виходять за них
Вхідний WKT
-- outer boundary
MULTIPOLYGON (((104 199, 165 199, 165 125, 104 125, 104 199)),
  ((170 150, 195 150, 195 132, 170 132, 170 150)))
-- inner boundary
MULTIPOLYGON (((158.44444444444446 144.33333333333334, 174 144.33333333333334, 174 139, 158.44444444444446 139, 158.44444444444446 144.33333333333334)),
  ((101 169, 159 169, 159 165, 101 165, 101 169)),
  ((136 122, 109.44444444444444 122, 109.44444444444444 151.55555555555554, 136 151.55555555555554, 136 122)))
Результат
Результат: два чисті полігони, кожен отвір обрізано так, щоб він уміщався всередині свого контуру
WKT результату
MULTIPOLYGON (((170 150, 195 150, 195 132, 170 132, 170 150),
  (170.0010000000475 144.33333333333334, 174 144.33333333333334, 174 139, 170.0010000000475 139, 170.0010000000475 144.33333333333334)),
  ((104 199, 165 199, 165 125, 104 125, 104 199),
    (109.44444444444444 125.0010000000475, 109.44444444444444 151.55555555555554, 136 151.55555555555554, 136 125.0010000000475, 109.44444444444444 125.0010000000475),
    (164.9989999999525 139, 158.44444444444446 139, 158.44444444444446 144.33333333333334, 164.9989999999525 144.33333333333334, 164.9989999999525 139),
    (104.0010000000475 169, 159 169, 159 165, 104.0010000000475 165, 104.0010000000475 169)))

Пов'язані сторінки