高德POI数据获取全攻略:从API申请到Excel导出(Python版)

张开发
2026/5/8 7:38:51 15 分钟阅读

分享文章

高德POI数据获取全攻略:从API申请到Excel导出(Python版)
高德POI数据获取全攻略从API申请到Excel导出Python版商业选址分析需要周边餐饮数据城市规划调研缺少公共设施分布传统手工采集POI数据效率低下且容易遗漏关键信息。高德地图开放平台提供的POI接口配合Python自动化处理能快速获取精准的商业地理数据。本文将手把手带你完成从零开始的数据采集全流程。1. 高德API申请与基础配置获取POI数据的第一步是申请高德开发者密钥。访问高德开放平台官网完成开发者注册后进入控制台-应用管理创建新应用。选择Web服务类型系统会自动生成专属API Key。这个40位的字符串是我们调用所有接口的通行证。注意个人开发者每天有3000次免费调用额度商业项目需提前评估用量并购买相应套餐核心请求参数中以下三项需要特别关注keywords搜索关键词如星巴克、三甲医院types行业分类代码餐饮为050000教育为141200city城市名称或行政区代码支持北京或110000格式# 基础请求URL模板 base_url https://restapi.amap.com/v3/place/text?key{}keywords{}city{}page{}2. 分页获取完整POI数据高德API默认每页返回20条记录通过page参数控制翻页。我们需要循环请求直到获取全部数据。这里有个关键技巧通过判断返回结果的count字段是否为0来终止循环。def get_all_pois(api_key, keyword, city): poi_list [] page 1 while True: current_url base_url.format(api_key, quote(keyword), quote(city), page) response requests.get(current_url) data response.json() if data[count] 0: break poi_list.extend(data[pois]) page 1 # 防止请求过于频繁 time.sleep(0.2) return poi_list实际测试发现单次搜索最多只能获取900条记录。对于数据量大的区域建议按行政区划分多次查询使用多边形搜索法替代关键词搜索组合不同类型代码分批获取3. 数据清洗与坐标转换原始数据包含大量字段我们需要提取核心信息并进行坐标系转换。高德使用GCJ-02坐标系与国际通用的WGS-84存在偏移必须进行转换才能与GPS设备数据匹配。关键字段处理逻辑def process_poi(poi): # 提取基础信息 name poi.get(name, ) address poi.get(address, ) tel poi.get(tel, ).split(;)[0] # 取第一个电话号码 # 处理坐标 raw_location poi[location].split(,) lng, lat gcj02_to_wgs84(float(raw_location[0]), float(raw_location[1])) return { name: name, address: address, tel: tel, lng: lng, lat: lat }坐标转换函数实现基于公开算法import math def gcj02_to_wgs84(lng, lat): # 转换参数 a 6378245.0 ee 0.00669342162296594323 # 转换计算 dlat transform_lat(lng - 105.0, lat - 35.0) dlng transform_lng(lng - 105.0, lat - 35.0) radlat lat / 180.0 * math.pi magic math.sin(radlat) magic 1 - ee * magic * magic sqrtmagic math.sqrt(magic) dlat (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi) dlng (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi) return [lng - dlng, lat - dlat]4. 数据存储与可视化处理后的数据可以保存为多种格式。Excel因其普及性成为首选使用openpyxl库可以创建更现代的.xlsx文件from openpyxl import Workbook def save_to_excel(data_list, filename): wb Workbook() ws wb.active # 设置表头 headers [名称, 地址, 电话, 经度, 纬度] ws.append(headers) # 写入数据 for item in data_list: row [item[name], item[address], item[tel], item[lng], item[lat]] ws.append(row) # 自动调整列宽 for col in ws.columns: max_length 0 column col[0].column_letter for cell in col: try: if len(str(cell.value)) max_length: max_length len(str(cell.value)) except: pass adjusted_width (max_length 2) * 1.2 ws.column_dimensions[column].width adjusted_width wb.save(filename)进阶用户可以将数据导入QGIS或ArcGIS进行空间分析或使用Folium库生成交互式地图import folium def create_poi_map(poi_list, center_point): m folium.Map(locationcenter_point, zoom_start13) for poi in poi_list: folium.Marker( location[poi[lat], poi[lng]], popupf{poi[name]}br{poi[address]}, iconfolium.Icon(colorred) ).add_to(m) return m5. 实战案例商圈餐饮分析假设我们要分析北京朝阳区咖啡店分布情况完整流程如下确定搜索参数types: 050300 (餐饮-咖啡厅)city: 朝阳区获取原始数据coffee_shops get_all_pois(api_key, , 朝阳区, types050300)数据清洗processed_data [process_poi(shop) for shop in coffee_shops]结果存储save_to_excel(processed_data, 朝阳区咖啡店分布.xlsx)可视化分析center_point [39.92, 116.45] # 朝阳区中心坐标 coffee_map create_poi_map(processed_data, center_point) coffee_map.save(coffee_map.html)通过热力图分析可以发现朝阳区咖啡店主要集中在国贸、三里屯等商业区这与实际情况高度吻合。这种数据驱动的方法比传统调研效率提升10倍以上。6. 常见问题解决方案在实际操作中可能会遇到以下典型问题问题1返回数据不全原因单次查询900条限制解决方案缩小查询区域范围使用多边形搜索法按POI子类分批查询问题2坐标偏移明显原因未进行坐标系转换验证方法对比高德地图与Google地图同一位置坐标解决方案严格执行GCJ-02到WGS-84转换问题3请求被限制表现返回访问已超出每日配额解决方案控制请求频率建议200ms/次申请提高配额使用多个API Key轮询问题4特殊字符处理现象包含等字符的关键词查询失败解决方法from urllib.parse import quote safe_keyword quote(MMs)对于需要定期更新的项目可以结合Airflow等工具实现自动化采集。将整个流程封装为DAG任务设置每周自动运行并邮件发送最新数据报告。

更多文章