osmnx package 入门学习

官方解释:

OSMnx是一个Python软件包,支持从OpenStreetMap下载地理空间数据,并对现实世界的街道网络和任何其他地理空间几何图形进行建模、投影、可视化和分析。通过一行代码即可下载城市网络(walkable, drivable, or bikeable urban networks)并对齐建模,然后轻松进行分析和可视化;也可以轻松下载并使用其他基础设施类型(设施/兴趣点、建筑物占地面积、高度数据、街道方位/方向、速度/行驶时间)。

若使用osmnx包,别忘了引用以下文章哦:

Boeing, G. 2017. “OSMnx: New Methods for Acquiring, Constructing,
Analyzing, and Visualizing Complex Street Networks.” Computers,
Environment and Urban Systems 65, 126-139.
doi:10.1016/j.compenvurbsys.2017.05.004

通俗理解:

osmnx是Python扩展包,可用于下载地理数据资料并进行可视化,是论文中绘制漂酿插图的好工具。

鉴于这个包网上资料过少,本人实际使用的时候踩了许多坑,在此记录与分享。

撸代码环节

1、首先导入所需的包(可能有许多用不到,这是我实验中用到的哈)

import osmnx as ox
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from pandas import DataFrame
from pandas import Series
from Graph_nx import *
from imp import reload
import matplotlib.cm as cm
from sklearn.cluster import KMeans
from matplotlib.colors import LinearSegmentedColormap

2、导入所需的地图数据。
导入方法有多种方式:包括graph_from_address、graph_from_bbox、graph_from_gdfs、graph_from_place、graph_from_point、graph_from_polygon、graph_from_xml这七种方式。

以下给出从地名导入(graph_from_place)、经纬度+距离导入(graph_from_point)、选定边界框(graph_from_bbox)这三种方式的具体范例。

(1)通过地址导入。

选择地址为曼哈顿,且仅选用机动车道路。

place = ox.graph_from_place('Manhattan, New York City, New York, USA', network_type='drive')

查看所选place的地图情况

G = ox.plot_graph(place)
osmnx package 入门学习_第1张图片

(2)通过坐标导入。
此处需注意,坐标为(纬度,经度),所给坐标处应当是有地理信息的,如果给到太平洋就会报错哦~

place = ox.graph_from_point((40.74,-73.96), dist= 1000, network_type='drive')
G = ox.plot_graph(place)
osmnx package 入门学习_第2张图片

(3)标定选取框导入。

place = ox.graph_from_bbox(39.9,40.2, -74.1, -74.4, network_type='drive')
G = ox.plot_graph(place)
osmnx package 入门学习_第3张图片

(4)絮絮叨叨

这部分还有许多参数可以调节,network_type为最常用的一种,用help函数可以快速实现自己的个性化需求哦。()

help(ox.graph_from_place)

osmnx package 入门学习_第4张图片
具体参数说明见下图,重中之重!
osmnx package 入门学习_第5张图片

3、查询地图中的信息。
(1)点的信息。

place.nodes()

返回点的ID信息。

place.nodes(data = True)

由上图可知,点本身是字典形式的,由此可查询关于点的更具体的信息。

nodes = list(place.nodes())
node = nodes[0]
print(place.nodes()[node]['x'])

在这里插入图片描述

(2)边的信息。

place.edges()

返回edge的两个端点信息。

place.edges(data = True)

返回edge更具体的信息。

4、对地图信息进行修改
(1)加点(如果仅用于画图,可参考5,不需要将点加入地图中去)
先确定ID名,再输入其属性~(还有其他方法,私以为这种最合适

place.add_node(1)
place.add_nodes_from([(1, {'y': 40.78, 'x': -73.97})])
place.nodes()[1]

在这里插入图片描述

(2)加边
先确定edge两个端点的ID,然后直接加边。

place.add_edge(42421728,1)

5、画图

(1)根据地图中的信息属性画图

place.add_node(1) #加入点1
place.add_nodes_from([(1, {'y': 40.78, 'x': -73.97})])
place.add_edge(42421728,1) #点42421728为图中本来就有的点

nc = ['red' if node in [42421728,1]  else 'blue' for node in place.nodes()] #node color 
ns = [30 if node in [42421728,1]  else 1 for node in place.nodes()]#node size 
ec = ['red' if edge in [(42421728,1)] else 'blue' for edge in place.edges()] #edge color

fig, ax = ox.plot_graph(place,node_color=nc,node_size=ns,edge_color=ec)
plt.show()
osmnx package 入门学习_第6张图片

碎碎念:大家可以想一想,在作图的时候,是不是可以根据数据出现的次数来调整color呢?其实也就是设计比上图中更复杂的node color,即可在地图上实现热力图,反映地点出现的次数哦~

关于nc,ns,ec,es,其实有许多可以个性化的地方,此处就不赘述啦

(2)仅需标注不在图中的一些点,与4.1对应

fig, ax = ox.plot_graph(place,show=False, close=False)
ax.scatter(-73.966498, 40.747270, c='red') #注意,这个地方经度在前,纬度在后,要不然画图画了个寂寞(血泪教训
plt.show()
osmnx package 入门学习_第7张图片

(3)规划两点之间的路径

location = (40.7690147,-73.9923441) #与上一个代码对应,又变成纬度在前,经度在后了!!!这个包的有些设计真的令人抓狂
G = ox.graph_from_point(location,network_type='drive') 

O = ox.get_nearest_node(G,location) #返回地图中距离G最近的点
D = 1061531777 #地图中已有的点,我手动挑出来的

route = nx.shortest_path(G, O, D, weight='length')
distance = nx.shortest_path_length(G, O, D, weight='length') 
fig, ax = ox.plot_graph_route(G, route, route_color='red') #可视化结果
print(str(distance)) #输出最短路径距离

一个点为随意确定的经纬度点,然后调用ox.get_nearest_node找到地图中距离该点最近的点,令其为O(顺便介绍了ox.get_nearest_node这个函数~);另一个点为地图中已有的,令其为D。然后就可以直接调用函数得最短路啦!是不是超方便!

osmnx package 入门学习_第8张图片

碎碎念:讲道理这个ox.get_nearest_node函数是不是有些问题?根据我的实验结果,貌似返回的并不是最近的点(捂脸),反而还相差很远。但资料显示确实是返回最近的点没错,不知道是不是我理解有误,有知道的小伙伴欢迎告知!

6、总结

总结来讲,就是这个包资料好少啊,然后感觉更新也有点快,网上的好多代码敢run就敢报错。所以就整理了较为常用的几个基础内容分享出来(在debug中成长),敬请批评指正!

你可能感兴趣的:(内容分享)