중복 형상을 찾기위한 GIS 분석


9

나는 내가 일하는 도시의 모든 건물과 주택을 포함하는 큰 shapefile을 가지고 있습니다 (약 90,000 개의 특징). 건물 / 주택의 데이터는 도시의 측량 기술자에 의해 저장되며 나쁜 연습과 해당 데이터에 대한 다른 측량사의 접근으로 인해 많은 건물 / 주택이 두 번 저장되어 맵에 중복으로 표시됩니다.

그중 일부는 정확하게 복제되고 (하나는 다른 것 위에 나타남), 다른 것들은 두 물체 사이에 공백으로 복제됩니다 (한 물체가 다른 물체 안에있는 것처럼-첨부 된 스크린 샷 참조).

여기에 이미지 설명을 입력하십시오

도시에 올바른 건물 / 주택 만 갖도록 데이터를 정리하고 싶습니다. 제 질문은 다음과 같습니다.

모든 중복 피처 (정확한 피처 및 다른 피처 내에있는 피처)를 모두 찾기 위해 실행할 수있는 GIS 분석 또는 SQL 표현식이 있습니까? ArcGIS와 QGIS가 모두 있으므로 모든 제안에 개방적입니다.


동일한 삭제 도구 를 탐색 할 수 있습니다 . 그러나 엔터프라이즈 라이센스 레벨이 필요합니다. 당신은에서 사용할 수있는 몇 가지 다른 옵션을 검토 할 수 있습니다 기술 문서 36031합니까는 ArcGIS 식별 할 수있는 방법을 제공하거나 제거 중복 형상과 기능을 당신의 최선의 방법이있다 데이터 검토 확장 파일 . 이 도구들 중 어느 것도 여러분의 분할 형상을
다루지

또한 동일한 구성 요소 삭제 도구에서 테이블 형식 구성 요소를 비교하지 않아야합니다. 나는 그 대답이 아니라는 것을 알고 있지만 문제 해결에 도움이되기를 바랍니다.
MDHald

데이터베이스에 데이터가 있습니까? 어떤 타입?
ISC의 Russell

하나의 옵션은 ArcMap 에서 교차 도구 ( 이 답변에 설명 된대로 )를 사용하는 것 입니다. 도구 는 중첩 위치를 출력합니다. 수동으로 삭제할 다각형을 확인하고 결정해야하지만 정확한 복제가 아닌 경우 어쨌든 그렇게해야한다고 생각합니다.
Erica

4
'중복'이라는 용어를 사용하는 것은이 질문에서 약간 오도됩니다. 정확하고 동일하게 쌓인 사본의 경우 예, 사본이 중복되거나 속성이 다를 수 있으며 다른 사람이 제안한 것처럼 삭제 또는 찾기 도구는 라이센스 수준이 있으면 도움이 될 수 있습니다. 그러나 그것들이 전혀 상쇄되거나 다른 모양이라면, 그것들 자체는 실제로 복제되지 않습니다. 고급 라이센스가있는 경우 지오 데이터베이스 토폴로지를 살펴보고 겹치지 않아야 함 확인을 실행합니다. Advanced가 없다면 QGIS와 Luigi의 답변에서 제안한 플러그인으로도 같은 작업을 수행 할 수 있습니다.
Chris W

답변:


4

QGIS에서 Topology Checker 플러그인으로 문제를 해결할 수 있습니다


3
데이터 정리 문제에 대한 토폴로지는 아마도 최상의 단일 솔루션이라는 데 동의합니다. 그러나 플러그인에 대한 링크와 토폴로지가 무엇인지, 무엇을 수행하는지, 어떤 검사를 실행할지에 대한 간단한 설명을 제공하여 답변을 조금 확장하고 싶을 수도 있습니다. 입력 한 답변이 품질이 낮을 것으로 예상됩니다.
Chris W

ok : 플러그인에 대한 설명은 여기에 있습니다 : docs.qgis.org/2.2/en/docs/user_manual/plugins/… 그리고 "겹치지 않아야합니다"가 문제에 접근 할 수 있습니다. 플러그인의 비디오 가이드는 youtube.com/watch?v=huhkTZkoKC8 입니다.
루이지 피렐리

