Як обчислюється ST_PointOnSurface?


21

Документація PostGIS зазначає, що ST_PointOnSurfaceповертається "точка, яка гарантовано лежить на поверхні". Здається, ця функція може бути тривіально реалізована для отримання результатів, які задовольняють документацію, але надають невелику корисність у реальному світі, хоча я впевнений, що PostGIS забезпечує нетривіальну реалізацію.

Це введення в PostGIS забезпечує порівняння хороший і контраст ST_Centroidз ST_PointOnSurfaceі говорить , що «[ST_PointOnSurface] значно більш обчислювально дорожче , ніж центроїда операції».

Чи є більш ретельне пояснення, як ST_PointOnSurfaceобчислюється? Я використовував ST_Centroid, але в моїх даних зіткнувся з деякими кращими випадками, коли центроїд знаходиться поза геометрією. Я вважаю, що ST_PointOnSurfaceце правильна заміна, але назва функції та документація залишають місце для невизначеності.

Далі, чи є обчислювальні витрати, ST_PointOnSurfaceпонесені, навіть якщо центроїд вже лежить в межах геометрії?


Він існує саме тому, що в нього не завжди входить центроїд непуклих полігонів. Це не має нічого спільного з висотами та DEM, якщо це заплутана частина назви. Деталі щодо впровадження найкраще перевірити в коді, але я вважаю, що ви отримаєте кращу відповідь на GIS.se.
lynxlynxlynx

Гарна точка на GIS.se. Чи є спосіб перенести це питання туди? Я розумію, чому обидві функції існують. Я вважаю назву заплутаною, тому що на поверхні полігонових геметрій я працюю нескінченно багато точок. Однак моє призначення служить лише невеликим набором цих точок. Я хочу знати, що я отримую точку, яка має сенс для того, як я хочу це використовувати.

Відповіді:


24

На основі декількох експериментів, я думаю, ST_PointOnSurface()працює приблизно так, якщо геометрія є багатокутником:

  1. Простежте промінь схід-захід, що лежить на півдорозі між північною та південною частинами полігону.
  2. Знайдіть найдовший відрізок променя, який перетинає багатокутник.
  3. Поверніть точку, яка знаходиться на півдорозі уздовж зазначеного відрізка.

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

             _
            / \             <-- northern extent
           /   \
          /     \
         /       \
        /         \      __
       /           \    /  \
      /_ _ _ P _ _ _\  / _ _\  P = point-on-surface
     /               \/      \
    /                         \
   /            C              \   C = centroid
  /                             \
 /                              /
/______________________________/  <-- southern extent

Таким чином, ST_PointOnSurface()і ST_Centroid()зазвичай різні точки, навіть на опуклих багатокутниках.

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

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


3
Дивлячись на код libgeos , я вважаю, що ти маєш рацію. Знайдений горизонтальний бісектриса, тоді використовується середина найширшого перетину.
mjobrien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.