가장 가까운 기-종점 매트릭스 위치 (QGIS3)

‘basic_network_analysis`의 예제에서, 2 점사이에 가장 짧은 경로의 네트워크를 만들고 계산하는것을 알아보았습니다. 이에 다양한 방법의 네트워크-기반 분석을 적용할 수 있습니다. 그 중에 하나가 기-종점 매트릭스 또는 OD 매트릭스**입니다. 기존에 주어진 점들과 다른 도착점들로, 각 기-종점 유형의 가장 짧은 노선을 찾을 수 있으며 여행 거리/시간 또한 측정할 수 있습니다. 이러한 분석은 어떤 점을 기점으로 근처의 시설 위치를 찾아내는 데 유용합니다. 예를 들어, 수화물 회사에서 그들의 고객에게 물품 배송시 이 분석방법을 통해 최적의 경로를 찾는데 유용합니다. **QGIS 네트워크 분석 도구상자(QNEAT3) 플러그인의 거리 매트릭스 알고리즘을 이용하여 각 지점에서 가장 가까운 의료시설을 찾아보도록 하겠습니다.

주석

이 예제에서는 어떻게 개인의 네트워크 데이터가 기-종점 매트릭스와 계산을 하는지 가르쳐 줄 것입니다. 개인 네트워크 데이터를 보유하고 있지 않다면, **ORS 도구 플러그인**과 ‘ORS 도구 –> 매트릭스 –> 레이어의 매트릭스’ 오픈 스트리트 맵을 사용하여 비슷한 분석을 할 수 있습니다. Openrouteservice를 이용한 서비스 영역 분석(QGIS3) 이곳에서 ORS 도구플러그인을 어떻게 사용하는지 배우세요.

개요

워싱턴 DC의 레이어 2개를 사용합니다 - 점 데이터는 주소 정보이고 다른 점 데이터는 정신의료시설을 표시하는 정보입니다 - 각 지점에서 가장 짧은 노선으로 갈 수 있는 최적 경로를 찾아봅시다.

이 예제에서 필요한 다른 기술

  • 점 레이어에서 무작위로 샘플 추출하기

  • QGIS 레이어에서 SQL 쿼리를 이용하여 가상레이어 사용하기

  • Pyqgis 스크립트를 이용하여 파이썬 콘솔 편집 사용하기

데이터 획득

Open Data Catalog. 이곳에서 콜롬비아 정부가 무료로 제공하는 다양한 데이터를 만나보실 수 있습니다.

다음의 쉐이프파일을 내려받기해주세요.

아래 링크에서 이번예제에 사용되는 샘플파일을 쉽게 내려받을 수 있습니다:

Street_Centerlines.zip

Address_Points.zip

Adult_Mental_Health_Providers.zip

데이터 출처: [DCOPENDATA]

설정

플러그인 –> 플러르인 관리 및 설치에 들어갑니다. QNEAT3 플러그인을 찾아서 설치합니다. 그러고 닫기를 누릅니다.

../../_images/setup12.png

과정

  1. 내려받은 ``Street_Centerlines.zip``을 브라우즈 창에 끌어옵니다. 알집을 풀어준후 ``Street_Centerlines.shp``을 캔버스에 끌어주세요. 비슷하게, ``Adult_Mental_Health_Providers.zip``파일을 열어서, 확장한 다음, ``Adult_Mental_Health_Providers.shp``를 캔버스에 끌어주세요.

../../_images/190.png
  1. 그 다음, ``Address_Points.zip``파일을, 확장하여 ``Address_Points.shp``을 추가합니다. 도시 주변으로 많은 수의 점데이터를 볼 수 있습니다. 각 개별 점은 주소정보를 담고 있습니다. 기존의 점 정보에서 무작위로 1개의 점을 추출하지 않습니다. 이 기술은 층위 추출법입니다. 공간처리 –> 툴박스에 갑니다.

../../_images/247.png
  1. 공간 처리 툴박스에서 ‘벡터선택’ ‣ ‘하위 집합 내 랜덤 추출’ 알고리즘을 선택하십시오.

../../_images/330.png
  1. 입력레이어에 ``Address_Points``를 선택하십시오. 각 주소 지점에는 주소와 관련된 와드 번호가있는``WARD_2012 ‘’라는 속성이 있습니다. 와드 당 1 포인트만 원하므로 ``WARD_2012 ‘’을 `ID 필드`로 사용합니다. ‘선택한 객체의 개수/백분율’을 “1”으로 설정하십시오.

../../_images/416.png
  1. 레이어 패널에``Extracted (random stratified)``라는 새레이어가 추가됩니다.

../../_images/516.png
  1. Address_Points ''레이어를 끕니다. ``Extracted (random stratified) 레이어를 마우스 오른쪽 버튼으로 클릭하고 `레이어 이름 바꾸기 ‘를 선택하십시오.

