이것저것 기록

[python, GIS] OSMnx로 도로 네트워크 단순화 본문

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

[python, GIS] OSMnx로 도로 네트워크 단순화

anweh 2020. 12. 7. 18:15

한동안 블로그에 글이 뜸했다. 

일주일에 적어도 한 두번 이상은 포스팅 하려고 했는데, 코딩 기록 이외에도 해야할 것들이 너무 많아서 도저히 시간이 나지 않았다 ㅠㅠ

겨울방학도 다가오고 있고, 11월보단 조금 여유가 생겨서 이제 다시 꾸준히 포스팅 해야지!! 

 

OSMnx 포스팅을 또 시작해보려고 한다.

오늘은 복잡하고 쓸데없이 redundant 한 도로 네트워크의 노드를 제거하는 방법에 대해서 포스팅 해 보려고 한다. 

 

 

1. 해당 좌표 인근의 도로 네트워크를 모두 시각화

import networkx as nx
import osmnx as ox

point = 37.858495, -122.267468
G = ox.graph_from_point(point, network_type='drive', dist=500)

위의 코드는 point에 저장된 좌표의 500 거리 이내의 모든 도로 네트워크를 그래프로 만들어준 것이다.

이제 G에서 필요없는 노드들을 제거해서 단순화 해보려고 한다. 

 

 

2. Simplification

G_proj = ox.project_graph(G)
intersections = ox.consolidate_intersections(G_proj, rebuild_graph=False, tolerance=15, dead_ends=False)
G2 = ox.consolidate_intersections(G_proj, rebuild_graph=True, tolerance=15, dead_ends=False)
print("Intersections: {}, G: {}, G2: {}".format(len(intersections), len(G), len(G2)))

fig, ax = ox.plot_graph(G, node_color='r')
fig, ax = ox.plot_graph(G2, node_color='r')

원본 그래프 (좌), 단순화 (우)
출력 결과

출력 결과에서 알 수 있듯이 교차점에 해당하는 노드는 67개 였고, 이들을 제거한 G2의 그래프 크기가 줄어든 것을 볼 수 있다.

ox.consolidate_intersections는 노드들이 뭉쳐있는 곳에서 인근 노드들을 하나의 노드로 머지해주는 함수이다. 

rebuild_graph=False이면 geometically 가까운 노드들이 머지되고

rebuild_graph=True이면 topologically 가까운 노드들이 머지된다. 

  • G (networkx.MultiDiGraph) – a projected graph
  • tolerance (float) – nodes are buffered to this distance (in graph’s geometry’s units) and subsequent overlaps are dissolved into a single node
  • rebuild_graph (bool) – if True, consolidate the nodes topologically, rebuild the graph, and return as networkx.MultiDiGraph. if False, consolidate the nodes geometrically and return the consolidated node points as geopandas.GeoSeries
  • dead_ends (bool) – if False, discard dead-end nodes to return only street-intersection points
  • reconnect_edges (bool) – ignored if rebuild_graph is not True. if True, reconnect edges and their geometries in rebuilt graph to the consolidated nodes and update edge length attributes; if False, returned graph has no edges (which is faster if you just need topologically consolidated intersection counts).

 

Comments