파이썬을 사용하여 한 벡터에서 다른 벡터와 90 % 이상 겹치는 다각형을 추출하는 방법을 알아 내려고합니다. 그런 다음 해당 다각형 만 표시하는 벡터 / 맵을 갖고 싶습니다. 예제 사진은 레이어를 보여줍니다. > 90 % 빨강 인 모든 회색 다각형을 원합니다.
파이썬 (또는 유사하게 자동화 된 방법)을 통해이 작업을 모두 수행해야합니다. 같은 방식으로 처리 할 수있는 ~ 1000 개의지도가 있습니다.
파이썬을 사용하여 한 벡터에서 다른 벡터와 90 % 이상 겹치는 다각형을 추출하는 방법을 알아 내려고합니다. 그런 다음 해당 다각형 만 표시하는 벡터 / 맵을 갖고 싶습니다. 예제 사진은 레이어를 보여줍니다. > 90 % 빨강 인 모든 회색 다각형을 원합니다.
파이썬 (또는 유사하게 자동화 된 방법)을 통해이 작업을 모두 수행해야합니다. 같은 방식으로 처리 할 수있는 ~ 1000 개의지도가 있습니다.
답변:
다음 코드는 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
다음 이미지에서 생성 된 메모리 레이어 (녹색 기능)를 볼 수 있습니다. 예상대로였습니다.
파이썬이 필요없는 솔루션입니다.
다음과 같은 쿼리로 새 가상 계층을 추가하십시오.
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 개의 다른 작은 다각형이 있음). 이로 인해 쿼리 실행이 매우 느려집니다 (교차 기능) 두 레이어에서 각 기능 쌍마다 하나의 기능을 생성합니다).
Severity 및 Basins800 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 상호 작용이 있기 때문에 결과를 디버깅하지 않습니다. 그러나 코드는 유망 해 보입니다.