한 형상 파일에서 다각형의 비율을 다른 형상의 다각형 내에서


13

나는 이것이 초보자이고, 이것이 명백하고 / 이미 묻고 답변을 받았지만 아무것도 찾을 수 없다면 사과합니다.

나는 두 개의 shapefile을 가지고있다 : 1. 영국에있는 카운티의 행정 경계 계층 LSOA 경계로 알려진 500 개의 작은 영역이있다 . 2. 홍수 영역.

이상적으로는 홍수 구역 내에서 작은 LSOA 구역 중 ≥50 %가 어떤지 알아 내고 500 개의 LSOA 구역 각각에 대해 예 / 아니오 또는 1/0로 끝납니다.

그러나 나는 이것을하는 법을 모른다. 나는 두 개의 shapefile을 결합 할 수 있다고 생각했지만 그 사이에는 공통적 인 속성이 없습니다. 그런 다음 위치별로 속성 결합 기능을 사용할 수 있다고 생각했는데,이 기능을 사용하면 플러드 존에 어떤 LSOA가 있는지 보여 주지만 거의 모든 것입니다 (이미지 2 참조).

나는 이것이 SQL 문제라고 생각하지만 모른다. QGIS를 처음 사용하고 PostgreSQL을 사용한 적이 없습니다.

도움을 주시면 감사하겠습니다. 사랑스러운 사람들이 나를 도와주기 위해 필요한 정보를 제공 할 수 있습니다.

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

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

답변:


12

이것은 QGIS에 포함 된 지오 프로세싱 도구를 사용하는 비교적 간단한 작업입니다.

  1. LSOA 구역의 면적을 계산하십시오.

    • LSOA 계층 속성 테이블을여십시오.
    • 편집 모드를 활성화하십시오.
    • 필드 계산기를 엽니 다.
    • "$ area"표현식을 사용하여 "소수 (실수)"유형의 새 필드를 작성하십시오.
    • 편집 모드를 비활성화합니다 (편집 저장).
  2. 플러드 존 레이어를 단일 멀티 파트 피처로 병합합니다.

    • Vector > Geometry Tools > Singleparts to Multipart.
    • 고유 ID 필드에 대해 "--- 모두 병합 ---"을 선택하십시오.
  3. LSOA 영역 계층과 다중 부분 플러드 영역 계층을 교차시킵니다.

    • Vector > Geoprocessing Tools > Intersect.
    • 입력 계층은 LSOA 영역이고 교차 계층은 플러드 영역입니다.
  4. 결과 계층은 플러드 영역 계층과 겹친 LSOA 영역의 부분 (LSOA 영역 계층의 속성 포함)이됩니다. 플러드 영역 내에서 각 LSOA 영역의 비율을 계산하려면

    • 교차 피쳐의 면적을 계산 한 다음 (1 단계에서와 같이) 그런 다음
    • 원래 (총) 영역을 교차 영역으로 나누어 다른 필드를 추가하십시오. 결과는 0과 1 사이의 10 진수입니다. 100을 곱하면 백분율이 표시됩니다.
  5. 두 계층이 공유하는 고유 ID를 사용하여 원본 LSOA 계층을 교차 계층에 결합하십시오.

  6. 결합 된 레이어를 새 모양 파일로 내 보냅니다.

  7. 복제 된 속성을 삭제하십시오.

vo!

2 단계가 없으면 각 LSOA 기능에 대해 각기 다른 플러드 영역 기능에 대해 개별 기능이 생성됩니다. 각 LSOA 영역에 대한 전체 적용 범위에만 관심이있는 경우에는 원하는 것이 아닐 수도 있습니다. 플러드 / 갯수 / 홍수 플러딩 (및 플러드 존 데이터에서 지원)을 구별하려면 "TYPE"필드를 고유 ID 필드로 지정하여 단일 파트를 다중 파트로 변환 할 수 있습니다.


