QGIS를 사용하여 다른 벡터 다각형 레이어와 90 % 이상 겹치는 다각형을 프로그래밍 방식으로 찾으십니까?


9

레이어 예

파이썬을 사용하여 한 벡터에서 다른 벡터와 90 % 이상 겹치는 다각형을 추출하는 방법을 알아 내려고합니다. 그런 다음 해당 다각형 만 표시하는 벡터 / 맵을 갖고 싶습니다. 예제 사진은 레이어를 보여줍니다. > 90 % 빨강 인 모든 회색 다각형을 원합니다.

파이썬 (또는 유사하게 자동화 된 방법)을 통해이 작업을 모두 수행해야합니다. 같은 방식으로 처리 할 수있는 ~ 1000 개의지도가 있습니다.


오버레이 'union'( 일부 기본 사항 은 infogeoblog.wordpress.com/2013/01/08/geo-processing-in-qgis 참조)을 수행하려는 경우 각 원래 다각형에 대해 'in'통계 및 'out'통계를 계산하십시오. gis.stackexchange.com/questions/43037/... 오버레이 %의 ... 힌트를 결정하기 위해 : 당신이 면적 측정이 필요 gis.stackexchange.com/questions/23355/...
마이클 스팀슨

팁 주셔서 감사합니다. 그것은 내가 방금 시도했던 것과 같은 접근법입니다. 파이썬 콘솔을 통해 쉽게 연합을 할 수 있습니다. 영역 속성 값에 이미 추가되었습니다. 확실하지 않은 다음 단계입니다. 파이썬을 사용하여 '90'이상의 다각형을 식별 / 선택 / 클립 할 수 있도록 'in'및 'out'통계를 계산하는 방법은 무엇입니까?
dnormous

파이썬이 없으면 가능하다고 생각합니다. 절대적으로 파이썬이 필요합니까 아니면 가상 레이어가있는 솔루션이 좋습니다?
Pierma

'in'영역에는 두 다각형의 속성이 있고 'out'영역에는 한 다각형 세트의 속성 만 있습니다. 두 영역 통계 집합을 가져 와서 원래 다각형에 다시 결합하고 'in', 'out'및 coverage에 대한 필드를 추가하고, 영역 합계에서 'in'및 'out'의 값을 계산 한 다음 'in'을 원래 영역 (또는 'in'+ 'out')으로 백분율을 계산합니다.
Michael Stimson 2:30에

1
Pierma-다각형을 찾으려면 자동 방법이 필요합니다.
dnormous

답변:


3

다음 코드는 QGIS의 Python 콘솔에서 작동합니다. 빨강 영역에 의해> 90 % 겹치는 다각형을 가진 메모리 레이어를 생성합니다.

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for polygon_intersects
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for xwRcl
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

for i, feat1 in enumerate(feats_lyr1):
    area1 = 0
    area2 = 0
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area = feat1.geometry().intersection(feat2.geometry()).area()
            print i, j, area, feat2.attribute('class')
            if feat2.attribute('class') == 1:
                area1 += area
            else:
                area2 += area
    crit = area1/(area1 + area2)
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

이 두 벡터 레이어로 코드를 시험해 보았습니다.

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

QGIS의 Python 콘솔에서 코드를 실행 한 후 결과를 확증하기 위해, 인덱스 i, 관련 피쳐의 j, 교차 영역, polygons_intersects 의 필드 속성 (빨간색 영역은 1, 회색 영역은 2) 및 중복 기준이 인쇄되었습니다. .

0 0 9454207.56892 1
0 1 17429206.7906 2
0 2 10326705.2376 2
0 4 40775341.6814 1
0 5 26342803.0964 2
0 7 11875753.3216 2
0.432253120382
1 6 1198411.02558 2
1 7 1545489.96614 2
1 10 27511427.9909 1
0.90930850584
2 7 750262.940888 2
2 8 12012343.5859 1
0.941213972294
3 6 23321277.5158 2
0.0

다음 이미지에서 생성 된 메모리 레이어 (녹색 기능)를 볼 수 있습니다. 예상대로였습니다.

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


6

파이썬이 필요없는 솔루션입니다.

다음과 같은 쿼리로 새 가상 계층을 추가하십시오.

