Порядок багатокутних вершин загалом ГІС: за годинниковою або проти годинникової стрілки


23

Два дні тому я задав питання про внутрішній порядок зберігання вершин багатокутника у ESRI shapefiles. На це запитання було відповідено ( Чи зберігаються багатокутники за годинниковою стрілкою або проти годинникової стрілки у формі файла? ), А також відповідь у старому дописі ( Створення полігона (обертання годинникової стрілки чи ні) )

Але зараз моє запитання більш загальне, і я не знаю, чи є на нього однозначна відповідь. Чи є порядок за годинниковою стрілкою лише для форматів ESRI або для загальних форматів GIS? А як щодо внутрішнього представлення програмного забезпечення GIS? Наприклад, якщо я використовую QGIS і читаю * .shp, що містить багатокутники, я припускаю, що внутрішнє представлення зовнішньої межі знаходиться за годинниковою стрілкою, як у вихідному файлі форм, а як щодо всіх форматів файлів, підтримуваних QGIS? А для ArcGIS? І якщо існує формат файлів з полігонами, які зберігаються проти годинникової стрілки, якщо ці файли завантажуються в QGIS, ArcGIS тощо, чи зміниться орієнтація внутрішньо, тому, якщо я читаю дані, використовуючи PyQGIS, наприклад, полігони знаходяться за годинниковою стрілкою замовили?

Моя мета - написати плагін для QGIS, але джерелом даних можуть бути файли форм ESRI або інші формати. Оскільки мені потрібно перевірити кути між послідовними сторонами багатокутників за допомогою їх азимутів, мені потрібно знати, чи порядок знаходиться за годинниковою стрілкою. Одне рішення - обчислення площі кожного багатокутника, і якщо я правильно пам'ятаю, якщо він позитивний, порядок знаходиться за годинниковою стрілкою, а якщо негативним - порядок проти годинникової стрілки.

Обчислення площі не є інтенсивним завданням, тому це не сповільнить мій плагін настільки сильно. Але у спеціальному випадку QGIS хтось знає, чи зберігає він багатокутники за годинниковою або проти годинникової стрілки, незалежно від порядку в оригінальному джерелі? На сьогоднішній день я працюю з формулами ESRI і координатами в layer.getFeatures (). Геометрія (). AsPolygon () зберігаються за годинниковою стрілкою для зовнішньої межі та проти годинникової стрілки для отворів, тобто як в оригіналі * .shp.


Це залежить від того, як зберігаються дані. Oracle - Anti-Clockwise gis.stackexchange.com/questions/20817/…
Mapperz

@Mapperz, ваше посилання призводить до docs.oracle.com/cd/B10501_01/appdev.920/a96630/…, де чітко зазначено, Polygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)що означає, що Oracle є проти годинникової стрілки.
користувач30184

Відповіді:


27

У специфікації OGC, яку можна завантажити [тут], ( http://www.opengeospatial.org/standards/sfs ) вони зазначають:

"Обертання багатокутника не визначено цим стандартом; фактичне обертання багатокутника може здійснюватися за годинниковою або проти годинникової стрілки."

У документах Oracle чітко зазначено, що межі зовнішнього кільця орієнтовані проти годинникової стрілки, а внутрішні межі кільця - за годинниковою стрілкою. Аналогічно, у SQL Server Spatial тип даних географії дотримується правила проти годинникової стрілки для зовнішнього кільця та за годинниковою стрілкою для внутрішніх кілець - детальніше див. У цьому блозі MicroSoft . Здається, Postgis дозволяє це так чи інакше для геометрій, і має функції, які змусять геометрію полігона слідувати правим або лівим правилам, див. ST_ForceRHR та ForceLHR . JTS / Geos, схоже, дотримувались правого правила, тобто орієнтації зовнішнього кільця за годинниковою стрілкою, тому все насправді трохи незрозуміло.

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


З коментаря @mxfh: Простий доступ до функцій OpenGIS OGC (ISO 19125-1) визначає напрямок проти годинникової стрілки для зовнішніх кілець, згідно з документом версії 1.2.1 [OGC 06-103r4] 6.1.11.1/стор. 26 від opengeospatial.org / стандарти / сфа. Зміна була введена між версією 1.1.0 та 1.2.0 останньою в 2006 році. Зноска, з якої ви посилаєтесь, не оновлювалася з 2005 року


Гарна відповідь Джон. Я не впевнений, що використання впорядкування вузлів для ідентифікації внутрішніх та зовнішніх кілець є єдиним способом, щоб формат векторних даних міг цього досягти. Я погоджуся з вами, хоча якийсь механізм має бути в наявності. Наприклад, GeoJSON, перший список вузлів позначається як зовнішній, а всі наступні списки - внутрішні отвори. Це працює як (якщо не більше) ефективно.
WhiteboxDev

Так, це стосується і WKT для геометрій. Для географій це очевидно важливіше.
Джон Пауелл

Це дуже правда;)
WhiteboxDev