6

나는 파이썬의 itertoolsSearchCursor 를 사용하여 공간 관계를 찾는 매우 효율적인 방법을 사용할 것입니다. 당신은 통합 할 수있는 구조 방법 overlaps , containsequal형상의 속성을 얻을 수 있습니다.

  1. 워크 플로우를보다 잘 구성하고 반복성을위한 기능을 생성하여 시작

    def findOverlaps(x):

  2. 검색 커서를 열어 개별 형상 형상을 반복

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. itertools.combinations()입력 iterable에서 요소의 하위 시퀀스를 반환 하는 데 사용cur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. 다음 방법으로 기하학적 속성을 액세스 equals(), overlaps()contains(). 이들은 논리적 순서로 설정되어 있으며 필요한 경우 특정 목표를 달성하도록 조정할 수 있습니다.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. 그것을 실행 ...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

여기에 이미지 설명을 입력하십시오

스크린 샷은 겹치거나 겹치며 동일하며 고유 한 다양한 기능을 보여줍니다.

여기에 이미지 설명을 입력하십시오


2

나는 당신에게 무엇이 도움이 될지 생각합니다. 몇 가지 가정을 기반으로 할 것이지만 가능한 동일한 기능 목록을 좁히는 데 도움이됩니다. 자동화 된 프로세스는 아니지만 수동으로 복제본을 확인해야합니다. 주석을 기반으로 자동화 된 도구가 속성을 비교하지 않는 것처럼 보이므로 실수로 기능을 삭제하지 않을 수 있습니다.

ArcMap 사용

(1) 상황이 잘못 될 경우에 대비하여 쉐이프 파일을 복사하십시오.

(2) 셰이프 파일에 열을 이중으로 추가합니다.

(3) 가능한 가장 설명적인 (가장 정확한) 형식을 사용하여 각 지형지 물의 면적을 계산하십시오. 반올림이 문제가되지 않을 수 있습니다.

(4) 해당 열에서 요약을 실행하십시오 (요약). 요약에서 고유 식별자를 선택하고 첫 번째와 마지막을 모두 표시하십시오.

(5) 출력 테이블에서 개수 필드가 1보다 큰 레코드를 찾으십시오 .

(6a) 기능을 수동으로 확인하고 더 이상 중복이 없을 때까지 프로세스를 반복하십시오.

(6b) 고유 한 ID 목록을 만들고 arcpy를 통해 지형지 물을 삭제할 수는 있지만 동일한 영역에서 동일하지 않은 두 지형지 물이있을 가능성이 있습니다.

ArcPy를 사용하는 다른 기술

위의 답변을 구성 하면서이 데이터의 여러 작성자가 실제로 중복 된 기능에 대해 동일한 고유 식별자를 사용했을 가능성이 있다고 생각했습니다. 경우 그런 경우가, 당신은 arcpy에서 루프를 통해 중복을 찾을 수 있습니다.

ArcPy를 사용 하여이 작업을 수행하는 방법은 시스템에 부담을 줄 수 있으며 약간의 시간이 걸릴 수 있습니다.

(1) shapefile의 사본을 작성하십시오 (다시의 경우).

(2) 중복을 나타내는 새 열을 추가하십시오. 'y'또는 'n'또는 0 또는 1 또는 어떤 것이 든 작동하는 것.

(3) 고유 식별자를 저장하기 위해 파이썬으로 목록을 만듭니다.

(4) 업데이트 커서 ( arcpy.UpdateCursor('LAYERNAME'))를 실행하십시오 . 각 레코드에 대해 목록에 해당 식별자가 포함되어 있는지 확인하고 열이 있으면 중복으로 표시하십시오.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) 그런 다음 표시된 열과 원하는 것을 비교하거나 수행 할 수 있습니다.

이러한 비교를 수행하는 더 좋은 방법이있을 수 있지만, 두 가지 방법이 효과가 있거나 최소한 시작해야한다고 생각합니다.

편집하다

elrobis 의 주석을 기반으로 최소 경계 사각형을 사용하여 잘못된 피처를 제거 할 가능성을 더욱 줄일 수 있습니다.