WITH r AS (
SELECT 
    Basins800.rowid AS idGray, 
    area(Basins800.geometry) AS areaGray, 
    area(Intersection(Basins800.geometry, Severity.geometry)) AS aeraInter, 
    Basins800.geometry AS geomGray 
  FROM Basins800, Severity
)

SELECT *, areaInterSum/areaGray  AS overlap , geomGray 
    FROM (
        SELECT 
           idGray, 
           areaGray, 
           sum(areaInter) AS areaInterSum, 
           geomGray 
        FROM r 
        GROUP BY idGray) 
     WHERE areaInterSum/areaGray > 0.9

로 :

  • 회색 다각형으로 필터링하려는 레이어로 Basins800

  • 심각도 : 빨간색 레이어가 겹칩니다.

결과적으로 모든 회색 plolygon이> 90 % 이상 빨간색 다각형으로 겹치고 새 필드에 겹침 백분율이 포함 된 새 레이어가됩니다.

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

이것이 효과가 있기를 바랍니다. 필요한 경우 쿼리에 대한 자세한 내용을 추가 할 수 있습니다.

참고 : 데이터에는 매우 작은 다각형이 포함되어 있습니다 (래스터 처리에서 발생하고 래스터 픽셀에 해당함 (그림에서 4 개의 다각형을 볼 수 있지만 25 개의 다른 작은 다각형이 있음). 이로 인해 쿼리 실행이 매우 느려집니다 (교차 기능) 두 레이어에서 각 기능 쌍마다 하나의 기능을 생성합니다).


'가상 레이어 생성'버튼을 통해 쿼리를 실행할 때 오류가 발생합니다. "CREATE TEMP VIEW _tview AS WITH r AS의 쿼리 실행 오류 (".... 여기 코드의 나머지 부분 ... ":"1- "WITH"근처 : 구문 오류 "QGIS에 익숙하지 않습니다. 도움을 주셔서 감사합니다!
dnormous

다음은 shapefile을 다운로드 할 수있는 링크입니다. link
dnormous

죄송합니다, 회색과 회색 사이에 잘못된 사본이 있습니다 (근접적인 영어로 죄송합니다). 쿼리를 편집했습니다. 지금 작동합니다. 왜 프로 가마로 레이어를 만들고 싶습니까? 가상 레이어의 장점은 비파괴 적이며 데이터 (회색 또는 빨간색 다각형)를 편집하면 가상 레이어가 자동으로 업데이트된다는 것입니다.
Pierma

이것은 단지 하나의 작은 프로세스입니다. 이 맵을 ~ 1000 개 가지고 있으므로 프로세스를 자동화하면 큰 도움이됩니다.
dnormous

여전히 같은 오류가 발생합니다. ">"1- "WITH"근처 : 구문 오류 ". grayLayer 및 redLayer에 각 레이어의 로컬 이름을 연결했습니다. 사용해야하는 로컬 이름입니까? 예 : 나는 "Basins_800.geometry"와 같은 코드 그래서 회색 층은 "Basins_800"으로 표시됩니다
dnormous

2

SeverityBasins800 shapefile에 대한 링크 를 확인한 후 필요한 지오 프로세스를 이해할 수있었습니다. 코드를 다음과 같이 수정했습니다.

QGIS를 사용하여 다른 벡터 다각형 레이어와 90 % 이상 겹치는 다각형을 프로그래밍 방식으로 찾으십니까?

이것을 얻기위한 :

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for Severity
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for Basins800
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

print "processing..."

for i, feat1 in enumerate(feats_lyr1):
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area1 = feat1.geometry().intersection(feat2.geometry()).area()
            area2 = feat1.geometry().area()
            print i, j, area1, area2
    crit = area1/area2
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

QGIS의 Python 콘솔에서이 shapefile을 사용하여 코드를 실행 한 후 몇 분 안에 Pierma 와 비슷한 결과를 얻었습니다 . 메모리 층은 31 개의 특징 (29 개의 폴리곤이 다른 것)을 가졌다.

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

기능에 대해 1901 * 3528 = 6706728 상호 작용이 있기 때문에 결과를 디버깅하지 않습니다. 그러나 코드는 유망 해 보입니다.

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