벡터 데이터를 분석해서 서로 다른 피처들이 공간 안에서 어떻게 상호작용하는지 밝힐 수 있습니다. GIS에는 서로 다른 많은 분석 관련 기능들이 있는데, 모든 기능을 다 살펴보지는 않을 것입니다. 그보다는 문제를 제시하고 QGIS가 제공하는 도구들을 써서 그 문제를 해결하는 방식을 사용할 것입니다.
이 강의의 목표: 문제를 제시하고, 분석 도구를 써서 해결하기
시작하기 전 GIS 문제를 해결하는 데 사용할 수 있는 처리 과정을 간략히 살펴보는 것이 좋을 것입니다. 다음과 같은 처리 과정을 거칩니다.
문제를 정의
데이터 획득
문제를 분석
결과를 표출
해결해야 할 문제를 결정하는 것으로 처리 과정을 시작합시다. 예를 들어 여러분이 부동산 업자인데 다음 기준을 가진 고객을 위해 Swellendam 에 있는 거주지를 찾고 있다고 해봅시다.
Swellendam 에 있어야 한다.
학교와 적정한 거리 (1km 정도) 안에 있어야 한다.
면적은 100평방미터 이상이어야 한다.
주 도로에서 50미터 이상 떨어져서는 안 된다.
500미터 반경 안에 식당이 있어야 한다.
이 문제들을 해결하려면 다음 데이터들이 필요합니다.
지역 내에 있는 거주지(건물)
도시 내부 및 주변의 도로
학교와 식당의 위치
건물 면적
이 모든 데이터들을 OpenStreetMap을 통해 찾을 수 있고, 이 교재를 공부하면서 사용해온 데이터셋도 이번 강의에 사용할 수 있을 것입니다. 그러나 완전한 데이터를 갖추고 있다고 확신하기 위해, QGIS에 내장된 OSM 다운로드 도구로 OSM에서 데이터를 다시 다운로드하겠습니다.
주석
OSM 다운로드는 일관된 데이터 항목을 가지고 있지만, 커버리지 및 세부 내용은 다를 수 있습니다. 예를 들어 여러분이 선택한 지역에 식당 정보가 없다면, 다른 지역을 선택해야 할 수도 있습니다.
새 QGIS 프로젝트를 시작하십시오.
exercise_data 디렉터리에 osm_data.osm 이라는 파일명으로 데이터를 저장하십시오.
osm_data.osm 파일을 선택하고 Open 을 클릭합니다.
이때 나타나는 대화 창에서 other_relations 와 multilinestrings 레이어를 제외한 모든 레이어를 선택하십시오.
여러분의 맵에 OSM 데이터를 개별 레이어로 불러들일 것입니다.
OSM에서 방금 다운로드한 데이터는 이전 강의에서 배운 바와 같이 위도와 경도 좌표를 사용하는 WGS84 지리좌표계를 사용합니다. 그런데 길이를 미터 단위로 계산하려면 투영좌표계로 작업해야 한다는 사실도 배웠습니다. 사용자의 프로젝트의 좌표계를 사용자 데이터에 적합한 CRS 로 설정해봅시다. Swellendam 에서는 다음과 같이 WGS 84 / UTM zone 34S 를 선택하십시오.
Project Properties 대화 창을 열고, CRS 를 선택한 다음 목록에서 WGS 84 / UTM zone 34S 를 찾습니다.
OK 를 클릭합니다.
이제 OSM 데이터셋에서 필요한 정보를 추출해야 합니다. 이 지역에 있는 모든 집, 학교, 식당, 도로를 나타내는 레이어들이 필요합니다. multipolygons 레이어가 이 정보를 담고 있으며, 해당 레이어의 Attribute Table 에 있는 정보를 이용해서 추출할 수 있습니다. 먼저 schools 레이어부터 시작해봅시다.
Layers list 에 있는 multipolygons 레이어를 오른쪽 클릭해서 Layer Properties 를 여십시오.
General 메뉴를 선택합니다.
Feature subset 아래에 있는 [Query Builder] 버튼을 클릭해서 Query builder 대화 창을 엽니다.
이 대화 창의 왼쪽에 있는 Fields 목록에서 amenity 항목이 보일 때까지 스크롤하십시오.
해당 항목을 한 번 클릭합니다.
Values 목록 아래에 있는 All 버튼을 클릭합니다.
이제 amenity 값이 school 인 폴리곤들만 보이도록 QGIS에 명령해야 합니다.
Fields 목록의 amenity 항목을 더블클릭합니다.
다음 Provider specific filter expression 항목이 어떻게 변하는지 관찰해보십시오.
"amenity" 라는 텍스트가 나타났습니다. 이제 쿼리를 완성해봅시다.
Operators 아래에 있는 = 버튼을 클릭하십시오.
Values 목록의 school 값을 더블클릭합니다.
OK 를 두 번 클릭합니다.
이제 사용자 지역에 있는 학교만 보이도록 OSM의 multipolygon 레이어를 필터링할 것입니다. 그러면 이제,
필터링된 OSM 레이어를 schools 이라는 명칭으로 바꾼 다음 osm_data.osm 파일에서 multipolygons 레이어를 다시 불러들이거나, 아니면
필터링된 레이어를 복제하고 복사본의 명칭을 바꾼 다음 Query Builder 의 쿼리 내용을 지우고 새 쿼리를 생성할 수도 있습니다.
앞에서 설명한 기술을 써서, Query Builder 도구를 이용, OSM에서 나머지 데이터를 추출해서 다음과 같은 레이어들을 생성하십시오.
roads (OSM의 lines 레이어에서)
restaurants (OSM의 multipolygons 레이어에서)
houses (OSM의 multipolygons 레이어에서)
이전 강의에서 생성했던 roads.shp 레이어를 다시 사용할 수도 있습니다.
사용자 맵을 exercise_data 디렉터리 아래에 analysis.qgs 라는 파일명으로 저장합니다. (다음 강의에서 이 맵을 사용할 것입니다.)
사용자 OS의 파일관리자에서 exercise_data 디렉터리 아래 새 폴더를 생성하고 residential_development 라고 명명합니다. 분석 기능의 결과물인 데이터셋을 이 폴더에 저장할 것입니다.
OSM 데이터셋의 도로 가운데 일부는 unclassified, tracks, path 그리고 footway 로 분류돼 있습니다. 여러분의 도로 데이터셋에서 이런 도로들을 제외해야 합니다.
roads 레이어에서 Query Builder 를 열고 Clear 를 클릭한 다음, 다음 쿼리를 작성합니다.
"highway" != 'NULL' AND "highway" != 'unclassified' AND "highway" != 'track' AND "highway" != 'path' AND "highway" != 'footway'
여러분은 값을 더블클릭하고 버튼들을 클릭해서 쿼리를 작성할 수도 있고, 앞의 텍스트를 복사 & 붙여넣기할 수도 있습니다.
이제 여러분의 맵에서 도로 상당수가 줄어들 것입니다.
레이어 안에서 거리를 측정할 것이기 때문에, 레이어의 CRS를 변경해야 합니다. 그렇게 하려면, 각 레이어를 차례대로 선택해서 새 CRS를 사용하는 새 shapefile로 레이어를 저장한 다음 새 레이어를 맵에 불러들여야 합니다.
주석
이 예제에서는 WGS 84 / UTM zone 34S CRS를 사용할 것이지만, 여러분이 다른 지역을 선택했다면 해당 지역에 더 적합한 UTM CRS를 사용할 수도 있습니다.
Layers 패널에서 roads 레이어를 오른쪽 클릭하십시오.
Save as... 를 클릭합니다.
Save Vector As 대화 창을 다음과 같이 설정한 다음 (Add saved file to map 을 선택했는지 확인하고) OK 를 클릭합니다.
새 shapefile이 생성되고, 해당 레이어가 사용자 맵에 추가됩니다.
주석
Enable ‘on the fly’ CRS transformation 또는 Automatically enable ‘on the fly’ reprojection if layers have different CRS 설정을 활성화하지 않았다면 (이전 강의 참조) 방금 맵에 추가된 새 레이어가 보이지 않을 수도 있습니다. 이 경우, 레이어를 오른쪽 클릭한 다음 Zoom to layer extent 를 클릭해서 해당 레이어로 맵이 확대/축소되도록 하거나, 또는 앞에서 언급한 ‘실시간’ 옵션을 활성화할 수 있습니다.
기존 roads 레이어를 제거하십시오.
각 레이어에 대해 이 과정을 반복하십시오. 새 shapefile을 생성하고, 명칭에 “_34S”가 붙은 레이어를 추가한 다음 기존 레이어를 제거합니다.
각 레이어에 대해 이 과정을 완료한 다음 아무 레이어나 오른쪽 클릭하고 Zoom to layer extent 를 클릭해서 관심지역으로 맵을 이동시킵니다.
이제 OSM 데이터에 UTM 투영체를 적용시켰으니, 계산을 시작할 수 있습니다.
QGIS는 어떤 벡터 오브젝트부터의 거리도 계산할 수 있습니다.
작업할 동안 맵을 단순화하도록 roads_34S 와 houses_34S 레이어만 보이도록 하십시오.
메뉴에서 Vector ‣ Geoprocessing Tools ‣ Buffer(s) 도구를 클릭합니다.
새 대화 창이 나타날 것입니다.
다음과 같이 설정하십시오.
우리의 입력 데이터가 미터가 기본 측정 단위인 투영좌표계를 사용하기 때문에, Buffer distance 의 단위도 미터가 됩니다. 이 때문에 재투영된 데이터를 사용해야 하는 것입니다.
설정이 적용된 레이어를 roads_buffer_50m.shp 라는 파일명으로 exercise_data/residential_development/ 디렉터리에 저장하십시오.
OK 를 클릭하면 버퍼가 생성될 것입니다.
“TOC에 새 레이어를 추가합니까?”라고 물어볼 경우 Yes 를 클릭합니다. (“TOC”는 “Table of Contents”의 약자로, Layers list 를 의미합니다.)
Buffer(s) 대화 창을 닫습니다.
이제 여러분의 맵이 다음처럼 보일 것입니다.
새 레이어가 Layers 목록의 최상단에 있다면, 맵 상의 다른 레이어를 가리게 되지만, 여러분 지역 안에서 도로로부터 50m 안에 있는 모든 구역을 보여줍니다.
그러나 버퍼 안에서 모든 개별 도로에 대응해서 뚜렷하게 구분되는 구역이 보일 것입니다. 이 문제를 해결하려면 레이어를 제거한 다음, 다음과 같은 설정을 이용해서 버퍼를 재생성하십시오.
이번에는 Dissolve buffer results 체크박스를 체크했다는 점을 알아차리셨습니까?
설정이 적용된 레이어를 이전과 마찬가지로 저장하십시오. (이전 파일을 덮어쓸 것이냐는 질문에 Yes 를 클릭하십시오.)
OK 를 클릭하고, 다시 Buffer(s) 대화 창을 닫습니다.
새 레이어를 Layers list 에 추가하면, 다음처럼 보일 것입니다.
이제 필요 없는 부분들이 사라졌습니다.
앞 단계와 동일한 방법으로 학교를 중심으로 하는 버퍼를 생성하십시오.
반경이 1 km 여야 하고, schools_buffer_1km.shp 라는 파일명으로 이전과 동일한 디렉터리에 저장하십시오.
이제 도로에서 50m 이내 그리고 학교에서 (도로가 아니라 직선 거리로) 1km 이내에 있는 지역을 볼 수 있습니다. 그러나 당연히, 이 두 가지 기준을 모두 만족시키는 구역만 필요합니다. 이 구역을 구하려면 Intersect 도구를 사용해야 합니다. 메뉴에서 Vector ‣ Geoprocessing Tools ‣ Intersect 를 선택한 다음, 다음과 같이 설정합니다.
입력 레이어 두 개는 버퍼 두 개입니다. 저장 위치는 이전과 같습니다. 파일명은 road_school_buffers_intersect.shp 로 하십시오. 이렇게 설정을 마친 다음, OK 를 클릭하고 새 레이어를 Layers list 에 추가합니다.
다음 이미지에서 두 가지 거리 기준을 모두 만족시키는 파란색 구역을 볼 수 있습니다!
이제 두 버퍼 레이어를 제거하고 겹치는 구역만 보여주는 레이어만 남겨도 됩니다. 원래 그 레이어만을 원했기 때문입니다.
이제 건물들과 겹치는 구역을 얻었습니다. 다음 단계는 해당 구역 안에 있는 건물들을 선택하는 것입니다.
메뉴에서 Vector ‣ Research Tools ‣ Select by location 항목을 클릭하십시오. 다음 대화 창이 나타날 것입니다.
다음과 같이 설정하십시오.
OK 를 클릭한 다음, Close 를 클릭합니다.
아마도 바뀐 점이 거의 없다고 느낄지도 모르겠습니다. 그렇다면 레이어 목록 하단에 있는 school_roads_intersect 레이어를 선택해서 줌인해보십시오.
우리의 기준을 만족하는 건물들이 선택되어 노란색으로 하이라이트되었습니다. 기준을 만족시키지 못 하는 건물들은 녹색으로 보입니다. 이제 선택된 건물들을 새 레이어로 저장할 수 있습니다.
Layers list 에서 houses_34S 레이어를 오른쪽 클릭합니다.
Save Selection As... 를 선택하십시오.
다음과 같이 대화 창을 설정하십시오.
파일명은 well_located_houses.shp 으로 하십시오.
OK 를 클릭합니다.
이제 선택된 건물들을 개별 레이어로 저장했으니 houses_34S 레이어를 제거해도 됩니다.
이제 학교에서 1km, 도로에서 50m 이내에 있는 모든 건물들을 보여주는 레이어가 생성됐습니다. 다음으로 이 레이어에서 식당으로부터 500m 이내에 있는 건물들만 추려내야 합니다.
앞에서 설명한 과정을 이용, well_located_houses 레이어를 한 번 더 필터링해서 식당에서 500m 이내에 있는 건물만을 보여주는 houses_restaurants_500m 라는 새 레이어를 생성하십시오.
어떤 건물이 올바른 (100평방미터 이상) 면적인지 보려면 먼저 건물들의 면적을 계산해야 합니다.
houses_restaurants_500m 레이어의 속성 테이블을 여십시오.
편집 모드로 들어가서 항목 계산기를 실행합니다.
다음과 같이 설정하십시오.
목록에 AREA 가 없다면, 이 모듈의 이전 강의에서 했던 것처럼 새 항목을 생성해보십시오.
OK 를 클릭합니다.
속성 테이블의 오른쪽으로 스크롤하면, 사용자의 AREA 항목에 houses_restaurants_500m 레이어에 있는 모든 건물들의 면적이 미터 단위로 담겨 있을 것입니다.
편집 모드 버튼을 한 번 더 클릭해서 편집을 끝내고, 편집 내용을 저장하십시오.
이전 단계에서처럼 다음과 같은 쿼리를 작성하십시오.
OK 를 클릭합니다. 이제 여러분의 맵에는 면적 100평방미터 이상이라는 기준을 만족시키는 건물들만 보일 것입니다.
이전 단계와 마찬가지로 이 해답을 레이어로 저장하십시오. 이전과 동일한 디렉터리에 solution.shp 라는 파일명으로 저장합니다.
QGIS 벡터 분석 도구와 함께 GIS 문제 해결 접근법을 이용하면, 복합적인 기준을 가진 문제를 쉽고 빠르게 해결할 수 있습니다.
다음 강의에서는 한 지점에서 다른 지점까지의 최단 거리를 도로를 따라 계산하는 방법을 배워보겠습니다.