1. 高德地图POI数据能做什么当你打开外卖软件点餐时为什么系统总能精准推荐3公里内的餐厅当你搜索附近加油站导航APP为什么能立即列出所有选项这背后都离不开POI数据的支持。POIPoint of Interest中文叫兴趣点简单理解就是地图上所有带名字的地点——从街角的奶茶店到市中心的医院都是POI。我在做社区商业分析项目时曾经需要获取某城市所有教育机构的分布数据。如果靠人工收集可能要花两周时间跑遍全城。但用高德地图的POI接口写个Python脚本半小时就拿到了800多条结构化数据包括机构名称、详细地址、经纬度坐标等关键信息。这类数据特别适合做市场调研需要分析竞品门店分布开发本地生活类APP要集成商家信息做城市规划研究商业设施密度写论文需要某类场所的地理数据不过要注意高德官方对免费接口有调用频次限制每天最多1000次商业用途需要购买企业版服务。接下来我会手把手教你从零开始获取这些数据。2. 申请API前的准备工作2.1 注册开发者账号首先打开高德开放平台官网直接搜索就能找到点击右上角的注册按钮。这里有个小坑建议用企业邮箱注册个人邮箱后期申请更高权限时会比较麻烦。我当初用QQ邮箱注册后来要升级企业认证时又重走了一遍流程。注册时需要准备手机号接收验证码邮箱建议公司域名邮箱身份证正反面照片个人认证用营业执照企业认证需要2.2 创建应用获取Key登录后进入控制台在应用管理里点击创建新应用。这里的关键是应用类型选择如果是学习测试用选出行或生活服务类商业项目建议选电商或工具创建完成后会看到添加Key的按钮这里要注意几个参数Key名称建议包含项目名环境如ShopAnalysis_Dev服务平台选Web服务不要选Android/iOSIP白名单测试阶段可以先填0.0.0.0/0上线前务必修改点击确认后你会得到一个32位的字符串这就是调用API的通行证。我习惯把它保存在项目的config.ini文件里千万不要直接硬编码在代码中——有次我不小心把包含Key的代码传到GitHub结果第二天就收到高德的警告邮件。3. 编写数据获取脚本3.1 基础请求构造先安装必要的Python库pip install requests pandas这是最简版的请求代码框架import requests import pandas as pd def fetch_poi(api_key, region, keywords, types): base_url https://restapi.amap.com/v3/place/text params { key: api_key, keywords: keywords, types: types, region: region, city_limit: true, page_size: 20, page: 1 } response requests.get(base_url, paramsparams) return response.json()实测发现三个易错点region参数要精确到市或区如北京市或朝阳区types参数要用高德的标准分类编码如餐饮是050000返回的JSON里count字段可能比实际数据量少3.2 分页处理技巧高德默认每页返回20条数据当数据量大时需要处理分页。我封装了个带自动翻页的版本def get_all_pois(api_key, region, keywords, types, max_pages50): all_pois [] current_page 1 while current_page max_pages: data fetch_poi(api_key, region, keywords, types, current_page) if not data[pois]: break all_pois.extend(data[pois]) print(f已获取第{current_page}页累计{len(all_pois)}条数据) # 检查是否还有下一页 if len(data[pois]) 20: break current_page 1 time.sleep(0.5) # 避免触发限流 return all_pois这里有个实用技巧在循环里加个time.sleep(0.5)能有效避免QPS超限的错误。有次我连续快速请求结果IP被临时封禁了半小时。4. 数据解析与存储4.1 关键字段提取POI返回的字段多达40个但常用的是这些def parse_poi(poi): return { id: poi.get(id), name: poi.get(name), address: poi.get(address), location: poi.get(location), # 格式经度,纬度 district: poi.get(pname) poi.get(cityname) poi.get(adname), type: poi.get(type), tel: poi.get(tel), business_area: poi.get(business_area) }特别注意location字段的处理# 拆分成单独经纬度 lon, lat poi[location].split(,)4.2 存储方案对比根据数据量不同我有三种常用存储方案数据规模存储方式优点缺点1000条CSV文件无需数据库Excel可直接打开重复获取会覆盖1万~10万SQLite单文件、支持查询需要SQL知识10万条MySQL支持复杂分析需要部署服务小规模数据推荐用pandas直接存CSVdf pd.DataFrame(parsed_pois) df.to_csv(pois.csv, indexFalse, encodingutf_8_sig) # 注意编码5. 实战中的常见问题5.1 数据不全怎么办有次我获取某商圈餐饮数据API只返回200条但实际肯定不止。后来发现是高德的默认排序规则导致的解决方案是按距离排序添加params[sortrule] distance多关键词轮询如把火锅拆成重庆火锅、老北京涮肉等缩小区域范围改区级查询为街道级5.2 字段缺失处理比如有些POI没有电话号码tel poi.get(tel, ).split(;)[0] if poi.get(tel) else 暂无对于复合字段如business_area建议先检查是否存在areas poi[business_area].split(,) if business_area in poi else []5.3 性能优化技巧当需要获取多个区域数据时使用线程池但注意QPS限制from concurrent.futures import ThreadPoolExecutor regions [朝阳区, 海淀区, 丰台区] with ThreadPoolExecutor(max_workers3) as executor: results list(executor.map(lambda r: get_all_pois(api_key, r), regions))使用本地缓存避免重复请求from diskcache import Cache cache Cache(poi_cache) cache.memoize(expire86400) def cached_fetch(region, keywords): return get_all_pois(api_key, region, keywords)6. 合法合规使用建议高德API的免费额度是个人开发者每日1000次企业认证每日10万次几个红线不能碰严禁缓存数据超过7天需定期更新不能将原始数据转售前端展示必须使用高德地图我通常会在代码里加入用量统计def check_quota(api_key): url fhttps://restapi.amap.com/v3/status/query?key{api_key} res requests.get(url).json() print(f今日已用{res[usage]}次剩余{res[quota]}次)如果是商业项目建议购买企业套餐。去年我们做全国连锁店选址分析时购买了50万次/月的套餐平均每次调用成本约0.003元比人工调研便宜两个数量级。