../../_images/616.png
  1. 이 레이어의 이름을``origin_points ‘’로 바꾸겠습니다. 마찬가지로 건강 시설을 나타내는``Adult_Mental_Health_Providers ‘’레이어의 이름을``destination_points ‘’로 바꿉니다. 이러한 방식으로 레이어의 이름을 지정하면 후속 처리에서 레이어를 쉽게 식별 할 수 있습니다. 공간처리에서 툴박스로 이동합니다.

../../_images/715.png
  1. 도구상자 메뉴에서 `QNEAT3-> Distance matrixs-> OD Matrix from Layers from Table (m : n)`알고리즘을 찾습니다. 도구 상자에 이 알고리즘이 표시되지 않으면 ** QNEAT3 ** 플러그인이 설치되어 있는지 확인하십시오.

../../_images/815.png
  1. 이 알고리즘은 선택한 원점과 대상 레이어 사이의 네트워크 거리를 찾는데 도움이됩니다. `Network layer`로 ``Street_Centerlines ‘’를 선택하십시오. `From-Points 레이어로 ``origin_points ‘’를, `Unique Point ID 필드로``OBJECTID ‘’를 선택하십시오. 마찬가지로 `To-Points Layer’ 를``destination_points ‘’로 선택한 후, ‘Unique Point ID’를 ``OBJECTID’‘필드로 설정하십시오. `Optimization Criterion`을 ``Shortest Path ‘’로 설정하십시오.

../../_images/915.png
  1. 네트워크의 많은 거리가 일방 통행이므로 방향을 지정하려면 `고급파라미터`를 설정해야합니다. 이러한 속성의 구조에 대한 자세한 내용은 : doc :`basic_network_analysis`를 ​​참조하십시오. `Direction field’로 ``DIRECTIONA ‘’를 선택하십시오. `Value for forward direction’으로 ``One Way (Digitizing direction)``을 입력하고 `Value for backward direction’으로 “One way (Against digitizing direction)”을 입력하십시오. 다른 옵션을 기본값으로 유지하고 `Run`을 클릭하십시오.

../../_images/1015.png
  1. ``Output OD Matrix ‘’라는 새 테이블 레이어가 Layers 패널에 추가됩니다. 마우스 오른쪽 버튼을 클릭하고 `속성 테이블 열기`를 선택하십시오. 테이블에 * 117 * 행이 포함되어 있음을 알 수 있습니다. 우리는 9 개의 원점과 13 개의 목적지 지점을 가졌으므로 출력은 * 9x13 = 117 * 쌍의 원점과 목적지를 포함합니다. ``total_cost ‘’열에는 각 원점과 모든 대상 지점 사이의 거리가 미터 단위로 포함됩니다.

../../_images/1118.png
  1. 이번 튜토리얼에서 우리는 거리가 가장 짧은 대상 지점에만 관심이 있습니다. 모든 대상 중에서 ``total_cost ‘’가 가장 적은 대상을 선택하기 위해 SQL 쿼리를 만들 수 있습니다. 메뉴바에서 `데이터베이스 -> DB 관리자`로 이동하십시오.

../../_images/1216.png
  1. DB Manager 대화 상자의 왼쪽 패널에서 가상레이어-> 프로젝트레이어-> Output OD Matrix ‘를 선택하십시오. 자세한 내용은 `가상 레이어 설명서를 참조하십시오. `SQL 창`버튼을 클릭하십시오.

../../_images/1316.png
  1. 다음 쿼리를 입력하고 `Execute`를 클릭하십시오. 아래 패널에 결과가 표시됩니다. 예상대로 결과에는 9개의 행이 있으며 각 원점에 대한 최단 경로 대상입니다. `고유 한 값을 가진 열`을 ``origin_id ‘’로 확인하고 선택하십시오. `Layer name (prefix)’에는 ``nearest_destinations ‘’를 입력하십시오. `Load`를 클릭하십시오.

