Comment ST_PointOnSurface est-il calculé?

21

La documentation PostGIS indique que ST_PointOnSurfaceretourne "un POINT garanti à la surface". Il semble que cette fonction puisse être implémentée de manière triviale pour donner des résultats qui satisfont la documentation mais fournissent peu d'utilité dans le monde réel, bien que je suis certain que PostGIS fournit une implémentation non triviale.

Cette introduction à PostGIS fournit une comparaison et un contraste agréables ST_Centroidavec ST_PointOnSurfaceet dit que "[ST_PointOnSurface] est beaucoup plus cher en termes de calcul que l'opération centroïde".

Y a-t-il une explication plus approfondie de la façon dont ST_PointOnSurfaceest calculé? J'ai utilisé ST_Centroid, mais j'ai rencontré des cas de bord dans mes données où le centroïde est en dehors de la géométrie. Je crois que ST_PointOnSurfacec'est le substitut correct, mais le nom de la fonction et la documentation laissent place à l'incertitude.

De plus, les frais de calcul sont-ils ST_PointOnSurfaceencourus même si le centroïde se trouve déjà dans la géométrie?

mjobrien
la source
Elle existe précisément car le centre de gravité des polygones non convexes n'y est pas toujours inclus. Cela n'a rien à voir avec les hauteurs et les DEM si c'est la partie déroutante du nom. Les détails d'implémentation sont mieux vérifiés dans le code, mais je pense que vous obtiendriez une meilleure réponse sur GIS.se.
lynxlynxlynx
Bon point sur GIS.se. Existe-t-il un moyen de migrer cette question là-bas? Je comprends pourquoi les deux fonctions existent. Je trouve le nom déroutant car il y a une infinité de points sur la surface des goemetries de polygones avec lesquels je travaille. Cependant, seul un petit sous-ensemble de ces points sert mon objectif. Je veux savoir que j'obtiens un point qui a du sens pour la façon dont je veux l'utiliser.

Réponses:

24

Sur la base de quelques expériences, je pense que cela ST_PointOnSurface()fonctionne à peu près comme ceci, si la géométrie est un polygone:

  1. Tracez un rayon est-ouest, à mi-chemin entre les étendues nord et sud du polygone.
  2. Trouvez le segment le plus long du rayon qui coupe le polygone.
  3. Renvoie le point à mi-chemin le long dudit segment.

Cela peut ne pas avoir de sens, alors voici un croquis d'un polygone avec un rayon le divisant en parties nord et sud:

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

Ainsi, ST_PointOnSurface()et ST_Centroid()sont généralement des points différents, même sur des polygones convexes.

La seule raison de la "surface" dans le nom, je pense, est que si la géométrie a des lignes 3D, le résultat sera simplement l'un des sommets.

Je serais d'accord pour dire que plus d'explications (et une meilleure dénomination) auraient été utiles et j'espère qu'un programmeur GEOS pourrait faire la lumière sur la question.

Martin F
la source
3
En regardant le code libgeos , je pense que vous avez raison. La bissectrice horizontale est trouvée, puis le milieu de l'intersection la plus large est utilisé.
mjobrien