@WhiteboxDev Причина замовлення вкладених кілець чергується в тому, що обчислюючи площу методом Шелеса, обчислює підписані області в залежності від напрямку кільця. В основному вкладені кільця першого порядку вважаються отворами і мають чергування напрямку зовнішнього кільця. Їх значення, що надає площу, від’ємне. Де зовнішнє кільце позитивне; так є вкладені кільця рівного порядку. Отже загальна площа всіх функцій дзвінка - це сума всіх підписаних областей.
mxfh

1
@mxfh: строго кажучи, "намотування замовлень вкладених кілець" є суперечкою для OCG (та багатьох інших) полігонів .... так як це не дозволено. Способом представлення вкладеного багатокутника всередині «дірки» іншого є використання мультиполігону ... в цьому випадку кожен складовий багатокутник дотримується оригінальних правил намотування. Добре, гаразд: це рівнозначно чергуванню обмотки "вкладених LinearRings" ... але лише вказуючи на те, що це не Полігон, як такий, що дозволяє, а скоріше визначення MultiPolygon.
Дан Х

23

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

Ось огляд напрямків багатокутників зовнішніх кілець у різних форматах за їх специфікаціями:

Ілюстрація порядку намотування Shapefiles та простих функцій

  • Простий доступ до функцій (ISO 19125-1) також використовується у WKT / GML / KML та різних реалізаціях SQL:

    • зовнішні кільця: проти годинникової стрілки
    • внутрішні кільця (отвори): за годинниковою стрілкою.

    Полігон - це плоска поверхня, визначена 1 зовнішньою межею та 0 або більше внутрішніх меж. Кожна внутрішня межа визначає отвір у Полігоні. [...]

    Зовнішня межа LinearRing визначає “верх” поверхні, яка є стороною поверхні, від якої зовнішня межа виявляється для переходу кордону в напрямку проти годинникової стрілки . У салоні LinearRings матиме орієнтацію протилежної, і з'являється як по годинниковою стрілкою , якщо дивитися «зверху» ... простий функцію специфікації доступу

    У більшості реалізацій важливий порядок кілець у POLYGON (на відміну від форм-файлів)

    Для багатокутника з отворами його перший підметок - це його зовнішнє кільце, другий підметок - це його перше внутрішнє кільце, третій підметок - друге внутрішнє кільце тощо. Oracle Spatial

    Глибинні гніздування, ака- острів-в-озері-на-острові -..., повинні бути представлені як мультиполігони ( див. Рисунок 2.10 (4) ), оскільки там може бути лише одна зовнішня межа та глибші гніздування, ніж внутрішні кільця не визначені.

  • Шаблони ESRI / SHP :

    • зовнішні кільця: за годинниковою стрілкою
    • внутрішні кільця: проти годинникової стрілки

    Багатокутник складається з одного або декількох кілець. Кільце - це з'єднана послідовність з чотирьох і більше точок, які утворюють замкнутий цикл, що не перетинається. Багатокутник може містити кілька зовнішніх кілець . Порядок вершин або орієнтація для кільця вказує, яка сторона кільця - це внутрішня частина багатокутника. Район праворуч від спостерігача, який ходить уздовж кільця у вершинному порядку, - сусідство всередині полігону. Вершини кілець, що визначають отвори в полігонах, розташовані проти годинникової стрілки . Отже, вершини для одинарного кільця багатокутника завжди є в порядку годинникової стрілки . [...]

    Порядок кілець у точковому масиві не суттєвий. ESRI Whitepaper

    Оскільки дозволяється безліч зовнішніх кордонів, з цим визначенням багатокутника можливі конфігурації острів-в-озері-на-острові. Топологічно острів в озері був би ще одним зовнішнім кільцем за годинниковою стрілкою. Ефективно це робить поліефірний формуляр ESRI простою функцією MultiPolygon

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

  • GeoJSON (RFC7946) :

    ПРИМІТКА. Оригінальна специфікація GeoJSON 2008 не виконувала замовлення на замовлення

    • порядок намотування: зовнішнє кільце проти годинникової стрілки (правило правої руки)
    • внутрішні кільця розташовані за годинниковою стрілкою
    • Порядок кілець важливий:

      Для багатокутників з декількома кільцями першим повинно бути зовнішнє кільце, а будь-яке інше - внутрішні кільця або отвори. Специфікація GeoJSON

  • TopoJSON : за замовчуванням примушує зовнішні кільця за годинниковою стрілкою

