实战指南:利用QGIS与GeoHey插件实现高德POI数据清洗与坐标纠偏
2026/4/18 7:56:22 网站建设 项目流程

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

安装完成后需要做几个关键设置:

  1. 在设置→选项中启用"Processing Toolbox"
  2. 将默认CRS设为EPSG:4326(WGS84)
  3. 在Python控制台中检查requests库是否可用

2.2 GeoHey插件安装

GeoHey Toolbox是处理国内地图数据的瑞士军刀。安装方法很简单:

  1. 打开QGIS,进入"插件→管理和安装插件"
  2. 搜索"GeoHey Toolbox"
  3. 点击安装按钮

安装后需要激活:

  1. 打开"Processing→Toolbox"
  2. 点击右上角齿轮图标进入选项
  3. 在"Providers"列表中找到GeoHey Toolbox并勾选激活

如果遇到插件不显示的情况,可以尝试重启QGIS或者检查Python环境是否完整。我在Ubuntu系统上就遇到过这个问题,最后通过重新安装python3-qgis包解决了。

3. 获取高德POI数据

3.1 申请API Key

首先需要在高德开放平台注册开发者账号:

  1. 访问lbs.amap.com
  2. 注册后进入控制台
  3. 创建新应用,选择"Web服务API"类型
  4. 记下生成的Key,这个相当于数据访问的密码

免费版每天有2000次的调用限额,对于小型项目足够用。如果是商业项目,建议购买企业套餐。我曾经因为没注意限额,在中午12点就把当日配额用完了,导致下午的工作被迫中断。

3.2 使用Python获取数据

这里提供一个增强版的Python脚本,增加了异常处理和字段过滤:

import requests import csv from datetime import datetime API_KEY = "你的Key" KEYWORD = "咖啡厅" CITY = "杭州" OUTPUT_FILE = f"amap_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, params=params, timeout=15) 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="", encoding="utf-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)

这个脚本相比基础版有几个改进:

  1. 自动生成带日期的文件名
  2. 增加了超时和异常处理
  3. 只保留核心字段,减少数据体积
  4. 使用utf-8-sig编码,避免Excel打开乱码

4. 数据清洗与坐标转换

4.1 导入数据到QGIS

在QGIS中导入CSV的注意事项:

  1. 使用"图层→添加图层→添加分隔文本图层"
  2. X字段选择lng,Y字段选择lat
  3. 几何图形定义选择"点坐标"
  4. CRS暂时选择EPSG:4326(实际还是GCJ-02坐标)

导入后会发现点位与OSM底图有偏移,这是正常现象。我曾经犯过一个错误,以为导入时直接选择GCJ-02的CRS就能解决问题,后来发现QGIS并没有内置GCJ-02的坐标系统定义。

4.2 使用GeoHey转换坐标

转换步骤:

  1. 打开Processing Toolbox
  2. 搜索"GeoHey"
  3. 选择"GCJ02 to WGS84"工具
  4. 设置输入图层和输出路径
  5. 点击运行

转换完成后,新图层的点位应该与底图完美对齐。如果不确定转换是否成功,可以用这个技巧验证:找一个地标建筑(比如天安门),在高德地图和Google地图上分别查看它的坐标,比较两者的差异。

4.3 数据质量检查

转换完成后建议做以下检查:

  1. 检查空值:有些POI可能缺少关键字段
  2. 检查坐标范围:确保没有异常值(比如经度超过180)
  3. 检查重复数据:相同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(行政区划代码),然后用循环处理每个城市。

高德提供了行政区域查询API:

def get_city_codes(): url = "https://restapi.amap.com/v3/config/district" params = { "key": API_KEY, "keywords": "中国", "subdistrict": "2" } resp = requests.get(url, params=params) data = resp.json() return [ (district["name"], district["adcode"]) for district in data["districts"][0]["districts"] ]

5.2 与人口数据结合分析

清洗后的POI数据可以与其他数据源结合,比如人口普查数据。在QGIS中可以使用"连接属性表"功能,将POI与人口统计区域关联起来。

举个例子,分析咖啡厅分布与人口密度的关系:

  1. 加载人口统计区域图层
  2. 使用"点位于多边形"工具统计每个区域内的咖啡厅数量
  3. 计算每万人拥有的咖啡厅数量
  4. 使用热力图或分级符号可视化结果

5.3 自动化工作流设计

对于需要定期更新的项目,可以设计自动化工作流:

  1. 使用Python脚本定时获取最新POI数据
  2. 用QGIS Processing模型实现自动转换和清洗
  3. 设置定时任务(Linux用cron,Windows用任务计划程序)

一个简单的QGIS Processing模型可以包含以下步骤:

  1. 导入CSV
  2. 坐标转换
  3. 字段计算(添加时间戳等元数据)
  4. 导出为GeoPackage

6. 常见问题解决方案

6.1 坐标转换后仍有偏移

有时候即使使用了GeoHey转换,点位还是会有轻微偏移。这可能是因为:

  1. 使用了错误的转换工具(高德用GCJ02,百度用BD09)
  2. 图层CRS设置不正确
  3. 底图本身的坐标系问题

解决方案:

  1. 确认数据来源(高德、百度还是其他)
  2. 检查所有图层的CRS是否一致
  3. 尝试使用不同的底图做对比

6.2 插件无法正常使用

如果GeoHey Toolbox无法正常工作,可以尝试:

  1. 重新安装插件
  2. 检查QGIS版本兼容性
  3. 在GeoHey官网查找最新版本
  4. 尝试使用Python库(如coord-convert)作为替代方案

6.3 数据量过大导致卡顿

处理几万条POI数据时,QGIS可能会变慢。优化建议:

  1. 使用GeoPackage代替Shapefile
  2. 建立空间索引
  3. 按区域分块处理数据
  4. 使用PostGIS数据库存储大数据集

7. 数据可视化与应用案例

清洗后的POI数据可以用于多种分析场景。去年我们帮一个零售客户做的分析流程是这样的:

  1. 获取竞品门店POI(5000+点位)
  2. 转换坐标并与人口数据叠加
  3. 计算每个网格的竞争指数(竞品数量/潜在客群规模)
  4. 识别竞争薄弱区域
  5. 结合客流数据验证选址

最终帮助客户确定了3个最佳开店位置,开业后业绩都超出了预期。这个案例中,准确的数据清洗和坐标转换是分析可靠性的基础。

另一个有趣的应用是城市功能混合度分析:

  1. 获取餐饮、零售、办公等各类POI
  2. 计算每个网格内的POI类型多样性
  3. 可视化展示城市活力分布
  4. 结合房价数据发现价值洼地

这种分析对城市规划很有参考价值,可以帮助识别需要功能优化的区域。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询