Jak oblicza się ST_PointOnSurface?


21

Dokumentacja PostGIS stwierdza, że ST_PointOnSurfacezwraca „PUNKT z pewnością leżący na powierzchni”. Wygląda na to, że ta funkcja może być trywialnie zaimplementowana, aby uzyskać wyniki, które spełniają wymogi dokumentacji, ale zapewniają niewiele praktycznych narzędzi, chociaż jestem pewien, że PostGIS zapewnia nietrywialną implementację.

To wprowadzenie do PostGIS zapewnia ładne porównanie i kontrast ST_Centroidz tym ST_PointOnSurfacei mówi, że „[ST_PointOnSurface] jest znacznie droższy obliczeniowo niż operacja centroidu”.

Czy istnieje dokładniejsze wyjaśnienie sposobu ST_PointOnSurfaceobliczania? Używałem ST_Centroid, ale napotkałem kilka przypadków krawędzi w moich danych, w których środek ciężkości znajduje się poza geometrią. Uważam, że ST_PointOnSurfacejest to właściwy zamiennik, ale nazwa funkcji i dokumentacja pozostawiają miejsce na niepewność.

Ponadto, czy koszt obliczeniowy ST_PointOnSurfaceponiesiony, nawet jeśli środek ciężkości leży już w geometrii?


Istnieje dokładnie, ponieważ środek ciężkości niewypukłych wielokątów nie zawsze jest w nim zawarty. Nie ma to nic wspólnego z wysokościami i DEM, jeśli jest to myląca część nazwy. Szczegóły implementacji najlepiej sprawdzać w kodzie, ale wierzę, że uzyskasz lepszą odpowiedź na GIS.se.
lynxlynxlynx

Dobra uwaga na GIS.se. Czy istnieje sposób na migrację tego pytania? Rozumiem, dlaczego istnieją obie funkcje. Uważam, że nazwa jest myląca, ponieważ na nieskończenie wiele punktach na powierzchni geometrii wielokątów, z którymi pracuję. Jednak tylko niewielka część tych punktów służy mojemu celowi. Chcę wiedzieć, że dostaję punkt, który ma sens z tego, jak chcę z niego korzystać.

Odpowiedzi:


24

Na podstawie kilku eksperymentów myślę, że ST_PointOnSurface()działa mniej więcej tak, jeśli geometria jest wielokątem:

  1. Śledź promień wschód-zachód, leżący w połowie drogi między północną a południową częścią wielokąta.
  2. Znajdź najdłuższy segment promienia, który przecina wielokąt.
  3. Zwróć punkt znajdujący się w połowie tego odcinka.

To może nie mieć sensu, więc oto szkic wielokąta z promieniem dzielącym go na części północną i południową:

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

Tak więc ST_PointOnSurface()i ST_Centroid()zwykle są to różne punkty, nawet na wypukłych wielokątach.

Myślę, że jedynym powodem „powierzchni” w nazwie jest to, że jeśli geometria ma linie 3D, wynikiem będzie po prostu jeden z wierzchołków.

Zgodziłbym się, że więcej wyjaśnień (i lepszego nazewnictwa) byłoby przydatne i mam nadzieję, że programista GEOS rzuci nieco więcej światła na tę sprawę.


3
Patrząc na kod libgeos , uważam, że masz rację. Zostanie znaleziony dwusieczny poziomy, a następnie zostanie użyty punkt środkowy najszerszego przecięcia.
mjobrien
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.