Ілюстрація порядку намотування Shapefiles та простих функцій

Екскурсія:

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

В основному вкладені кільця (внутрішні межі) вважаються отворами і мають чергування напрямку зовнішнього кільця. Значення площі підписаної площі від’ємне. Там, де зовнішні кільця позитивні. Загальна площа всіх функцій дзвінка - це сума всіх підписаних областей.

Як впроваджено ESRI, дивіться цей запис у базі знань: Який алгоритм ArcGIS використовується для визначення площі полігону?

Запропонований мнемонічний

Відкриті кінці листів, що трактуються як стрілки:

  • S hapefile: S → ᔑ → ↻
  • Просте F e atur e s: e → ᘓ (вивітрюючись назовні кубічно) → ↺
  • GeoJSON: G (стебло G - стрілка) → ↺

4

Я не знаю, що хтось зможе надати остаточну відповідь на ваше запитання, оскільки кожен формат векторних файлів відрізняється, і кожен ГІС з точки зору того, як вони внутрішньо обробляють ці дані, також буде різним. Але я можу вам точно сказати, що впорядкування за годинниковою стрілкою не є лише для шаблонів ESRI. Є й інші формати, які використовують аналогічне позначення упорядкування за годинниковою стрілкою для зовнішніх кілець і проти годинникової стрілки для внутрішніх отворів багатокутників. Наприклад, структура багатокутника вектора JTS використовує аналогічний формат. Насправді тут зазначається , що історично це мало бути схожим на підхід ESRI. Я також можу остаточно сказати, що ні, не всі формати мають цю вимогу. Наприклад, специфікації формату GeoJSONне вимагають такої вимоги щодо впорядкування вершин у їх полігоновому форматі. Специфікація KML фактично визначає:

Полігони повинні бути вказані в порядку проти годинникової стрілки. Полігони дотримуються "правицького правила", в якому зазначено, що якщо ви розмістите пальці правої руки в напрямку, в якому вказані координати, великий палець вказує на загальний напрямок геометричної норми для багатокутника.

Тож повний спектр варіантів існує і реалізується там. Це дикий світ!


1
Зауважте, що "правильне правило" KML - це те, що умовно називали "правим лівою рукою" (коли ви ходите по периметру з витягнутими руками, ліва рука буде всередині фігури). Esri має декілька підходів, оскільки shapefiles є єдиним форматом, який використовує правило правої руки (бази даних геоданих підприємств використовують внутрішнє правило лівої руки, але API "C" дозволяє вам запитувати в будь-якому порядку). GML вимагає лише, щоб внутрішні кільця були в протилежному порядку зовнішніх кілець, а перше кільце було зовнішнім.
Вінс

@Вінс я цього не знав. Хіба це не горіхи? Дякую, що повідомив мені. Я думаю, що мені найбільше подобається підхід GML; не має значення впорядкування, поки вони протилежні. Це має багато сенсу.
WhiteboxDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.