select origin_id, destination_id, min(total_cost) as shortest_distance
from 'Output OD Matrix' group by origin_id
../../_images/1414.png
  1. 새로운 가상 레이어 ``nearest_destinations ‘’가 레이어 패널에 추가됩니다. 이 표에는 분석 결과가 있습니다. 9 개의 원점 각각에 대해 가장 가까운 정신 건강 센터. 이러한 결과를 시각화하고 확인하는 몇 가지 방법을 시도해 봅시다. 메뉴바에서 공간처리 -> 툴박스로 이동하십시오. 툴박스 메뉴에서 ‘필드 값으로 속성 결합’ 알고리즘을 검색하고 찾습니다. 시작하려면 두 번 클릭하십시오.

../../_images/1513.png
  1. 입력 레이어’로 ``origin_points’ ‘를 선택하고 `테이블 필드로 ``OBJECTID’ ‘를 선택하십시오. `입력 레이어2`를 ``nearest_destinations ‘’로 입력하고, `테이블 필드2`를 ``origin_id ‘’로 설정하십시오. `복사할 레이어 2 필드 옆에있는 ... 버튼을 클릭하고 ``destination_id ‘’ 및 ``shortest_distance ‘’를 선택하십시오. `실행`을 클릭하십시오.

../../_images/1613.png
  1. 레이어 패널에 새로운 ``Joined layer ‘’가 추가됩니다. 이 레이어에는 각 출발지에 가장 가까운 대상 ID 속성이 있습니다. 이제 이 계층을 사용하여 허브 스포크 시각화를 만들 수 있습니다. 툴박스 메뉴바에서 벡터분석 -> ‘라인에 따라 결합(허브 라인)’ 알고리즘을 검색하십시오. 마우스 오른쪽 버튼을 클릭하여 시작합니다.

../../_images/1713.png
  1. ‘허브 레이어’를 “destination_points”로, ‘허브 ID 필드’를 “OBJECTID”로 선택하십시오. ‘Spoke layer’를 “joined layer”로, ‘스포크 ID 필드’를 “destination_id”로 선택하십시오. `실행`을 클릭하십시오.

../../_images/1812.png
  1. 처리가 끝나면 새로운 레이어 ``Hub lines’‘이 Layers 패널에 추가됩니다. 이 레이어는 각 출발지를 가장 가까운 목적지와 연결하는 선을 보여줍니다.

../../_images/1911.png
  1. 출발지와 목적지를 연결하는 선이 직선이더라도 네트워크를 따라 거리를 사용하여 목적지를 찾았습니다. 각 출발지-목적지 간의 실제 최단 경로를 표시하는 것이 훨씬 유용한 시각화입니다. 현재로서는 거리 행렬을 생성하는 방식으로 여러 출발지-목적지 쌍 사이에서 최단 경로를 생성하는 쉬운 방법이 없습니다. 그러나 파이썬 시각화를 사용 하여이 시각화를 생성하는 방법을 보여 드리겠습니다. 먼저, 최단 경로 알고리즘을 1 쌍으로 실행합시다. 툴박스메뉴에서 `QNEAT3-> Routing-> Shortest path (point to point) 알고리즘을 찾아서 실행하십시오.

../../_images/209.png
  1. Shortest Path (Point to Point)`대화 상자에서 `Network layer`로 ``Street_Centerlines ‘’를 선택하십시오. `Path type to calculate`을 ``Shortest ‘’로 유지하십시오. 다음으로 시작점과 끝점을 선택해야합니다. `Start point’옆에있는 `... 버튼을 클릭하고 캔버스에서 원점을 클릭하십시오. 마찬가지로 End point`와 같이 대상 지점을 선택하십시오. `고급 파라미터 섹션을 여십시오. Direction field``DIRECTIONA ‘’를 선택하십시오. `Value for forward direction’으로 ``One Way (Digitizing direction)``을 입력하고 `Value for backward direction’으로 One way (Against digitizing direction)``을 입력하십시오. 다른 옵션을 기본값으로 유지하고 `실행`을 클릭하십시오.

