PostGIS 테이블의 경계 상자


19

PostGIS에서 전체 테이블에 대한 경계 상자를 얻는 쉬운 방법이 있습니까?

답변:


26

ST_Extent 가 트릭을 수행해야합니다.

ST_Extent — 도형의 행을 묶는 경계 상자를 반환하는 집계 함수입니다.

다음과 같이 적용됩니다 :

SELECT ST_Extent(the_geom) as table_extent FROM your_table;

13

으로 @underdark 대답 , ST_Extent는 일을하지만 기하학하지만 반환하지 않음을 염두에 두어야합니다 box2d. 기하학 유형이 필요한 경우 다음과 같은 것을 사용해야합니다

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

또한 필요한 경우 사용할 수있는 각 행의 경계 상자를 가져 와서 다음 ST_Extent과 같이 가짜로 만들 수 있습니다 GROUP BY.

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

gid가 테이블의 기본 키라고 가정

그러나 ST_Envelope 는 의견에 @ bugmenot123이 언급 한 것처럼 더 나은 작업을 수행합니다.

SELECT ST_Envelope(geom) FROM your_table ;

1
집계가없는 각 행에 경계 상자가 필요한 경우 ST_Envelope! 그것은 요구 된 것이 아닙니다.
bugmenot123

1
당신은 st_envelope에 관한 것입니다. 답을 업데이트합니다. "요청하지 않음"에 관해, 때로는 나와 같은 영어를 잘 못하는 사람들이 정답을 찾기 위해 올바른 검색 텍스트를 선택하기가 어렵 기 때문에 관련 답변을 제공하려고합니다. 아마 나는이 질문에 두 번째 주제에 대한 답을 찾고있었습니다.
Francisco Puga

4

또 다른 가능성은 ST_EnvelopeSRID 를 사용하여 형상을 반환하는 함수 를 사용하는 것입니다 .

ST_Envelope — 제공된 도형의 경계 상자를 나타내는 도형을 반환합니다

ST_Union다음과 같이 모든 도형의 결합 (또는 해당 엔벨로프의 결합)을 얻는 집계 함수와 함께 :

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

또는

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

두 번째 옵션은 개별 지오메트리의 엔벨로프를 사용하여 통합 조작을 단순화하므로 더 빠릅니다.

소스를 참조하십시오 .


1
ST_Extent 접근 방식은 크기 는 숫자에 순수하게 작동 할 수 있으며, 복잡한 기하학적 계산을 할 필요가 없기 때문에 더 빨리. 가능하면 ST_Union을 피하십시오.
bugmenot123

2

공간 집계를 시행하지 않으면 더 빨라야합니다.

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는 또한 공간을 수행 할 필요가 없습니다. 내 데이터 접근 방식 (~ 400k 다각형)보다 2-3 배 빠릅니다. 아마도 한 번에 모든 작업을 수행 할 수 있기 때문에 각 지오메트리의 여러 측면을 살펴보고 결국 집계해야합니다.
bugmenot123
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.