Как рассчитывается ST_PointOnSurface?

21

В документации PostGIS говорится, что ST_PointOnSurfaceвозвращается «ТОЧКА, гарантированно лежащая на поверхности». Кажется, что эта функция может быть тривиально реализована, чтобы дать результаты, которые удовлетворяют документации, но обеспечивают небольшую практическую полезность, хотя я уверен, что PostGIS предоставляет нетривиальную реализацию.

Это введение в PostGIS обеспечивает хорошее сравнение и контраст ST_Centroidс ST_PointOnSurfaceи говорит, что «[ST_PointOnSurface] существенно дороже в вычислительном отношении, чем операция с центроидом».

Есть ли более подробное объяснение того, как ST_PointOnSurfaceрассчитывается? Я использовал ST_Centroid, но столкнулся с некоторыми крайними случаями в моих данных, когда центроид находится вне геометрии. Я считаю, что ST_PointOnSurfaceэто правильная замена, но имя функции и документация оставляют место для неопределенности.

Кроме того, производятся ли вычислительные затраты ST_PointOnSurface, даже если центроид уже находится в пределах геометрии?

mjobrien
источник
Он существует именно потому, что центр тяжести невыпуклых многоугольников в него не всегда входит. Это не имеет ничего общего с высотами и ЦМР, если это запутанная часть названия. Детали реализации лучше всего проверять в коде, но я думаю, что вы получите лучший ответ на 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 , я считаю, что вы правы. Горизонтальный биссектриса найден, затем используется средняя точка самого широкого пересечения.
Мьобриен