高德地图POI数据采集实战:从API申请到坐标转换的完整流程

发布时间:2026/5/25 18:15:25

高德地图POI数据采集实战:从API申请到坐标转换的完整流程 1. 高德地图POI数据采集入门指南第一次接触POI数据采集的朋友可能会觉得这是个高大上的技术活其实说白了就是批量获取地图上的店铺、景点这些位置信息。我在做商业分析项目时经常需要抓取某个城市所有餐饮店或零售店的数据高德地图的API确实帮了大忙。POIPoint of Interest简单理解就是地图上那些你感兴趣的点比如餐馆、商场、加油站等。高德地图提供了丰富的POI数据通过他们的开放平台API我们可以按条件搜索这些数据。举个例子如果你想分析武汉光谷地区的奶茶店分布情况用这套方法半小时就能拿到所有门店的详细数据。2. 高德开放平台准备工作2.1 账号注册与Key申请首先得去高德开放平台注册账号这个过程跟注册普通网站差不多。重点在于申请Key相当于API的使用权限。我建议直接用个人手机号注册企业账号需要额外材料比较麻烦。创建应用时有个关键点一定要选Web服务类型我见过好几个新手选了Android或iOS结果代码死活调不通。创建完成后把生成的Key复制保存好这个Key后面所有API请求都要用到。2.2 API调用限额与优化免费版每天有3000次的调用限额对于小规模数据采集完全够用。如果要做全市范围的采集建议按行政区划分批请求设置合理的请求间隔做好本地缓存避免重复请求实测发现连续快速请求可能会被限流建议每次请求后加个0.5秒的延迟这样最稳定。3. POI搜索API实战解析3.1 核心参数详解高德的Place API文档看起来参数很多其实常用的就这几个keywords搜索关键词比如奶茶city限定城市支持城市名或行政区代码typesPOI类型可以用分类代码更精准offset每页返回数量最大25page页码配合offset实现分页这里有个坑要注意city参数如果写城市名最好加上市字比如武汉市比武汉更准确。3.2 Python请求示例代码import requests from urllib.parse import quote amap_key 你的Key # 替换成你的实际Key base_url https://restapi.amap.com/v3/place/text def search_poi(city, keyword, page1): params { key: amap_key, city: quote(city), keywords: quote(keyword), offset: 25, page: str(page), extensions: all } response requests.get(base_url, paramsparams) return response.json()这个基础函数已经能完成单页查询返回的是JSON格式数据。我建议先用这个简单版测试Key是否生效再继续开发完整功能。4. 完整数据采集方案4.1 分页获取全量数据高德API的单次请求最多返回25条数据要获取更多就得用分页。我通常这样做先发一次测试请求获取总条数计算需要分几页循环请求所有页面合并去重def get_all_pois(city, keyword): all_pois [] page 1 while True: data search_poi(city, keyword, page) if not data[pois]: # 没有数据时退出循环 break all_pois.extend(data[pois]) if len(all_pois) int(data[count]): break page 1 return all_pois4.2 多线程加速采集当需要采集大量数据时单线程太慢。可以用concurrent.futures实现多线程from concurrent.futures import ThreadPoolExecutor def batch_search(keywords, city): with ThreadPoolExecutor(max_workers5) as executor: results list(executor.map( lambda kw: get_all_pois(city, kw), keywords )) return {kw: res for kw, res in zip(keywords, results)}注意线程数不要设太高5-10个比较合适否则容易触发API限流。5. 坐标转换关键技术5.1 为什么需要坐标转换高德返回的坐标是GCJ-02坐标系俗称火星坐标而国际通用的GPS设备使用WGS-84坐标系。直接使用会导致地图显示偏移几百米这个坑我踩过。5.2 转换算法实现以下是经过验证的坐标转换代码import math def gcj02_to_wgs84(lng, lat): # 检查是否在国内 if not (73.66 lng 135.05 and 3.86 lat 53.55): return lng, lat a 6378245.0 # 长半轴 ee 0.00669342162296594323 # 偏心率平方 # 转换计算 dlat _transformlat(lng - 105.0, lat - 35.0) dlng _transformlng(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) mglat lat dlat mglng lng dlng return lng * 2 - mglng, lat * 2 - mglat这个算法实测误差在1米以内完全满足商业分析需求。6. 数据存储与导出6.1 Excel存储方案用xlwt库写入Excel是最简单的方案import xlwt def save_to_excel(data, filename): workbook xlwt.Workbook() sheet workbook.add_sheet(POI数据) # 写表头 headers [名称, 地址, 经度, 纬度, 行政区] for col, header in enumerate(headers): sheet.write(0, col, header) # 写数据 for row, poi in enumerate(data, 1): lng, lat gcj02_to_wgs84(*map(float, poi[location].split(,))) sheet.write(row, 0, poi[name]) sheet.write(row, 1, poi[address]) sheet.write(row, 2, lng) sheet.write(row, 3, lat) sheet.write(row, 4, poi[adname]) workbook.save(filename)6.2 数据清洗技巧原始数据经常会有这些问题地址缺失或格式不统一重复POI分页导致坐标异常值我通常用pandas做清洗import pandas as pd def clean_data(df): # 去重 df df.drop_duplicates(subset[name, location]) # 处理缺失值 df[address] df[address].fillna(未知地址) # 过滤异常坐标 df df[(df[lng] 73) (df[lng] 136) (df[lat] 3) (df[lat] 54)] return df7. 常见问题解决方案7.1 API返回空数据可能原因Key未启用或类型不对城市名称写错比如写简称分类代码错误建议先用高德官网的Place API测试工具验证参数是否正确。7.2 坐标偏移问题如果发现导出的数据在地图上显示位置不对确认是否做了坐标转换检查转换函数是否正确测试几个已知地点的坐标7.3 请求被拒绝返回INVALID_USER_KEY错误时检查Key是否复制完整确认Key对应的平台类型查看账户余额是否充足我在实际项目中遇到过最头疼的问题是分页数据重复后来发现是高德API本身的特性解决办法是在代码中做去重处理。另一个坑是部分新开的店铺可能不在POI数据中这种情况只能定期更新数据或者结合其他数据源补充。

相关新闻