PostGIS로 "길고 좁은"다각형 식별


10

도시 지역과 같이 넓은 지역을 나타내는 다각형 세트가 있습니다. 그들 사이에 큰 겹치는 영역을 식별하고 싶습니다.

그러나 문제가 있습니다. 때때로 이러한 다각형은 주변을 따라 겹치게됩니다 (정확도가 거의 없기 때문에). 이것은 내가 신경 쓰지 않는 길고 좁은 겹침을 생성합니다.

그러나 다른 경우에는 견고한 다각형이 겹치게됩니다. 즉, 이웃 다각형이 다른 영역과 겹치는 넓은 영역을 의미합니다. 이 중 하나만 선택하고 싶습니다.

겹치는 부분 만 아래 그림을 참조하십시오. 왼쪽 하단에서 파란색 다각형 만 선택하고 싶다고 상상해보십시오.

겹치다

영역을 볼 수는 있지만 때로는 좁은 영역이 너무 길어 파란색 다각형만큼 큰 영역이 생깁니다. 면적 / 둘레의 비율을 시도했지만 혼합 결과가 나왔습니다.

나는 심지어 사용하려고 시도 ST_MinimumClearance했지만 때로는 넓은 영역에 좁은 부분이 붙어 있거나 두 개의 매우 가까운 정점이 있습니다.

다른 접근법에 대한 아이디어가 있습니까?


결국 저에게 가장 효과적인 것은 아래 @Cyril과 @FGreg에서 제안한 것처럼 네거티브 버퍼를 사용하는 것이 었습니다.

나는 다음과 같은 것을 사용했다 :

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

필자의 경우 단위는 미터이므로 10m 네거티브 버퍼입니다.

좁은 다각형의 경우이 영역은 0을 반환했습니다 (도형은 비어 있음). 그런 다음이 열을 사용하여 좁은 다각형을 필터링했습니다.


4
확실히 면적 / 둘레 비율이 사용될 수 있습니다.
Vince

이미지에서 별개의 다각형이 어디에 있는지 알기어렵지만gis.stackexchange.com/a/265233/64838 과 같은 작업 이 효과 가 있습니까? 최소 회전 경계 상자를 계산 한 다음 너비 나 높이가 작은 상자를 폐기하십시오.
FGreg

여기에 설명 된 것처럼 네거티브 버퍼를 사용해 볼 수도 있습니다. 모양 파일에서 실제로 얇은 다각형을 식별하려면 어떻게해야합니까?
FGreg

답변:


5

얇은 다각형을 먹는다면 음의 버퍼를 만들려고 시도합니다. 다각형을 먹지 않으면 좋습니다.

이전에 선형 다각형 너비의 2/3를 설정 한 상태에서이 스크립트를 실행하십시오 ...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

OS :-) ...


결국 당신의 제안은 저에게 가장 효과적이었습니다. ST_Area(ST_Buffer(geom, -10))내 경우에는 -10은 -10 미터 와 같은 것을 사용하여 끝났습니다 . 해당 표현식에서 0을 반환하면 필터링 할 수 있습니다.
bplmp

9

면적 / 주변 대신 둘레의 제곱으로 나눈 면적 (또는 그 역)을 사용하는 것이 좋습니다.

이것을 "모양 인덱스"라고도합니다. 면적으로 나눈 둘레의 제곱은 최소값이 4 * Pi () (가장 컴팩트 한 2D 형상 인 디스크의 경우)이므로 4 * Pi ()로 정규화 할 수 있습니다. 해석 (정규화 된 값이 1에 가까우면 매우 작은 객체가 있고 정사각형의 값이 약 1.27 임)을 의미합니다.

편집 :이 지역의 임계 값은 매우 작은 인공물을 제거하는 데 유용 할 수 있습니다. 그러면 모양 인덱스가 더 나은 대비를 나타냅니다. 편집 :이 답변 외에도 ST_Snap을 사용 하면 문제가 발생하기 전에 문제를 해결할 수 있습니다.


