Cuadro delimitador para la tabla PostGIS

19

¿Hay una manera fácil de obtener el cuadro delimitador para una tabla completa en PostGIS?

Ulrik
fuente

Respuestas:

26

ST_Extent debería hacer el truco.

ST_Extent: una función agregada que devuelve el cuadro delimitador que limita las filas de geometrías.

Aplicado así:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
bajo oscuro
fuente
13

Como respondió @underdark , ST_Extent hará el trabajo, pero tenga en cuenta que no devuelve una geometría sino a box2d. Si necesita un tipo de geometría, debe usar algo como

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

Además, si lo que necesita es obtener el cuadro delimitador de cada una de las filas que también puede usar ST_Extenty un falso GROUP BY como este:

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

Suponiendo que gid es la clave principal de la tabla

Pero ST_Envelope hará un mejor trabajo como @ bugmenot123 declaró en los comentarios

SELECT ST_Envelope(geom) FROM your_table ;
Francisco Puga
fuente
1
Si necesita un cuadro delimitador para cada fila sin agregación, ¡solo use ST_Envelope! Sin embargo, eso no fue lo que se pidió.
bugmenot123
1
Tienes razón sobre st_envelope, actualizo la respuesta. Sobre el "no solicitado", a veces intenta dar respuestas relacionadas porque para las personas que no hablan bien inglés (como yo) es difícil elegir el texto de búsqueda correcto para encontrar una respuesta. Probablemente caí en esta pregunta buscando una respuesta para el segundo tema.
Francisco Puga
4

Otra posibilidad es usar la ST_Envelopefunción, que devuelve una geometría con SRID,

ST_Envelope: devuelve una geometría que representa el cuadro delimitador de la geometría proporcionada

, junto con la función de agregado ST_Unionpara obtener la unión de todas las geometrías (o la unión de sus respectivas envolventes) de la siguiente manera:

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 segunda opción debería ser más rápida, ya que simplifica la operación de unión mediante el uso de envolventes de geometrías individuales.

ver Fuente .

tinlyx
fuente
1
El enfoque ST_Extent es magnitudes más rápido, ya que puede operar únicamente en números y no tiene que hacer ningún cálculo geométrico complejo. Evita ST_Union siempre que puedas.
bugmenot123
2

No aplicar ninguna agregación espacial debería ser mucho más rápido:

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
mika666
fuente
1
ST_Extent tampoco tiene que hacer nada espacial. Es 2-3 veces más rápido que su enfoque para mis datos (~ 400k polígonos). Probablemente porque puede hacerlo todo de una vez, mientras que su enfoque tiene que mirar varios aspectos de cada geom y luego agregarlos al final.
bugmenot123