일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 3d
- geopandas
- Set
- MESH
- geojson
- pyvista
- 컨테이너
- 그리드분할
- 귀여운고래
- 데이터입수
- 패치분할
- 도커 레이어
- 좌표거리
- Python
- 폴더조사
- 도커
- 3d데이터
- GCN
- 알고리즘
- 파이썬
- STL
- python최단거리
- GNN
- 이미지빌드
- docker
- 지하철역좌표
- graph
- osmnx
- 동명이인찾기
- GIS
- Today
- Total
이것저것 기록
[python, GIS] OSMnx을 이용한 성남시 도로망 분석 및 시각화 본문
NetworkX에 대해서 이것저것 찾아보다가 OSMnx라는 모듈을 발견했다.
Open Street Map의 데이터를 받아서 그래프로 만들어주는 등, NetworkX랑 비슷한 모듈인데 OSM에 접목시켜서 사용할 수 있는 라이브러리인듯 했다.
주로 도시분석이나 도로네트워크분석 등 GIS 분야에서 많이 쓰이는 것 같다.
라이브러리에서 제공하는 함수나 기능들이 꽤나 다양하고, 이것들을 활용하면 GIS 분석을 재밌고 쉽게 할 수 있을 것 같아서 앞으로 몇 주간 찬찬히 공부해 볼 생각이다.
오늘 포스팅 할 내용은 OSMnx 장인? 급인 Geoff Boeing 교수의 깃헙을 많이 참고했다.
<-- 깃헙 주소: github.com/gboeing
1. 필요한 라이브러리 불러오기
import networkx as nx
import osmnx as ox
import requests
import matplotlib.cm as cm
import matplotlib.colors as colors
ox.config(use_cache=True, log_console=True)
ox.__version__
2. 내가 원하는 지역의 OSM 지도를 그래프 형태로 변환하기
# 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)
3. 그래프를 활용한 계산 이모저모 - 도로망 분석
# what sized area does our network cover in square meters?
G_proj = ox.project_graph(G)
nodes_proj = ox.graph_to_gdfs(G_proj, edges=False)
graph_area_m = nodes_proj.unary_union.convex_hull.area
print(graph_area_m)
# 이것저것 그래프 상태 확인
stats = ox.basic_stats(G_proj,
area=graph_area_m,
clean_intersects=True,
circuity_dist='euclidean')
# see more stats (mostly topological stuff) with extended_stats
more_stats = ox.extended_stats(G, ecc=True, bc=True, cc=True)
for key in sorted(more_stats.keys()):
print(key)
more_stats['degree_centrality_avg']
stats에 성남시 지도 그래프의 다양한 상태가 저장되어 있다. 확인 ㄱㄱ
성남시의 경우, 각 노드 당 도로의 갯수는 3.07개이다. (streets_per_node_ave)
도로망이 상당히 복잡하다는 뜻으로 해석해도 되는 것일까...
intersection count가 상당히 흥미롭다. 교차로의 총 개수를 계산해준 것인데 4124개나 된다.
4. 도로망 중심성 시각화
# convert graph to line graph so edges become nodes and vice versa
edge_centrality = nx.closeness_centrality(nx.line_graph(G))
nx.set_edge_attributes(G, edge_centrality, 'edge_centrality')
# color edges in original graph with closeness centralities from line graph
ec = ox.plot.get_edge_colors_by_attr(G, 'edge_centrality', cmap='inferno')
fig, ax = ox.plot_graph(G, edge_color=ec, edge_linewidth=2, node_size=0)
노란색으로 칠해진 부분이 도로망 네트워크에 있어서 중심지 역할을 하는 곳이라고 보면 된다.
찾아보니 저 곳은 모란시장이 있는 곳인데, 실제로 저 곳은 구시가지의 많은 도로들이 모이는 곳이기도 하다.
사실 성남시의 '중심'이라고 생각될만한 곳은 정자역이나 서현역 부근인데, 도로망 네트워크의 중심인 모란시장 부근과 일치하진 않는다.
사람들의 인식 속의 중심과 도로망 네트워크의 중심이 차이가 있는 것 같다.
좀 더 의미있는 분석을 하기 위해선 유동인구 데이터 등 추가적으로 연계되어야 하는 데이터들이 있는 것 같다.
'코린이 > 실무를 위한 코딩 기록' 카테고리의 다른 글
[python, GIS] OSMnx를 이용한 최단경로탐색 및 계산 (0) | 2020.11.04 |
---|---|
[python, GIS] OSMnx로 OSM 지도를 그래프로 불러오는 방법 (1) | 2020.11.04 |
[python] NetworkX를 이용한 왕좌의 게임 등장인물 네트워크 분석 (0) | 2020.11.02 |
[python] NetworkX를 사용해서 데이터분석 및 시각화 해보기 (4) | 2020.11.02 |
[python, folium] 서울 따릉이 대여소 (x,y)좌표 변환 및 지도 시각화 (1) | 2020.10.09 |