• 【爬虫】基于OSMnx库,获取国外POI数据


    安装库

    需要实验conda创建一个环境,专门用来运行osmnx;切勿使用pip,需要安装大量依赖包。

    conda config --prepend channels conda-forge
    conda create -n ox --strict-channel-priority osmnx
    conda install spyder
    
    • 1
    • 2
    • 3

    PS:要将 OSMnx 升级到较新版本,请删除您创建的 conda 环境,然后再次创建一个新环境,如上所述。不要只是运行“conda update”,否则你可能会遇到软件包冲突。

    安装后切换到ox环境中

    conda env list
    activate ox
    
    • 1
    • 2

    OSMnx是由南加大规划系的Geoff Boeing教授编写的OpenStreetMap的python拓展包。OSMnx的基本功能:下载街道网络、下载POI、下载城市路网结构、可视化等。使用教程:参考教程

    获取POI

    OSMnx中的osmnx.geometries module模块提供了多种方法获取POI的方法,具体可参考官方文档

    这里使用如下函数,该函数可以获取一个经纬度矩阵内的数据

    geometries.geometries_from_bbox(north, south, east, west, tags)

    north, south, east, west,分别为矩形的北纬、南纬、东经和西经

    另外值得注意的是tags 参数。tags用于筛选POI类型的字典。字典的键为OSM标记、值为True或者单个标记字符串。

    如:OSM Tags为:railway=station;这里就输入tags = {‘railway’:‘station’};官方文档和网上的教程中都没有给出具体的POI和OSM Tags的对照表。

    经过查询最后在geofabrik下载中找到了具体的对照表。

    在这里插入图片描述
    ;

    在这里插入图片描述
    另外也找到了一个OSM帮助论坛 提供了很多解答

    在这里插入图片描述
    函数返回的数据是一个DataFrame,index包括三个:node,way,relation。其中way和relation是图中的多边形,对于获取POI而言意义不大,我们只需要node。

    import osmnx as ox
    # 获取数据
    p1 = ox.geometries.geometries_from_bbox(north, south, east, west, tags={'railway': 'station'})
    print(p1.loc['node']['name'])
    
    • 1
    • 2
    • 3
    • 4

    结果如下:
    在这里插入图片描述

    可视化、输出数据

    使用python进行可视化操作

    ds = p1.loc['node']['geometry']
    fig = plt.figure(figsize = (15,10))
    ax = plt.subplot()
    ds.plot(edgecolor = 'b', alpha = 0.5, ax = ax)
    ds2.plot(edgecolor = 'k',alpha = 0.5, ax = ax)
    ds3.plot(edgecolor = 'r',alpha = 0.5, ax = ax)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    最后是储存数据,可以将p1所有的内容都存储为csv,方便对POI进行分类和分析,也可以将POI点存为shp文件,方便在gis软件操作。

    p2.to_csv(r'..\all_poi.csv')
    p2.loc['node']['geometry'].to_file(r'..\node.shp')
    
    • 1
    • 2

    其他获取方法

    在OSM官网,点击导出。选择Geofabrik下载;选择要下载的国家和地区。下载适合arcgis的shp格式文件

    https://master.apis.dev.openstreetmap.org/export#map=10/51.4899/-0.0879

    在这里插入图片描述
    在这里插入图片描述

    面数据导出为shp

    geometries_from_point返回的’way’是面数据,对其可视化结果如下

    from matplotlib import pyplot as plt
    import osmnx as ox
    import geopandas
    # 经度 -122.3133443   维度37.9285095
    p1 = ox.geometries.geometries_from_point((51.551,-0.125),
                                             tags={'leisure': 'park'},
                                             dist=5000)
    ds = p1.loc['way']['geometry']
    fig = plt.figure(figsize = (15,10))
    ax = plt.subplot()
    ds2.plot(edgecolor = 'k',alpha = 0.5, ax = ax)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    geometries_from_point返回的’way’就已经是GeoDataFrame格式(GeoPandas库下的地理数据格式);因此可以直接用GeoPandas导出为shp格式。代码如下:注意要先删除冗余的字段,否则会报错。这里只保留了名称和经纬度信息

    #去除冗余列
    gdf=p1.loc['way'][['name','geometry']]
    #保存为shp
    gdf.to_file('city.shp', driver='ESRI Shapefile',encoding='utf-8')
    
    • 1
    • 2
    • 3
    • 4

    在Arcgis打开如下:
    在这里插入图片描述
    在这里插入图片描述

    新开通了本人的公众号,欢迎关注:燕南路GISer ,专注GIS干货分享,不定期更新。
    主要兴趣:GIS、时空数据挖掘、python、机器学习深度学习
    提问、求资源等都可在公众号后台留言
    CSDN的部分内容会重写再搬迁到公众号,欢迎关注!
    在这里插入图片描述

  • 相关阅读:
    油罐清洗抽吸系统设计
    ​LeetCode解法汇总2760. 最长奇偶子数组
    QT静态成员函数访问和操作UI对象
    14:00面试,14:06就出来了,问的问题有点变态。。。
    探索多线程编程:线程的本质、状态和属性
    Qt第六十六章:展示数据的标签
    YOLO目标检测——密集人群人头数据集+已标注yolo格式标签下载分享
    SpringCloud微服务(一)——Consul服务注册中心
    API 与 SDK 之间的区别
    Elasticsearch中的评分排序--Function score query
  • 原文地址:https://blog.csdn.net/xza13155/article/details/125989252