PostGIS - Ottieni un punto all'interno di una linea o di un poligono


10

Devo ottenere il punto centrale di una linea o di un poligono per creare la markermia app. In modo che quando fai clic su un marcatore appare la geometria (linea o poligono). Prima lo facevo ST_Centroidfunzionare.

Il risultato è quello che mi aspettavo non più di alcuni poligoni o linee i cui centroidi sono fuori dalla geometria. Quello che vorrei per quelle linee o poligoni è ottenere il "punto più centrale" ma all'interno della geometria.

Come posso fare questo? C'è una soluzione?

Risposte:


9

Dal documento: ST_PointOnSurface : restituisce un PUNTO garantito in superficie.


4
Per le righe ST_LineInterpolatePoint con la frazione 0,5 dovrebbe essere perfetto postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184

ST_PointOnSurface () funziona con Lines! (grazie Postgis)
WKT,

Sì! Hai ragione @ user30184 perché sembra che per le righe ST_PointOnSurface () prenda un punto arbitrario, non ne sono sicuro, ma nell'esempio doc prende il primo punto di un LineString.
Jose Hermosilla Rodrigo,

7

Nel mio caso ho ciascuna geometria nelle tabelle disctint. Quello che ho fatto è stato:

  1. Per linee -> ST_LineInterpolatePoint()con fattore 0,5.
  2. Per i poligoni -> Verifica se si ST_Centroid()trova all'interno della sua geometria. In tal caso, ST_Centroid()è la scelta migliore, in caso contrario scelgo PointOnSurface().

Ecco la domanda:

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

5
L'operatore && controlla solo bbox. È possibile che si desideri utilizzare ST_intersects ().
WKT,

Hai ragione. Mi sbagliavo. Aggiornerò la mia risposta. Grazie!
Jose Hermosilla Rodrigo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.