이것저것 기록

[python, GIS] OSMnx을 이용한 성남시 도로망 분석 및 시각화 본문

코린이/실무를 위한 코딩 기록

[python, GIS] OSMnx을 이용한 성남시 도로망 분석 및 시각화

anweh 2020. 11. 3. 18:01

 

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)

시각화 결과

노란색으로 칠해진 부분이 도로망 네트워크에 있어서 중심지 역할을 하는 곳이라고 보면 된다.

찾아보니 저 곳은 모란시장이 있는 곳인데, 실제로 저 곳은 구시가지의 많은 도로들이 모이는 곳이기도 하다. 

사실 성남시의 '중심'이라고 생각될만한 곳은 정자역이나 서현역 부근인데, 도로망 네트워크의 중심인 모란시장 부근과 일치하진 않는다.

사람들의 인식 속의 중심과 도로망 네트워크의 중심이 차이가 있는 것 같다.

좀 더 의미있는 분석을 하기 위해선 유동인구 데이터 등 추가적으로 연계되어야 하는 데이터들이 있는 것 같다. 

 

 

 

Comments