PostGIS: obtenga un punto dentro de una línea o polígono

10

Necesito obtener el punto central de una línea o polígono para crear markermi aplicación. De modo que cuando hace clic en un marcador aparece la geometría (línea o polígono). Solía ST_Centroidhacerlo funcionar.

El resultado es lo que esperaba que desatara algunos polígonos o líneas cuyos centroides están fuera de la geometría. Lo que me gustaría para esas líneas o polígonos es obtener el "punto más central" pero dentro de la geometría.

¿Cómo puedo hacer esto? ¿Hay alguna solución?

Jose Hermosilla Rodrigo
fuente

Respuestas:

9

Desde el documento: ST_PointOnSurface - Devuelve un PUNTO garantizado para descansar en la superficie.

WKT
fuente
44
Para las líneas ST_LineInterpolatePoint con la fracción 0.5 debe ser perfecto postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184
¡ST_PointOnSurface () funciona con líneas! (Thx Postgis)
WKT
¡Si! Tienes razón @ user30184 porque parece que para las líneas ST_PointOnSurface () toma un punto arbitrario, no estoy seguro, pero en doc ejemplo toma el primer punto de LineString.
Jose Hermosilla Rodrigo
7

En mi caso, tengo cada geometría en tablas de disctint. Lo que hice fue:

  1. Para líneas -> ST_LineInterpolatePoint()con factor 0.5.
  2. Para polígonos -> Prueba si ST_Centroid()está dentro de su geometría. Si es así, ST_Centroid()es la mejor opción, si no elijo PointOnSurface().

Aquí está la consulta:

SELECT
    CASE WHEN (SELECT the_geom FROM points WHERE gid = d.gid) IS NOT NULL
    THEN (SELECT the_geom FROM points WHERE gid = d.gid)
    WHEN (SELECT the_geom FROM lines WHERE gid = d.gid) IS NOT NULL
    THEN ST_LineInterpolatePoint((SELECT the_geom FROM lines WHERE gid = d.gid), 0.5)
    WHEN (SELECT the_geom FROM polygons WHERE gid = d.gid AND ST_Intersects(ST_Centroid(the_geom),the_geom)) IS NOT NULL
    THEN ST_Centroid((SELECT the_geom FROM polygons WHERE gid = d.gid))
    ELSE ST_PointOnSurface((SELECT the_geom FROM polygons WHERE gid = d.gid))
    END AS center
FROM someTable d
Jose Hermosilla Rodrigo
fuente
55
El operador && verifica solo bbox. Es posible que desee utilizar ST_intersects ().
WKT
Tienes razón. Estaba equivocado. Actualizaré mi respuesta. ¡Gracias!
Jose Hermosilla Rodrigo