../../_images/2114.png
  1. 새로운 레이어 ``Shortest Path Layer’‘가 레이어 패널에 추가됩니다. 이 경로는 출발지와 목적지를 직선으로 연결하지 않고 네트워크를 따릅니다. 알고리즘을 1 쌍으로 실행 한 이유는 스크립트에서 사용할 수있는 매개 변수 값을 쉽게 식별하기 위해서입니다. ``Hub lines’‘과``Shortest Path layer’‘를 모두 선택하고 마우스 오른쪽 버튼을 클릭 한 후 레이어 제거 ‘를 선택하십시오. `공간처리 툴박스`에서 `History 단추를 클릭하십시오.

../../_images/2212.png
  1. 최상위 알고리즘을 선택하면 아래 패널에 전체 명령이 표시됩니다. 명령을 복사하고 `Close`를 클릭하십시오.

../../_images/2310.png
  1. 메뉴 플러그인 –> 파이썬 콘솔로 가십시오.

../../_images/248.png
  1. 파이썬콘쏠`에서 `Show Editor 버튼을 클릭하십시오.

../../_images/256.png
  1. 편집기 창에서 다음 스크립트를 복사 / 붙여 넣기하십시오. 이 스크립트는 앞에서 본 처리 기록의 매개 변수 값을 사용합니다. 스크립트 실행 버튼을 클릭하여 실행을 시작하십시오.

../../_images/266.png
origin_layer =  QgsProject.instance().mapLayersByName('origin_points')[0]
destination_layer =  QgsProject.instance().mapLayersByName('destination_points')[0]
matrix =  QgsProject.instance().mapLayersByName('nearest_destinations')[0]

for f in matrix.getFeatures():
    origin_expr = QgsExpression('OBJECTID={}'.format(f['origin_id']))
    destination_expr = QgsExpression('OBJECTID={}'.format(f['destination_id']))
    origin_feature = origin_layer.getFeatures(QgsFeatureRequest(origin_expr))
    origin_coords =  [(f.geometry().asPoint().x(), f.geometry().asPoint().y())
        for f in origin_feature]
    destination_feature = destination_layer.getFeatures(QgsFeatureRequest(destination_expr))
    destination_coords =  [(f.geometry().asPoint().x(), f.geometry().asPoint().y())
        for f in destination_feature]
    params = {
        'INPUT':'Street_Centerlines',
        'START_POINT':'{},{}'.format(origin_coords[0][0], origin_coords[0][1]),
        'END_POINT':'{},{}'.format(destination_coords[0][0], destination_coords[0][1]),
        'STRATEGY':0,
        'ENTRY_COST_CALCULATION_METHOD':0,
        'DIRECTION_FIELD':'DIRECTIONA',
        'VALUE_FORWARD':'One Way (Digitizing direction)\n',
        'VALUE_BACKWARD':'One way (Against digitizing direction)\n',
        'VALUE_BOTH':'',
        'DEFAULT_DIRECTION':2,
        'SPEED_FIELD':None,
        'DEFAULT_SPEED':5,
        'TOLERANCE':0,
        'OUTPUT':'memory:'}
    print('Executing analysis')
    processing.runAndLoadResults("qneat3:shortestpathpointtopoint", params)
  1. 스크립트를 실행하는 데 몇 분이 걸립니다. 완료되면 ``가장 짧은 경로 레이어 ‘’라는 9개의 새로운 레이어가 표시됩니다. 이 경로를 단일 레이어로 병합합시다. 툴박스 메뉴바에서 `벡터 일반-> 벡터 레이어 병합’ 알고리즘을 찾아서 실행합니다.

../../_images/276.png
  1. `입력 레이어`로 9개의 ``Shortest Path layer’‘를 모두 선택하십시오. `실행`을 클릭하십시오.

../../_images/286.png
  1. 출발지와 목적지 사이의 최단 경로를 포함하는 새로운 “병합” 레이어가 생성됩니다.

../../_images/295.png
If you liked tutorials on this site and do check out spatialthoughts.com for more free resources.
comments powered by Disqus

This work is licensed under a Creative Commons Attribution 4.0 International License