之前在openstreetmap下载了杭州的路网结构,但是吧,文件打开了真的一时不知道怎么处理。恰好看到了osmnx的python包,但是这个包吧,真的是有点让人头大。必须写个博客排雷。
我安装了python3.7,也装了anaconda3。为了方便之后的处理,所以用的anaconda3的环境中装的osmnx。安装操作很简单。
conda install -c conda-forge osmnx
安装时间会有点久,并未会同时装很多其他的包。建议,安装的时候不要看视频,容易超时。
本以为安装完了就能使用了,却发现没有这么简单。
import osmnx as ox
place=杭州市,浙江省,中国'
G=ox.project_gdf( ox.gdf_from_place(place))
ox.plot_shape(G)
根据官方文档,准备画个杭州边界试试水,然而,除了一系列幺蛾子。具体顺序记不太清了,就罗列一下出现过的问题吧。
`File "_proj.pyx", line 84, in _proj.Proj.__cinit__
RuntimeError: b'No such file or directory'
这个问题,看到有人讨论需要更新pyproj这个包,那就更新吧
conda install -c https://conda.anaconda.org/ioos pyproj
更新了以后,还是没有效果,接着找原因,呀!可能是版本装太高了。装1.9.4版本就可以了。
conda install pyproj=1.9.4
终于不报这个错了。换了一个错
raise ValueError('All geometries in GeoDataFrame must be shapely Polygons or MultiPolygons')
ValueError: All geometries in GeoDataFrame must be shapely Polygons or MultiPolygons
这又是个什么错~~~简单来说,本来通过地名,就可以获取该地区的一个边界,但是现在,没有找到这个边界,没办法得到一个框起来的多边形。
url = 'https://nominatim.openstreetmap.org/search?format=json&limit=1&dedupe=0&polygon_geojson=1&q={}'
url = url.format(place)
response = requests.get(url)
print(response.json())
通过这段代码可以看到,爬到的内容
[{'type': 'city', 'place_id': 624442, 'lat': '30.2489634', 'boundingbox': ['30.0889634', '30.4089634', '120.0452342', '120.3652342'], 'class': 'place', 'icon': 'https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png', 'display_name': '杭州市, 江干区 (Jianggan), 杭州市 Hangzhou, 浙江省, 310026, 中国', 'importance': 0.699071068851407, 'osm_type': 'node', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'geojson': {'type': 'Point', 'coordinates': [120.2052342, 30.2489634]}, 'osm_id': 244080543, 'lon': '120.2052342'}]
就一个点,当然框不出一块区域。然后去openstreetmap找原因。
搜索杭州,会出来两条内容,第一条内容,与我们爬虫结果比较像。呵~居然是个节点。我去别的城市看了看,都是一个关系。这到底是谁建的一个节点。。。
怎么办呢,删掉这个点?让包找第二条信息?一时没找到什么好办法在两条信息的对比过程中突然看到,第二条信息写了杭州有个别名‘Hangchow’,这个在第一条里面没有。那试试。误打误撞,对了!!!
然后改代码,这下终于画出边界了。
原以为边界都画出来了,还能有什么问题呢,然而,在画街道的时候,继续报错。报了两个错吧,具体的错误没有保留。
一个错误是超时,没毛病,就是超时。整个杭州的路网文件大概100M,下下的很久,确保网络畅通。没什么好办法。
第二个是plt文件有什么function找不到。与第一个错误类似,需要跟新包。在这里我更新了networkx和matplotlib两个包。
完成这些,就是安静的等它下载,我在晚上下的,第二天早上看的时候出结果了
这里还有一点吐槽,我原本以为,这东西下了一次总是会把文件保存下来的吧,但是第二次运行还是很慢。用 pickle保存G
import pickle
G = ox.graph_from_place(place,network_type='drive')
G_project=ox.project_graph(G)
G_project_file=open('G_project.pickle','wb')
pickle.dump(G,G_project_file)
G_project_file.close()
下一次使用的时候,读取文件,就可以了。
file=open('G_project.pickle','rb')
G=pickle.load(file)
file.close()
ox.plot_graph(G)
继续学习中。。。