Crea poligono da linee in PostGIS


13

Sto cercando di dividere un poligono in poligoni più piccoli da una linea, ma penso di non poter usare la funzione st_split. Ciò di cui ho bisogno è creare piccoli poligoni all'interno di uno grande, usando la griglia di linestring.

Ho provato alcuni modi, ma non riesco a ottenere il risultato. Cosa ho provato:

Dividi un poligono da un LineString usando st_split ()

Da un poligono di confine.

inserisci qui la descrizione dell'immagine

E tavolo Linestring:

inserisci qui la descrizione dell'immagine

Avrei bisogno dei seguenti poligoni:

inserisci qui la descrizione dell'immagine

Problema : non riesco a dividere un poligono da più linee, né un poligono da una multistringa.

L'altro metodo che sto provando è quello di creare un poligono dalle linee con st_polygonize () L'SQL che stavo provando è:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Estratto dalla creazione di poligoni da segmenti di linea usando PostgreSQL e PostGIS

Problema : posso ottenere solo un poligono (il confine).

Qualcuno può dirmi quale sarebbe il modo migliore per ottenere i poligoni dal linestring o se mi sto perdendo qualcosa?

Nota: le tabelle si trovano nello stesso SRID e le geometrie vengono inserite in una griglia. In QGIS posso eseguire perfettamente il processo poligonale da linee a poligono.

Come richiesto da John, ecco la tabella dei linestring. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
Puoi pubblicare le geometrie del linestring da qualche parte? ST_Polygonize insieme a ST_Dump dovrebbe funzionare.
John Powell,

Sicuro. Ho modificato il post con il link alla tabella.
Pablo Pardo,

@ JohnPowellakaBarça puoi guardare questo. Questa domanda è fantastica. ST_Polygonize nel suo set di campioni restituisce un singolo poligono. Abbiamo essenzialmente bisogno di scomporre la sua confusione di LINESTRINGS aperti e trovarli tutti in grado di creare rettangoli?
Evan Carroll,

1
@EvanCarroll. Sicuro. Sono impazzito e impegnato, quindi probabilmente non per qualche giorno.
John Powell,

1
@ppardoz. Espero que esto te ayude. Ho notato che i tuoi difensori del tavolo erano tutti in spagnolo :-)
John Powell,

Risposte:


4

Ho ottenuto che funzionasse usando prima ST_Node , insieme a ST_Collect , per convertire le linee in un insieme di linestring con nodi all'interno di un MultiLinestring .

Come dice nei documenti per ST_Node :

Completamente il nodo di una serie di linestring usando il minor numero possibile di nodi preservando tutti quelli di input.

Ciò significa che tutte le stringhe di linea sono combinate in tutte le possibili combinazioni, in modo da costituire l'equivalente dell'anello esterno di un poligono. Considerando che, se si tenta di ST_Polygonize un set di LineStrings, nessuno dei quali da solo descrive un poligono, si ottiene semplicemente indietro LineStrings. Quindi, questo funziona:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Se esegui solo la prima parte di questo, ovvero il CTE multi, l'output appare come:

MULTILINESTRING ((204.5 69.9000000000004.204.5 69.9000000000004), (204.5 68.9.205.4 68.9), (204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.804 204,5 69,9000000000004), (209,5 68,9,209,5 68,8,209,5 68,7,209,5 68,6,209,5 68,5,209,5 68,4,209,5 68,3,209,5 68,2,209,5 68,1,209,5 68,209,5 67,9,209,5 67,8,209,5 67,7,209,5 67,6,209,5 67,5,209,5 67,4 , 209.5 .......

Ora, quando ora dai questo MultiLinestring a ST_Polygonize , funziona come previsto, ad es.

POLIGONO ((205.4 68.9.204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.8.204.5 69.9.204.5 69.900000000000004.205.4 69.9.205.4 69.3.205.4 68.9))

POLIGONO ((204.5 69.9000000000004.204.5 70.204.5 70.1.204.5 70.2.204.5 70.3.204.5 70.4.206.8 70.4.209.5 70.4.209.5 70.3.209.5 70.2.209.5 70.1.209.5 70.209.5 69.9.205.4 69.9.204.5 69.9000000000004))

POLIGONO ((206,8 70,4,204,5 70,4,204,5 70,5,204,5 70,6,204,5 70,7,204,5 70,8,204,5 70,9,204,5 71,204,5 71,1,204,5 71,2,204,5 71,3,204,5 71,4,206,8 71,4,206,8 70,4))

Ovviamente, ST_AsText è solo a scopo illustrativo e dovrai modificare, se vuoi anche l'ID del percorso.

L'aspetto chiave è che ST_Polygonize si aspetta che le stringhe di linea che già descrivono il contorno di un poligono , che è ciò che ST_Node (ST_Collect (.... fa in quanto sopra).


È davvero fantastico, posso confermare che questa soluzione funziona! D'altra parte, mi chiedo perché ST_Polygonize()dice che prende le stringhe di linea, o quale sia il caso d'uso per quello senza chiamare ST_Node()prima
Evan Carroll,

1
@EvanCarroll. Penso che la risposta sia che ST_Polygonize prende Linestring che sono già in un set che rappresenta un poligono, mentre i linestring in questa domanda costituivano più poligoni possibili. La mia comprensione è che questo è ciò che fa ST_Node. Tenterò di indagare ulteriormente e di aggiornare la risposta.
John Powell,
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.