¿Cómo se calcula ST_PointOnSurface?

21

La documentación de PostGIS establece que ST_PointOnSurfacedevuelve "un PUNTO garantizado para descansar en la superficie". Parece que esta función podría implementarse trivialmente para dar resultados que satisfagan la documentación pero que brinden poca utilidad en el mundo real, aunque estoy seguro de que PostGIS proporciona una implementación no trivial.

Esta introducción a PostGIS proporciona una buena comparación y contraste ST_Centroidcon ST_PointOnSurfacey dice que "[ST_PointOnSurface] es sustancialmente más costoso desde el punto de vista computacional que la operación centroide".

¿Hay una explicación más completa de cómo ST_PointOnSurfacese calcula? He estado usando ST_Centroid, pero he encontrado algunos casos de borde en mis datos donde el centroide está fuera de la geometría. Creo que ST_PointOnSurfacees el sustituto correcto, pero el nombre de la función y la documentación dejan lugar a la incertidumbre.

Además, ¿es el gasto computacional de ST_PointOnSurfaceincurrir incluso si el centroide ya se encuentra dentro de la geometría?

mjobrien
fuente
Existe precisamente porque el centroide de los polígonos no convexos no siempre se incluye en él. No tiene nada que ver con las alturas y los DEM si esa es la parte confusa del nombre. Los detalles de implementación se verifican mejor en el código, pero creo que obtendrá una mejor respuesta en GIS.se.
lynxlynxlynx
Buen punto en GIS.se. ¿Hay alguna forma de migrar esta pregunta allí? Entiendo por qué existen ambas funciones. El nombre me parece confuso porque hay infinitos puntos en la superficie de los polígonos de polígonos con los que estoy trabajando. Sin embargo, solo un pequeño subconjunto de esos puntos sirve para mi propósito. Quiero saber que estoy entendiendo un punto que tiene sentido sobre cómo quiero usarlo.

Respuestas:

24

Basado en algunos experimentos, creo que ST_PointOnSurface()funciona más o menos así, si la geometría es un polígono:

  1. Traza un rayo este-oeste, a medio camino entre las extensiones norte y sur del polígono.
  2. Encuentra el segmento más largo del rayo que se cruza con el polígono.
  3. Devuelve el punto que está a medio camino a lo largo de dicho segmento.

Eso puede no tener sentido, así que aquí hay un boceto de un polígono con un rayo que lo divide en partes norte y sur:

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

Por lo tanto, ST_PointOnSurface()y ST_Centroid()generalmente son puntos diferentes, incluso en polígonos convexos.

Creo que la única razón de la "superficie" en el nombre es que si la geometría tiene líneas 3D, entonces el resultado será simplemente uno de los vértices.

Estoy de acuerdo en que más explicaciones (y mejores nombres) habrían sido útiles y espero que un programador de GEOS pueda arrojar algo más de luz sobre el asunto.

Martin F
fuente
3
Mirando el código libgeos , creo que tienes razón. Se encuentra la bisectriz horizontal, luego se usa el punto medio de la intersección más ancha.
mjobrien el