답변:
이런 종류의 일은 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
변환하기 위해 사용 하고 있습니다.NULLS
0
NULL
그런 다음 GROUP BY a1.id
각 다각형에 대해 단일 레코드를 얻습니다.
이를 수행하는 또 다른 방법은 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
벡터 레이어의 속성 테이블에는 이제 모든 인접 국가의 인구가 합산 된 추가 열이 있어야합니다.
@Nathan의 훌륭한 답변 . 나는 pyqgis를 사용하여 매끄럽게 시도했습니다. 이 게시물 을 확인 하여 scirpt를 다운로드하고 QGIS에서 실행하십시오. 이 방법의 장점은 속성 테이블의 일부로 결과를 얻는다는 것입니다.