QGIS를 사용하여 인접 다각형의 값을 합산합니까?


11

다음과 같은 문제에 도움이되기를 바랍니다. 벡터 (폴리곤) 레이어가 있습니다. 모든 다각형에 대해 인접한 모든 다각형의 특정 필드 값을 합하는 속성을 레이어에 추가하고 싶습니다.

좀 더 구체적인 예를 들자면 : 인구에 대한 정보를 포함하는 다각형 지구가 있습니다. 이제는 모든 지구마다 이웃 지구에 얼마나 많은 사람들이 살고 있는지 알고 싶습니다.

300 개가 넘는 지구가 있으므로 각 지구마다 직접이 작업을 수행 할 수 없습니다.

QGIS에서이를보다 효율적으로 수행 할 수있는 방법이 있습니까?

답변:


8

이런 종류의 일은 Spatialite와 SQL로 가장 잘 수행됩니다.

먼저 QGIS와 함께 제공되는 DBManager 플러그인을 사용하여 Spatialite 데이터베이스에 데이터를로드해야합니다. 가져 오기를 클릭하십시오 Layer/File button.

데이터를 데이터베이스에 넣은 후 SQL버튼을 사용하여 다음 쿼리를 실행할 수 있습니다 . 데이터에 맞게 열 및 테이블 이름을 변경하기 만하면됩니다.

SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours, 
        a1.pop, 
        a1.name, 
        a1.id, 
        a1.geomm FROM areas a1
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id 
                            AND intersects(a2.geomm, a1.geomm)
GROUP BY a1.id

검색어 도구에 고유 한 ID 열 (id) 및 기하학 열 (geomm)을 지정한 다음로드를 클릭하십시오.

물론 레이블을 붙이면 이와 같은 것을 가져야합니다.

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

쿼리 분석

다음을 사용하여 레이어를 자체에 결합합니다.

LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id 
                            AND intersects(a2.geomm, a1.geomm)

지오메트리가 교차하는 위치와 ID가 동일하지 않은 경우에만, 그렇지 않으면 각 다각형에 대해 동일한 레코드를 두 번 얻게됩니다. 우리는 또한 LEFT OUTER JOIN조인하지 않은 기록, 즉 이웃이없는 기록을 포함시키기 위해를 사용하고 있습니다.

선택 부분에서 :

SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours, 
            a1.pop, 
            a1.name, 
            a1.id, 
            a1.geomm

우리는 (이웃 없음)을 다른 곳 으로 COALESCE변환하기 위해 사용 하고 있습니다.NULLS0NULL

그런 다음 GROUP BY a1.id각 다각형에 대해 단일 레코드를 얻습니다.


네이선, 귀하의 답변과 유용한 설명에 감사드립니다. 그것은 전체 공간과 SQL 초보자에게도 효과적이었습니다!
Alex

+1 "쿼리 분석"섹션은 훌륭하게 수행되고 매우 유용합니다.
whuber

@Alex 좋은 물건. 수락 버튼을 선택하는 것을 잊지 마십시오.
Nathan W

2

이를 수행하는 또 다른 방법은 GRASS (GRASS 도구 상자 사용 또는 GRASS에서 직접)입니다. 아래 예에서 레이어 EA는 국가가 포함 된 벡터 레이어이며 속성 테이블에서 국가 별 인구가 포함 된 열입니다. 자세한 설명 은 이 게시물 을 참조하십시오 .

1 단계) 속성 테이블이 경계에 연결된 새 레이어를 생성합니다. 다각형의 ID가 각각 왼쪽과 오른쪽의 경계선과 경계를 이루는 두 개의 열로 구성됩니다.

v.category EA out=EAc layer=2 type=boundary option=add
v.db.addtable EAc layer=2 col="left integer,right integer"
v.to.db EAc option=sides col=left,right layer=2 type=boundary

2 단계) SQL을 실행하여 국가 ID를 모든 인접 국가의 인구 합계와 연결하는 테이블을 작성하십시오.

db.execute sql="CREATE TABLE tmp AS
SELECT ID, sum(pop) as population FROM (
SELECT DISTINCT EAc_2.left as ID, EAc.pop as pop
FROM EAc_2
LEFT JOIN EAc ON EAc_2.right = EAc.cat
WHERE EAc_2.left > -1 AND EAc_2.right > -1
UNION
SELECT DISTINCT EAc_2.right as ID, EAc.pop as pop
FROM EAc_2
LEFT JOIN EAc ON EAc_2.left = EAc.cat
WHERE EAc_2.left > -1 AND EAc_2.right > -1
) GROUP BY ID"

3 단계) 새 테이블 tmp를 원래 속성 테이블과 결합하십시오.

v.db.join map=EA@ConsStat layer=1 column=cat otable=tmp ocolumn=ID

벡터 레이어의 속성 테이블에는 이제 모든 인접 국가의 인구가 합산 된 추가 열이 있어야합니다.


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