使用python,利用OSMnx库,获取国外POI数据

本文介绍了如何使用OSMnx库从OpenStreetMap获取国外的POI数据,包括基本介绍、获取POI的方法以及实战示例,如通过点周围和城市范围获取POI,并展示了数据可视化和存储的步骤。
该文章已生成可运行项目,

由于百度或者高德的API只能获取国内的POI,谷歌API需要翻墙而且还收费,所以一直为为何白嫖国外POI数据头疼。最近终于找到了方法,使用OSMnx,得到基于OSM地图提供的POI数据。# 后续发现这种POI数据有点粗糙,请辨别使用

在学习的过程中,发现居然没有人写相关的文章介绍,没办法只能摸着石头过河,一点一点学习,这个功能最提出是在github issue中提到的。里面对于最初的功能设计、内容呈现之类的问题都有讨论,还是挺有意思的。同时也感谢这些开源贡献者,非常感谢!

基本介绍

OSMnx是由南加大规划系的Geoff Boeing教授编写的OpenStreetMap的python拓展包。

参考官网:https://geoffboeing.com/

OSMnx的基本功能:下载街道网络、下载POI、下载城市路网结构、可视化等。
基本的使用教程网上有很多,但我推荐下面这个链接里作者写的介绍

https://geoffboeing.com/2016/11/osmnx-python-street-networks/

对于这个文章,我们只需要知道,如何获得行政地点边界就可以,因为获取POI要使用到。

获得行政地点边界:osmnx.geocode_to_gdf(place)
本文例子以(‘Berkeley, California’) 作为place

import osmnx as ox
place = 'Berkeley, California'
city = ox.geocode_to_gdf(place)
ax = ox.project_gdf(city).plot()
_ = ax.axis('off') # 消除图表框

在这里插入图片描述

获取POI的方法

OSMnx提供获取POI的方法,和最初在github issue中的名字已经不一样了,现在的模块叫做osmnx.geometries module。模块非常规整,给出了5种获得数据的方式,分别是:

  1. 获取给定地址中心一定范围内数据
本文章已经生成可运行项目
<think>好的,我现在需要帮助用户了解如何使用Python通过高德开发者平台的API获取POI数据。首先,用户的问题集中在方法和示例代码上,所以我得先理清整个流程,确保步骤清晰正确。 首先,用户可能已经知道需要注册高德账号并获取密钥,但为了全面,我还是应该从注册和获取密钥开始说明。然后,确定POI的分类编码和城市编码是必要的,因为这些参数在API请求中会用到。接下来,构造API请求的URL是关键步骤,需要说明各个参数的作用,比如keywords、location、radius等。特别是分页处理,因为高德的API一次最多返回25条数据,用户可能需要多次请求才能获取所有数据,所以分页逻辑是必须的。 然后,处理返回的JSON数据,提取所需字段,比如名称、地址、坐标等。这部分需要展示如何解析JSON结构,并处理可能的异常情况。写入Excel文件的部分,用户可能需要使用pandas,因为示例代码中用了DataFrame和to_excel方法,但需要确认用户是否已经安装了pandas,可能需要提示安装命令。 接下来,示例代码需要完整且正确,包括导入必要的、定义获取POI的函数、分页逻辑、数据解析和写入Excel。代码中的关键部分需要注释,帮助用户理解每一步的作用。比如,在构造请求URL时,参数如何拼接,如何处理分页参数page_num。 用户可能遇到的问题包括API密钥无效、网络请求错误、数据解析错误等,所以在注意事项里需要提醒用户检查密钥、网络连接,以及处理可能的异常。此外,遵守高德的使用条款也很重要,避免频繁请求导致封禁。 现在,检查示例代码是否完整。比如,getpois函数是否正确处理了分页,是否在每页请求后增加了页码,直到没有更多数据。写入Excel的部分是否使用了正确的列名,是否处理了可能的重复数据。代码中的变量名是否清晰,比如amap_web_key是否正确替换,文件路径是否正确。 另外,用户提供的引用中提到了将深圳市划分为矩形区域,可能需要多个中心点或区域遍历。但当前示例代码使用的是圆形区域搜索,如果用户需要矩形区域,可能需要使用高德的其他API,比如多边形搜索或行政区域查询。但根据用户的问题,可能只需围绕特定点进行周边搜索,所以示例代码中的around接口是合适的。 最后,生成的相关问题需要与POI数据获取相关,比如处理分页、优化请求效率、数据清洗和应用场景。这些问题可以帮助用户进一步探索和解决可能遇到的挑战。 总结来说,回答需要分步骤详细说明,确保代码可运行,注意事项覆盖常见问题,引用正确,并且格式符合要求,如行内公式用$包裹,代码块使用正确语法,避免Markdown错误。</think>根据高德地图开放平台规范,Python获取POI数据的具体方法如下: ### 一、实施步骤 1. **注册开发者账号** - 访问高德开放平台(lbs.amap.com)完成注册 - 进入「应用管理」创建新应用,获取Web服务API密钥(key)[^1] 2. **确定请求参数** - 基础参数:`key=您的密钥` - 必选参数:`location=经度,纬度`(中心点坐标) - 可选参数:`keywords=奶茶`(检索关键字),`radius=1000`(搜索半径米数),`types=050000`(餐饮类编码) 3. **API请求公式** 请求URL结构: $$url = https://restapi.amap.com/v3/place/around?key={key}\&location={坐标}\&keywords={关键词}\&radius={半径}$$ [^2] ### 二、Python示例代码 ```python import requests import pandas as pd def get_pois(center_point, keyword, radius, api_key): page = 1 pois = [] while True: url = f"https://restapi.amap.com/v3/place/around?key={api_key}" \ f"&location={center_point}&keywords={keyword}" \ f"&radius={radius}&offset=25&page={page}" response = requests.get(url).json() if response["status"] != "1" or int(response["count"]) == 0: break pois.extend(response["pois"]) page += 1 return pois # 配置参数 AMAP_KEY = "your_api_key_here" # 替换为真实密钥 CENTER = "114.0583,22.5427" # 深圳中心坐标 RADIUS = 5000 # 搜索半径 KEYWORD = "购物中心" # POI类别 # 执行数据获取 poi_data = get_pois(CENTER, KEYWORD, RADIUS, AMAP_KEY) # 数据格式化处理 df = pd.DataFrame([{ "名称":item["name"], "地址":item["address"], "坐标":item["location"], "类型":item["type"] } for item in poi_data]) # 保存结果 df.to_excel("深圳购物中心POI数据.xlsx", index=False) ``` ### 三、关键技术说明 1. **分页机制**:通过`page`参数实现数据分页加载,每页最大25条记录[^2] 2. **坐标转换**:返回的坐标值为GCJ-02坐标系,需转换接口获取WGS84坐标 3. **异常处理**:建议增加`try-except`块处理网络请求超时和JSON解析错误 ### 四、注意事项 1. 每日调用限额根据开发者认证等级不同(个人开发者默认2000次/日) 2. 坐标点建议通过「行政区域查询API」批量获取区域边界坐标[^1] 3. 返回数据包含的字段详见高德《Web服务API技术文档》
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值