Riquadro di delimitazione per tabella PostGIS


19

Esiste un modo semplice per ottenere il rettangolo di selezione per un intero tavolo in PostGIS?

Risposte:


26

ST_Extent dovrebbe fare il trucco.

ST_Extent - una funzione aggregata che restituisce il rettangolo di selezione che delimita le righe delle geometrie.

Applicato in questo modo:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;

13

Come ha risposto @underdark , ST_Extent farà il lavoro, ma tieni presente che non restituisce una geometria ma a box2d. Se hai bisogno di un tipo di geometria, dovresti usare qualcosa di simile

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

Inoltre, se ciò di cui hai bisogno è ottenere il riquadro di delimitazione di ciascuna delle righe che puoi anche usare ST_Extente un falso GROUP BY come questo:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

Supponendo che gid sia la chiave primaria della tabella

Ma ST_Envelope farà un lavoro migliore come indicato da @ bugmenot123 nei commenti

SELECT ST_Envelope(geom) FROM your_table ;

1
Se hai bisogno di un rettangolo di selezione per ogni riga senza aggregazione, usa solo ST_Envelope! Non è quello che è stato chiesto però.
bugmenot123

1
Hai ragione su st_envelope, aggiorno la risposta. A proposito del "non richiesto", a volte un tentativo di dare risposte correlate perché per le persone che non parlano bene l'inglese (come me) è difficile scegliere il testo di ricerca corretto per trovare una risposta. Probabilmente sono caduto in questa domanda cercando una risposta per il secondo argomento.
Francisco Puga,

4

Un'altra possibilità è utilizzare la ST_Envelopefunzione, che restituisce una geometria con SRID,

ST_Envelope: restituisce una geometria che rappresenta il rettangolo di selezione della geometria fornita

, insieme alla funzione aggregata ST_Unionper ottenere l'unione di tutte le geometrie (o l'unione delle rispettive buste) come segue:

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

o

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

La seconda opzione dovrebbe essere più veloce in quanto semplifica l'operazione di unione utilizzando le buste delle singole geometrie.

vedi fonte .


1
L'approccio è ST_Extent magnitudini più veloce in quanto può operare esclusivamente su numeri e non ha a che fare tutti i calcoli geometrici complessi. Evita ST_Union ogni volta che puoi.
bugmenot123

2

Non applicare alcuna aggregazione spaziale dovrebbe essere molto più veloce:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x

1
ST_Extent inoltre non deve fare nulla di spaziale. È 2-3 volte più veloce del tuo approccio per i miei dati (~ 400k poligoni). Probabilmente perché può fare tutto in una volta, mentre il tuo approccio deve esaminare diversi aspetti di ciascun geom e quindi aggregarsi alla fine.
bugmenot123
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.