감사! 그러나이 경우 ST_Snap이 어떻게 도움이되는지 잘 모르겠습니다 ... 올바르게 제안하면 다음과 같은 것이 (o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratio있습니까? 이것은 단지 면적 / 둘레보다 나에게 나쁜 결과를 가져옵니다.
bplmp 2015 년

이제이 o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratio백서에 따르면 사용 하지만 여전히 더 나쁜 결과는 (나쁘게 의미하는 것을 정량화하기는 어렵지만 ) isprs-ann-photogramm-remote-sens-spatial-inf-sci.net/I-7/135/… , 페이지 183.
bplmp

2
이것에 감사합니다, 나는 "모양 색인"에 대해 들어 본 적이 없습니다. 나는 항상 최소 경계 사각형을 사용하는 것이 이런 종류의 질문에 대답하는 가장 좋은 방법이라고 생각했습니다. 나는 이것이 repository.asu.edu/attachments/111230/content/… 라는 것을 알았습니다 .
존 파월

@ JohnPowell intersting paper, 감사합니다. 종이에서 모양 인덱스라고하는 것을 순환 인덱스라고합니다. 최소 경계 사각형에 대한 내 문제는 매우 오목한 물체 (예 : U 자형)에서 작동하지 않는다는 것입니다.
radouxju at

@bplmp ST_Snap은 "거의"인접한 다각형의 정점을 더 이상 겹치지 않도록 스냅하는 데 도움이됩니다. 그림에는 스케일이 없지만 인공물은 선처럼 보이므로 공차 값 theat를 사용할 수 있으면 인공물을 피하기에 충분하지만 큰 다각형에는 영향을 미치지 않습니다.
radouxju

5

한 가지 옵션은 끝점을 사용하여 그릴 수있는 가장 긴 선에 대한 다각형 영역의 비율을 사용하는 것입니다. 길고 좁은 다각형 식별

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

이것은 은색 다각형에 아주 잘 작동합니다. 필요와 투영에 맞게 비율 (면적을 곱한 것)을 조정할 수 있습니다.


1

다음은 사용 사례와 일치 할 수 있습니다. 선택한 다각형 제거

공통 경계를 지우고 입력 레이어의 선택된 다각형을 특정 인접 다각형과 결합합니다. 인접한 다각형은 면적이 가장 크거나 가장 작은 다각형이거나 제거 할 다각형과 가장 큰 공통 경계를 공유하는 다각형 일 수 있습니다.

제거는 보통 은색 다각형, 즉 입력의 경계가 유사하지만 동일하지 않은 다각형 교차 프로세스의 결과 인 작은 다각형을 제거하는 데 사용됩니다.

"가장 큰 경계"옵션을 사용하고 싶은 것 같습니다.


나는 지금 당신이 qgis 솔루션이 아닌 postgis 솔루션을 요구하고 있음을 알고 있습니다. 사과합니다, postgis는 동등한 기능을 가지고 있다고 생각하지 않지만 후손을 위해 남겨 두겠습니다.
FGreg

0

이것은 PostGIS 토폴로지 확장에 대한 완벽한 사용 사례처럼 보입니다 . 토폴로지의 허용 오차 매개 변수는 정점이 다른 기존 다각형에 스냅하여 소스 데이터의 정밀도가 낮고이를 처리 할 수있는 정도를 결정합니다.

간단히 말해서 전략은 다음과 같습니다.

1. 토폴로지 확장 사용

CREATE EXTENSION postgis_topology;

2. 빈 토폴로지를 새로 만듭니다.

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

세 번째 파라미터는 CRS 단위의 공차입니다. 현명하게 선택하십시오. 단위가 미터 인 CRS가 이상적입니다. CGS 단위가 미터가 아닌 경우 WGS 84 aka 4326과 ST_Transform같이 다각형을 재 투영합니다.

3. 다각형 테이블에 TopoGeometry 열 추가

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

이것은 새로운을 반환합니다 layer_id. 저장하면 나중에 필요합니다. 1처음부터 시작하면 새 레이어가 있을 때마다 계층이됩니다 .

4. 모든 다각형을 토폴로지에 추가

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

큰 데이터 세트의 경우 몇 시간이 걸릴 수 있습니다. 인내심을 가지십시오. 1이전에 반환 된 layer_id입니다.

5. 여러 이웃에 나타나는 얼굴 찾기

둘 이상의 지형에있는 토폴로지에서 모든면을 찾습니다. 쿼리를 연습으로 남겨 두겠습니다. 아마도 가장 쉬운 GetTopoGeomElements기능 일 것입니다. 그런 다음 얼굴 ID를 기준으로 그룹화하고 카운트가 2 이상인 것을보십시오. 또는 topogeom 열에서 정리 된 지오메트리를 사용하여 새 테이블을 만들고 표준 지오메트리로 캐스트하고 topogeom::geometry이미 가지고있는 것을 반복하지만 이제는 슬라이 버가 겹치지 않고 깨끗한 데이터 세트를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.