ArcMap을 사용하면 데이터 관리에서 최소 경계 지오메트리 도구를 실행할 수 있습니다 . 옵션을 확인한 후 CONVEX_HULL 옵션을 사용하는 것이 가장 좋습니다.

당신이 비교하는 경우 MBG_APodX / Y1 , MBG_APod_X / Y2의 와 함께 필드를 MBG_Orientation 중복, 당신은 중복 된 기능의 좋은 아이디어를 얻을 수 있어야합니다. 위에서 설명한 Summarize 방법을 사용하여 비교 하는 것이 좋습니다 . 경계 사각형에서 정점 (좌표) 중 하나를 선택하여 복제본을 찾습니다. 부수적 인 '일치'가 발생할 수 있지만 다른 정점과 방향을 추가하면 결과 기능이 중복되는 것이 상당히 안전합니다.

나는 그것을 사용하지 않고이 도구의 결과를 확신하지 못하지만 ArcMap에서 요약 통계 도구 를 사용하면 결과 모양 파일을 쉽게 검사 할 수 있습니다 . 내 단일 열 옵션 대신 여러 열을 요약 할 수있는 것처럼 보입니다.

중복되지 않은 기능을 삭제할 가능성에 대한 걱정없이 완전히 자동화 된 방법이 있다고 생각하지 않습니다. 이러한 방법은 수동으로 검토해야하는 기능의 수를 제한하는 데 도움이됩니다.


나는 그것들이 다각형이라고 가정합니다. 그들이 선이라면 길이를 사용할 수 있습니다. X / Y 좌표로 포인트가 가장 쉽습니다.
Branco

2
"동일한 영역 피처"에 대해서도 생각했지만, 의도 치 않은 일치를 만들기 위해 bldg 외곽 설정에 동일한 유형의 모양이 충분히있을 수 있습니다. 나는 기능의 MBR 교차로 사물을 더 세분화 할 확률을 향상시킬 것이라고 생각합니다. 즉, 동일한 영역 (및 동일한 기능 일 수 있음)과 MBR이 교차하는 경우 동일한 기능의 2 세대 일 수 있습니다. 말이 돼?
elrobis

2

공간 자체 결합을 사용하여 SQL에서이를 수행 할 수 있습니다. 어떤 SQL 언어를 사용하고 있는지 언급하지 않으므로이 예제에서는 Postgres / Postgis를 사용하지만 Oracle 또는 SQL Server에 쉽게 적용 할 수 있습니다. geom이라는 열에 지오메트리가 저장된 건물이라는 테이블을 가정합니다.

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

이것은 교차점을 찾을 것입니다. 전체 동등성을 원하면 ST_Intersects를 ST_Equals로 바꾸십시오. 또는 두 가지를 결합하십시오.

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

a.id <b.id는 자체 조인에서 사례의 절반 만 고려하므로 a) 더 빠르며 b) 겹치는 다각형의 절반을 모두 삭제하지 않고 삭제할 수있는 목록을 제공합니다. . 분명히 이것은 여전히 ​​O (n²) 알고리즘이지만 공간 인덱스가 있으면 실제로 훨씬 빠를 것입니다. 이는 사소한 데이터 세트에 대한 총 요구 사항입니다.

겹치는 정의에 맞도록이 부분을 약간 마사지해야 할 수도 있습니다. 잘못 조사 된 이웃 주택을 삭제하고 싶지 않습니다.


shapefile에 고유 한 속성이없는 경우 a.rowid대신 사용할 수 있습니다 a.id. rowidSQLite의 키워드는 데이터 집합의 내부 ID를 제공합니다.
LuWi

1

Topology Checker 플러그인은 올바르게 사용하면 좋은 도구입니다. 여전히 데이터에 대한 기본적인 이해가 있어야하며 수동으로 '수정'해야합니다. 플러그인은 오류라고 생각하는 것을 강조합니다. 그런 다음 각각을 조사하고 귀하와 귀하의 데이터에 대한 적절한 결정을 내리는 것은 귀하의 책임입니다. 레이어에 90 000 개의 항목이 있으면 크리스마스에 집에있을 수 있습니다!

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