Obwiednia dla tabeli PostGIS

19

Czy istnieje prosty sposób na uzyskanie ramki granicznej dla całego stołu w PostGIS?

Ulrik
źródło

Odpowiedzi:

26

ST_Extent powinien załatwić sprawę .

ST_Extent - funkcja agregująca, która zwraca obwiednię ograniczającą rzędy geometrii.

Zastosowano w ten sposób:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
podmrok
źródło
13

Jak odpowiedział @underdark , ST_Extent wykona zadanie, ale należy pamiętać, że nie zwraca geometrii, ale box2d. Jeśli potrzebujesz typu geometrii, powinieneś użyć czegoś takiego

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

Ponadto, jeśli potrzebujesz uzyskać obwiednię każdego z wierszy, której możesz również użyć, ST_Extenti fałszywkę GROUP BY taką:

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

Zakładając, że gid jest podstawowym kluczem tabeli

Ale ST_Envelope wykona lepszą robotę, jak podano w komentarzach @ bugmenot123

SELECT ST_Envelope(geom) FROM your_table ;
Francisco Puga
źródło
1
Jeśli potrzebujesz obwiedni dla każdego wiersza bez agregacji, po prostu użyj ST_Envelope! Jednak nie o to poproszono.
bugmenot123
1
Masz rację co do st_envelope i zaktualizuję odpowiedź. O „nie pytano” czasami próbuj udzielić powiązanych odpowiedzi, ponieważ osobom, które nie mówią dobrze po angielsku (jak ja), trudno jest wybrać poprawny tekst do znalezienia odpowiedzi. Prawdopodobnie wpadłem w to pytanie, szukając odpowiedzi na drugi temat.
Francisco Puga
4

Inną możliwością jest użycie ST_Envelopefunkcji, która zwraca geometrię z SRID,

ST_Envelope - Zwraca geometrię reprezentującą obwiednię dostarczonej geometrii

, wraz z funkcją agregującą w ST_Unioncelu uzyskania połączenia wszystkich geometrii (lub połączenia ich odpowiednich obwiedni) w następujący sposób:

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

lub

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

Druga opcja powinna być szybsza, ponieważ upraszcza operację łączenia poprzez zastosowanie obwiedni poszczególnych geometrii.

patrz Źródło .

tinlyx
źródło
1
Podejście ST_Extent jest o wiele większe, ponieważ może działać wyłącznie na liczbach i nie musi wykonywać żadnych skomplikowanych obliczeń geometrycznych. Kiedy tylko możesz, unikaj ST_Union.
bugmenot123
2

Niewymaganie agregacji przestrzennej powinno być znacznie szybsze:

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
źródło
1
ST_Extent również nie musi robić nic przestrzennego. To jest 2-3 razy szybsze niż twoje podejście do moich danych (~ 400 000 wielokątów). Prawdopodobnie dlatego, że może zrobić to wszystko za jednym razem, podczas gdy twoje podejście musi przyjrzeć się kilku aspektom każdego geom, a następnie agregować na końcu.
bugmenot123