도와 주셔서 감사합니다! 매우 감사. 그러나 문제가 있습니다. 나는 단계를 따랐다. 3 단계 인 교차 (Intersect)는 완료하는 데 10 시간이 걸렸으며 완료되면 빈 모양 파일이되었습니다. i.imgur.com/QIM6Gtg.png 놓친 것이 있습니까? 프로세스를 완료하고 4 단계를 시도했지만 교차 영역을 계산할 데이터가 없습니다.
KJGarbutt

전에 홍수 층과 교차점을 만드는 데 문제가있었습니다. 기능은 크고 복잡합니다. 과거에 해결 한 방법은 기능을 더 작은 기능으로 나누는 것이므로 공간 인덱스가 더 많은 작업을 수행 할 수 있습니다. 이렇게하려면 플러드 레이어 ( Vector > Research Tools > Vector Grid... Output grid as polygons) 와 동일한 범위의 벡터 그리드를 만든 다음 그리드를 플러드 레이어와 교차시킵니다. 그런 다음 3 단계에서 플러드 레이어 대신 출력을 사용하십시오. 레이어가 비어있는 이유는 충돌했기 때문입니다.
Snorfalorpagus

다시 감사합니다. 이제 유일한 문제는 벡터 그리드를 만들려고 할 때마다 QGIS가 충돌한다는 것입니다. 나는 여기 에서 조언을 따랐 지만 매번 충돌합니다. 매개 변수를 여러 번 변경하고 전체 프로젝트 파일을 열지 않고 플러드 존 모양 파일 만 사용하려고 시도했지만 매번 실패했습니다. 어떤 아이디어? ! 여기에 스크린 샷 .
KJGarbutt

지정한 X 및 Y 매개 변수가 너무 작습니다. 1000 x 1000과 같은 것을 시도하십시오.이 작업을 여러 번 수행 할 수도 있습니다. 예를 들어 먼저 5000 x 5000을 수행하고 출력을 사용하여 500 x 500을 생성하십시오. 여기에서 관련 답변을 참조하십시오. gis.stackexchange.com/a/66319/12420
Snorfalorpagus

나는 당신의 도움으로 거의 그것을 깨뜨 렸습니다! 그러나 원본 LSOA 레이어를 교차 레이어와 결합하면 많은 데이터가 손실됩니다. 생성 된 벡터 그리드 사각형 중 일부는 동일한 LSOA 영역에 속하므로 각각 동일한 LSOA 코드가 있기 때문입니다. 따라서 가입 할 때 각 LSOA 영역에 대해 2 % 이상의 수치로 끝나고 그 중 하나만 얻는 것 같습니다. 각 벡터 그리드 사각형의 각 백분율을 동일한 LSOA로 합산하는 방법이 있습니까?
KJGarbutt

6

공간 및 일부 공간 SQL 함수를 사용할 수 있습니다.

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1

3

이것은 제출 된 답변보다 훨씬 쉽게 할 수있는 것 같습니다. 간단한 파이썬 스크립트를 개인적으로 사용합니다.

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

이것은 각 경계 레이어의 경계 상자와 교차하는 플러드 다각형 만 평가하므로 실행 속도가 매우 빨라야하며 완전히 새로운 레이어를 만들고 이전 값을 복사하는 복잡한 작업 대신 기존 레이어의 필드 하나만 업데이트합니다. 그런 다음 삭제)


2

3 단계에서 "교차"방법을 사용하여 Snorfalorpagus의 지시를 따르는 KJ와 같은 문제가있었습니다.

교차 대신 QGIS에서 "Clip"방법을 사용하는 것을 제외하고는 동일한 단계를 따르려고했습니다. 예를 들어, 남은 부분은 홍수 지역에 포함되지 않은 부분 일 것입니다. 이것은 어떤 이유로 작동하는 것처럼 보였고 이전 단계의 "Area"필드 계산과 각 다각형의 나머지 부분에 대한 새로운 "Area"계산을 사용하여 그렇지 않은 각 영역의 %를 계산할 수있었습니다 다른 다각형 레이어로 덮여 있습니다.

그것은 기술적으로 당신이 요구 한 것과 반대입니다. 그러나 거기 에서 범람 지역에 포함되는 것을 얻으려면 1에서 각 값을 빼는 것 입니다 .

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