일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- kepler
- covid
- Python
- 라이엇api
- 코로나
- pipwin
- 오픈API
- r
- 시각화
- 마커클러스터
- 파이썬
- geopandas에러
- matplotlib
- QGIS라벨링
- covid19
- 공공데이터포털
- 막대그래프
- 에러
- OSMnx
- geopnadas
- geopandas설치
- Folium
- kepler.gl
- 라이엇
- riotapi
- map
- 지도
- 인코등
- API
- 오류
- Today
- Total
Nerdy
OSMnx와 Folium을 이용한 특정 지역 최단경로 분석 및 시각화 본문
OSMnx는 Geoff Boeing 교수라는 분이 만든 Open Street Map(OSM)의 도로망 데이터를 기반으로 네트워크 분석 및 시각화 라이브러리다.
GIS 분야에서 꽤 많이 사용되고 있으며 OSM에서 네트워크 검색 및 구성, 분석 및 시각화를 할 수 있다는 장점이 있으며 Folium과 Matplotlib을 같이 활용을 하면 큰 시너지를 발휘할 수 있다.
공식 문서가 있지만 Geoff Boeing 교수의 깃헙에서 내용을 참고하면 쉽게 이해할 수 있으며 다양한 예제들도 많이 있다.
https://whiplash-bd.tistory.com/55
간단하게 OSM 지도에서 원하는 지역을 선택하고 그래프 형태로 변환하여 Folium 지도에 입혀보는 작업을 해본다.
1. 필요 라이브러리 불러오기
import networkx as nx
import osmnx as ox
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import folium
import geopandas as gpd
osmnx 라이브러리를 설치 시 에러가 발생하여 설치를 못하는 사람들이 많이 있다.
이 경우에 해결 방법은 geopandas를 먼저 깔아주고 다음으로 osmnx를 설치해줘야 에러 없이 잘 될 것이다.
2. Open Street Map 지도를 그래프 형태로 변환하여 원하는 지역 가져오기
# get a graph for some city
# www.openstreetmap.org에서 검색 결과가 city-state-country 단위로 나와야 함
G = ox.graph_from_place('동대문구, 서울, 대한민국', network_type='drive')
fig, ax = ox.plot_graph(G)
graph_from_place 함수를 사용해 원하는 지역의 OSM 지도 형식을 그래프로 담아준다.
원하는 지역을 넣을 때 다음과 같이 진행한다.
- www.openstreetmap.org 사이트를 들어가 원하는 지역을 입력한다.
- 검색결과 찾고자 하는 지역의 단위가 나온다.
- 단위형식은 다음과 같다
- 종로구(city), 서울(state), 대한민국(country)
해당 코드를 Run 하면 osmnx 지도 그래프가 표출이 된다.
3. 평면직각좌표 데이터 변환하기
project_graph 함수를 사용해 데이터를 변환해준다.
G_proj = ox.project_graph(G)
ox.project_graph를 돌렸을 때 아래와 같은 에러가 발생하는 현상이 있을거다.
AttributeError : 'DataFrame' object has no attribute 'crs'
해결방법 OSMnx 버전을 최신 버전으로 변경해주면 되는거다.
먼저 cmd를 실행시켜 'pip list' 명령어를 입력해준 뒤 osmnx의 버전을 확인한다.
만약 버전이 1.2.2(9/23 기준)가 아니면 'pip install --upgrade osmnx==1.2.2' 명령어를 입력하여 실행시켜준 뒤 커널 재시작을 하여 다시 돌리면 작동이 잘 될 것이다.
4. 출발지와 도착지 좌표 설정
출발지 지점과 도착지 지점의 노드를 찾기 위해 각가의 좌표를 입력해준다.
원하는 지역의 출발지와 도착지 좌표는 앞에서 본 Open Street Map에서 검색하면 나온다.
orig_node = ox.nearest_nodes(G, 37.5804100, 127.0462200) #청량리역
dest_node = ox.nearest_nodes(G_proj, 37.5718616, 127.0114887) #동대문역
다른 포스팅 글 보면 ox.nearest_node(G, (위도, 경도)) 사용해서 노드를 찾는다고 하는데 nearest_node 함수는 사용 중단이 됐고 nearest_nodes라는 업데이트 된 함수를 사용하면 최단 그래프 노드를 찾을 수 있다.
5. 루트 촤단경로 분석
networkx 라이브러리에서 제공하는 shortest_path 함수를 사용해 최단경로를 분석한다.
route = nx.shortest_path(G, orig_node, dest_node, weight='length')
최단거리 분석 결과에 대한 길이 구하는 법은 다음과 같다.
len = nx.shortest_path_length(G, orig_node, dest_node, weight='length') / 1000
print(round(len, 1), "킬로미터")
6. Folium 맵에 분석 결과 시각화 표출하기
OSMnx 라이브러리에서 제공하는 plot_route_folium 함수를 사용해 HTML 형식의 Folium 맵을 저장하고 잘 나왔는지 확인을 한다.
route_graph_map = ox.plot_route_folium(G, route, popup_attribute='length')
route_graph_map.save('route_graph.html')
함수 안에 사용한 popup_attribute 옵션은 생성된 경로에 원하는 지점을 클릭하면 해당 지점의 위도와 경도가 나오게끔 표출하는 방법이다.
HTML 형식으로 저장된 파일을 열어보면 다음과 같은 결과를 얻을 수 있다.
맵 타일은 Folium에서 제공하는 기본 맵으로 Default가 되어 있으며 원하는 맵 스타일이 있으면 맵 타일 변경하면 된다.
타일뿐만 아니라 라인 색상이나, 굵기, 화면 지정, popup 내용 추가 및 수정 등 다양한 옵션을 활용해 본인만의 스타일을 꾸밀 수 있다.