Caixa delimitadora para tabela PostGIS

19

Existe uma maneira fácil de obter a caixa delimitadora para uma tabela inteira no PostGIS?

Ulrik
fonte

Respostas:

26

ST_Extent deve fazer o truque.

ST_Extent - uma função agregada que retorna a caixa delimitadora que limita linhas de geometrias.

Aplicado assim:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
underdark
fonte
13

Como o @underdark respondeu , o ST_Extent fará o trabalho, mas lembre-se de que ele não retorna uma geometria, mas a box2d. Se você precisar de um tipo de geometria, use algo como

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

Além disso, se o que você precisa é obter a caixa delimitadora de cada uma das linhas, você também pode usar ST_Extentuma farsa GROUP BY como esta:

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

Supondo que gid é a chave primária da tabela

Mas ST_Envelope fará um trabalho melhor como @ bugmenot123 afirmou nos comentários

SELECT ST_Envelope(geom) FROM your_table ;
Francisco Puga
fonte
1
Se você precisar de uma caixa delimitadora para cada linha sem agregação, use ST_Envelope! Não foi o que foi pedido.
bugmenot123 31/07
1
Você está certo sobre st_envelope eu atualizo a resposta. Sobre o "não solicitado", às vezes uma tentativa de fornecer respostas relacionadas, porque para pessoas que não falam bem o inglês (como eu) é difícil escolher o texto de pesquisa correto para encontrar uma resposta. Provavelmente caí nessa questão procurando uma resposta para o segundo tópico.
Francisco Puga
4

Outra possibilidade é usar a ST_Envelopefunção, que retorna uma geometria com SRID,

ST_Envelope - Retorna uma geometria representando a caixa delimitadora da geometria fornecida

, juntamente com a função agregada ST_Unionpara obter a união de todas as geometrias (ou a união de seus respectivos envelopes) da seguinte maneira:

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

ou

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

A segunda opção deve ser mais rápida, pois simplifica a operação de união usando os envelopes de geometrias individuais.

veja Fonte .

tinlyx
fonte
1
A abordagem ST_Extent é magnitudes mais rapidamente, pois pode operar puramente em números e não precisa fazer cálculos geométricos complexos. Evite ST_Union sempre que puder.
bugmenot123 31/07
2

Não aplicar nenhuma agregação espacial deve ser muito mais 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
fonte
1
ST_Extent também não precisa fazer nada espacial. É 2-3 vezes mais rápido que a sua abordagem para meus dados (~ 400k polígonos). Provavelmente porque ele pode fazer tudo de uma só vez, enquanto a sua abordagem precisa examinar vários aspectos de cada geom e depois agregar no final.
bugmenot123 31/07