实战指南:利用QGIS与GeoHey插件实现高德POI数据清洗与坐标纠偏

张开发
2026/4/18 7:56:28 15 分钟阅读

分享文章

实战指南:利用QGIS与GeoHey插件实现高德POI数据清洗与坐标纠偏
1. 为什么需要清洗高德POI数据很多刚接触地理信息分析的朋友可能会有疑问直接从高德地图获取的POI数据为什么还需要清洗这里涉及两个关键问题坐标偏移和数据规范。高德地图使用的是GCJ-02坐标系俗称火星坐标这与国际通用的WGS-84坐标系存在系统性偏移。这种偏移在国内地图服务中很常见目的是出于安全考虑。但当我们把这些数据导入GIS系统做分析时如果不进行坐标转换就会出现点位与卫星影像、OpenStreetMap等底图对不齐的情况。另一个痛点是原始数据的格式问题。高德API返回的JSON数据包含大量冗余字段而实际分析可能只需要部分关键信息。比如一个商场POI可能包含50多个字段但我们做商业分析时可能只需要名称、类型、坐标等基础数据。未经处理的数据会降低后续分析效率增加存储负担。我在去年帮一家连锁便利店做选址分析时就踩过这个坑。当时直接使用了高德原始数据结果生成的heatmap和实际街景完全对不上差点导致选址错误。后来花了三天时间重新处理数据才解决问题。2. 工具准备与环境搭建2.1 QGIS安装与配置QGIS是目前最强大的开源GIS软件建议直接安装最新长期支持版LTR。Windows用户可以从官网下载OSGeo4W安装包它包含了QGIS和Python环境。安装时记得勾选Advanced Install选项确保安装所有必需组件。Mac用户推荐通过Homebrew安装brew install qgis安装完成后需要做几个关键设置在设置→选项中启用Processing Toolbox将默认CRS设为EPSG:4326WGS84在Python控制台中检查requests库是否可用2.2 GeoHey插件安装GeoHey Toolbox是处理国内地图数据的瑞士军刀。安装方法很简单打开QGIS进入插件→管理和安装插件搜索GeoHey Toolbox点击安装按钮安装后需要激活打开Processing→Toolbox点击右上角齿轮图标进入选项在Providers列表中找到GeoHey Toolbox并勾选激活如果遇到插件不显示的情况可以尝试重启QGIS或者检查Python环境是否完整。我在Ubuntu系统上就遇到过这个问题最后通过重新安装python3-qgis包解决了。3. 获取高德POI数据3.1 申请API Key首先需要在高德开放平台注册开发者账号访问lbs.amap.com注册后进入控制台创建新应用选择Web服务API类型记下生成的Key这个相当于数据访问的密码免费版每天有2000次的调用限额对于小型项目足够用。如果是商业项目建议购买企业套餐。我曾经因为没注意限额在中午12点就把当日配额用完了导致下午的工作被迫中断。3.2 使用Python获取数据这里提供一个增强版的Python脚本增加了异常处理和字段过滤import requests import csv from datetime import datetime API_KEY 你的Key KEYWORD 咖啡厅 CITY 杭州 OUTPUT_FILE famap_poi_{datetime.now().strftime(%Y%m%d)}.csv def get_pois(): base_url https://restapi.amap.com/v3/place/text params { key: API_KEY, keywords: KEYWORD, city: CITY, offset: 20, page: 1, extensions: base } all_pois [] while True: try: resp requests.get(base_url, paramsparams, timeout15) data resp.json() if data[status] ! 1: print(f请求失败: {data.get(info)}) break pois data[pois] if not pois: break for poi in pois: clean_poi { id: poi[id], name: poi[name], address: poi[address], lng: float(poi[location].split(,)[0]), lat: float(poi[location].split(,)[1]), type: poi[type] } all_pois.append(clean_poi) print(f已获取第{params[page]}页共{len(pois)}条数据) params[page] 1 except Exception as e: print(f发生错误: {str(e)}) break return all_pois def save_to_csv(pois): with open(OUTPUT_FILE, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[id,name,address,lng,lat,type]) writer.writeheader() writer.writerows(pois) print(f数据已保存至{OUTPUT_FILE}) if __name__ __main__: pois get_pois() save_to_csv(pois)这个脚本相比基础版有几个改进自动生成带日期的文件名增加了超时和异常处理只保留核心字段减少数据体积使用utf-8-sig编码避免Excel打开乱码4. 数据清洗与坐标转换4.1 导入数据到QGIS在QGIS中导入CSV的注意事项使用图层→添加图层→添加分隔文本图层X字段选择lngY字段选择lat几何图形定义选择点坐标CRS暂时选择EPSG:4326实际还是GCJ-02坐标导入后会发现点位与OSM底图有偏移这是正常现象。我曾经犯过一个错误以为导入时直接选择GCJ-02的CRS就能解决问题后来发现QGIS并没有内置GCJ-02的坐标系统定义。4.2 使用GeoHey转换坐标转换步骤打开Processing Toolbox搜索GeoHey选择GCJ02 to WGS84工具设置输入图层和输出路径点击运行转换完成后新图层的点位应该与底图完美对齐。如果不确定转换是否成功可以用这个技巧验证找一个地标建筑比如天安门在高德地图和Google地图上分别查看它的坐标比较两者的差异。4.3 数据质量检查转换完成后建议做以下检查检查空值有些POI可能缺少关键字段检查坐标范围确保没有异常值比如经度超过180检查重复数据相同ID的POI不应该重复出现我常用的质量检查SQL语句在QGIS的DB Manager中执行-- 查找重复ID SELECT id, COUNT(*) as cnt FROM poi_data GROUP BY id HAVING COUNT(*) 1; -- 查找坐标异常值 SELECT * FROM poi_data WHERE lng 70 OR lng 140 OR lat 10 OR lat 55;5. 进阶技巧与实战应用5.1 批量处理多个城市数据当需要处理多个城市的数据时可以修改Python脚本实现批量抓取。这里有个小技巧先获取城市的adcode行政区划代码然后用循环处理每个城市。高德提供了行政区域查询APIdef get_city_codes(): url https://restapi.amap.com/v3/config/district params { key: API_KEY, keywords: 中国, subdistrict: 2 } resp requests.get(url, paramsparams) data resp.json() return [ (district[name], district[adcode]) for district in data[districts][0][districts] ]5.2 与人口数据结合分析清洗后的POI数据可以与其他数据源结合比如人口普查数据。在QGIS中可以使用连接属性表功能将POI与人口统计区域关联起来。举个例子分析咖啡厅分布与人口密度的关系加载人口统计区域图层使用点位于多边形工具统计每个区域内的咖啡厅数量计算每万人拥有的咖啡厅数量使用热力图或分级符号可视化结果5.3 自动化工作流设计对于需要定期更新的项目可以设计自动化工作流使用Python脚本定时获取最新POI数据用QGIS Processing模型实现自动转换和清洗设置定时任务Linux用cronWindows用任务计划程序一个简单的QGIS Processing模型可以包含以下步骤导入CSV坐标转换字段计算添加时间戳等元数据导出为GeoPackage6. 常见问题解决方案6.1 坐标转换后仍有偏移有时候即使使用了GeoHey转换点位还是会有轻微偏移。这可能是因为使用了错误的转换工具高德用GCJ02百度用BD09图层CRS设置不正确底图本身的坐标系问题解决方案确认数据来源高德、百度还是其他检查所有图层的CRS是否一致尝试使用不同的底图做对比6.2 插件无法正常使用如果GeoHey Toolbox无法正常工作可以尝试重新安装插件检查QGIS版本兼容性在GeoHey官网查找最新版本尝试使用Python库如coord-convert作为替代方案6.3 数据量过大导致卡顿处理几万条POI数据时QGIS可能会变慢。优化建议使用GeoPackage代替Shapefile建立空间索引按区域分块处理数据使用PostGIS数据库存储大数据集7. 数据可视化与应用案例清洗后的POI数据可以用于多种分析场景。去年我们帮一个零售客户做的分析流程是这样的获取竞品门店POI5000点位转换坐标并与人口数据叠加计算每个网格的竞争指数竞品数量/潜在客群规模识别竞争薄弱区域结合客流数据验证选址最终帮助客户确定了3个最佳开店位置开业后业绩都超出了预期。这个案例中准确的数据清洗和坐标转换是分析可靠性的基础。另一个有趣的应用是城市功能混合度分析获取餐饮、零售、办公等各类POI计算每个网格内的POI类型多样性可视化展示城市活力分布结合房价数据发现价值洼地这种分析对城市规划很有参考价值可以帮助识别需要功能优化的区域。

更多文章