Wie berechnet sich ST_PointOnSurface?

21

In der PostGIS-Dokumentation wird angegeben, dass ST_PointOnSurface"ein PUNKT garantiert auf der Oberfläche liegt". Es scheint, als ob diese Funktion trivial implementiert werden könnte, um Ergebnisse zu liefern, die der Dokumentation entsprechen, aber nur wenig praktischen Nutzen bieten, obwohl ich mir sicher bin, dass PostGIS eine nicht triviale Implementierung bietet.

Diese Einführung in PostGIS bietet einen schönen Vergleich und Kontrast ST_Centroidzu ST_PointOnSurfaceund besagt, dass "[ST_PointOnSurface] wesentlich rechenintensiver ist als die Schwerpunktoperation".

Gibt es eine genauere Erklärung für die ST_PointOnSurfaceBerechnung? Ich habe verwendet ST_Centroid, bin jedoch auf einige Randfälle in meinen Daten gestoßen, bei denen sich der Schwerpunkt außerhalb der Geometrie befindet. Ich glaube, das ST_PointOnSurfaceist der richtige Ersatz, aber der Funktionsname und die Dokumentation lassen Raum für Unsicherheit.

Fällt der Rechenaufwand ST_PointOnSurfaceauch dann an, wenn der Schwerpunkt bereits in der Geometrie liegt?

mjobrien
quelle
Es existiert genau deshalb, weil der Schwerpunkt nicht konvexer Polygone nicht immer darin enthalten ist. Es hat nichts mit Höhen und DEMs zu tun, wenn das der verwirrende Teil des Namens ist. Implementierungsdetails werden am besten im Code überprüft, aber ich glaube, Sie erhalten eine bessere Antwort auf GIS.se.
Lynxlynxlynx
Guter Punkt auf GIS.se. Gibt es eine Möglichkeit, diese Frage dorthin zu migrieren? Ich verstehe, warum beide Funktionen existieren. Ich finde den Namen verwirrend, weil es unendlich viele Punkte auf der Oberfläche der Polygon-Gegenstände gibt, mit denen ich arbeite. Allerdings dient nur eine kleine Teilmenge dieser Punkte meinem Zweck. Ich möchte wissen, dass ich einen Punkt erhalte, der Sinn macht, wie ich ihn verwenden möchte.

Antworten:

24

Basierend auf einigen Experimenten, denke ich, ST_PointOnSurface()funktioniert das ungefähr so, wenn die Geometrie ein Polygon ist:

  1. Verfolgen Sie einen Ost-West-Strahl, der auf halber Strecke zwischen der nördlichen und südlichen Ausdehnung des Polygons liegt.
  2. Suchen Sie das längste Segment des Strahls, das das Polygon schneidet.
  3. Geben Sie den Punkt zurück, der sich auf halber Strecke des Segments befindet.

Das mag keinen Sinn ergeben, deshalb hier eine Skizze eines Polygons mit einem Strahl, der es in einen nördlichen und einen südlichen Teil unterteilt:

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

Somit liegen ST_PointOnSurface()und ST_Centroid()liegen in der Regel unterschiedliche Punkte vor, auch auf konvexen Polygonen.

Der einzige Grund für die "Oberfläche" im Namen ist meiner Meinung nach, dass, wenn die Geometrie 3D-Linien aufweist, das Ergebnis einfach einer der Scheitelpunkte ist.

Ich würde zustimmen, dass mehr Erklärungen (und eine bessere Benennung) nützlich gewesen wären und hoffe, dass ein GEOS-Programmierer mehr Licht in die Sache bringen könnte.

Martin F
quelle
3
Wenn ich mir den Libgeos-Code ansehe , glaube ich, dass Sie Recht haben. Die horizontale Halbierende wird gefunden, dann wird der Mittelpunkt des breitesten Schnitts verwendet.
Mjobrien