突破高德地图数量限制:基于四叉树递归的高德 POI 抓取技术
突破高德地图数量限制基于四叉树递归的高德 POI 抓取技术前言在地理空间数据GIS抓取领域高德地图Amap等服务商的 API 接口通常存在严格的返回数量限制。例如高德的搜索接口虽然强大但单次请求即便翻页也存在总量限制通常为 800-900 条或 20 页。对于北京、上海或杭州这样 POI兴趣点密集的城市仅靠单纯的翻页无法获取全量数据。根据笔者的测试设置page_num为第9分页的时候POI数据量为25分页1-8的数据量均为25然而当修改参数page_num为10的时候则数量量为0。本文将解读一套基于 Python 与 Shapely 库实现的“动态四叉树递归抓取”方案。该方案完美契合了技术文章《突破高德地图多边形搜索POI数据的数量限制—等大渔网栅格分割法》中的核心思想通过“分而治之”的策略实现了对高密度区域的无遗漏采集。核心痛点与解决思路痛点API 的“天花板”当你请求一个很大的矩形区域例如整个北京市时如果该区域内包含 5000 个“餐饮”POIAPI 只会返回前 800 个。剩下的 4200 个数据会被直接“截断”无论你如何调整page_num都无法获取。解决思路递归分裂Divide and Conquer参考文章中提到的核心算法如下探测尝试请求当前区域的数据。判断如果数据量达到 API 返回上限溢出说明当前区域过大数据过密。分裂将当前矩形切割成 4 个相等的子矩形左上、右上、左下、右下。递归对这 4 个子区域重复上述步骤直到数据量未溢出或达到最小面积限制。代码实现深度剖析为了实现这一逻辑我首先需要知道一个城市的轮廓图的坐标。我已经收集了全国所有城市的轮廓坐标信息这个不再赘述。我 在几何计算上引入了Shapely库进行优化。以下是关键模块的解读1. 宏观调度初始网格化 (Initial Grid)在run方法中代码并没有直接把整个城市丢进递归函数而是先做了一次粗粒度的切分# 初始网格大小 (千米)INITIAL_GRID_KM100# ...whilecurr_lonmax_lon:whilecurr_latmax_lat:# 生成 100km * 100km 的大网格self.fetch_recursive(...)解读这是一个很好的工程实践。虽然递归可以处理所有情况但先将巨大的城市切割成若干个 100km 级别的区块可以减少单次递归栈的深度同时方便断点续传和并行处理如果未来扩展的话。2. 核心引擎递归与溢出检测 (fetch_recursive)这是整个脚本的灵魂所在。A. 空间裁剪优化 (Geometry Intersection)参考文章中提到的一个重要优化点是不要请求空白区域。我的代码通过shapely实现了这一检查# 1. 构造当前网格的 shapely 多边形current_boxbox(min_x,min_y,max_x,max_y)# 2. 空间判断如果当前网格跟城市轮廓完全不相交直接跳过ifnotself.city_geometry.intersects(current_box):return技术亮点在递归过程中网格会切得非常细。如果不加判断通过矩形切割会产生大量位于城市边缘但在城市轮廓GeoJSON之外的网格例如海面、荒山。通过intersects判断如果网格在边界外直接return极大地节省了 HTTP 请求次数和 API 配额。B. 溢出判断逻辑 (Overflow Detection)如何知道 API 是否“截断”了数据# 检查是否溢出如果是第 MAX_PAGE_NUM 页且数据填满了 PAGE_SIZE 条ifpageMAX_PAGE_NUMandlen(items)PAGE_SIZE:is_overflowTrueprint(f - [溢出] 区域{coord_param}数据过多准备分裂...)break解读如果设定最大翻页数为 7每页 25 条。如果你能翻到第 7 页且第 7 页还是满的25条这在概率上极大概率意味着后面还有第 8 页数据被丢弃了。这时标记is_overflow True触发分裂机制。C. 四叉树分裂 (Quadtree Splitting)当检测到溢出时代码执行经典的分裂操作ifis_overflowanddepth10:mid_x(min_xmax_x)/2mid_y(min_ymax_y)/2# 递归调用四个子区域self.fetch_recursive(min_x,mid_y,mid_x,max_y,depth1)# 左上self.fetch_recursive(mid_x,mid_y,max_x,max_y,depth1)# 右上self.fetch_recursive(min_x,min_y,mid_x,mid_y,depth1)# 左下self.fetch_recursive(mid_x,min_y,max_x,mid_y,depth1)# 右下这种逻辑能确保无论 POI 多么密集例如市中心的商圈网格都会自动细分到足够小例如 50米 x 50米直到能一次性把该小格子的数据完全拉取下来。代码与参考文章的异同点特性参考文章思路我的代码实现评价核心算法四叉树递归分割四叉树递归分割一致抓取核心稳固。无效区域过滤提及利用多边形判断使用shapely.intersects优秀利用专业库不仅准确且代码简洁。初始处理直接从最大边界开始先按 100km 切分初始网格我的更好适合处理超大城市或跨城抓取降低了单个递归树的复杂度。坐标系处理未详细描述手动计算经纬度步长够用但高纬度地区需注意经度变形代码中已包含cos(lat)修正。总结我的码是一份非常标准的高精度 POI 采集脚本。它不仅仅是简单的调用 API而是通过几何计算和递归算法解决了数据采集中的“有界性”难题。这种“检测-分裂-再检测”的模式就像显微镜一样在稀疏的郊区使用低倍镜大网格快速扫过在密集的市中心自动切换到高倍镜小网格细致观察。这正是爬虫工程中处理分布不均匀数据的最佳实践。之前分享的几个代码工具好多人在拿到链接后就立马取关实在是令人寒心。因此本篇文章只讲述思路给出关键部分代码不提供全部源码。

相关新闻

Qwen-Image-2512-ComfyUI效果实测:霓虹灯文字清晰不糊

Qwen-Image-2512-ComfyUI效果实测:霓虹灯文字清晰不糊

Qwen-Image-2512-ComfyUI效果实测:霓虹灯文字清晰不糊 1. 引言:为什么“霓虹灯文字”成了检验图像生成模型的试金石 你有没有试过让AI生成带文字的图?比如“赛博朋克风霓虹招牌”,结果文字不是糊成一团,就是笔画断裂…

2026/7/3 16:50:05 阅读更多 →
5分钟搞定语音情感分析,SenseVoiceSmall保姆级教程

5分钟搞定语音情感分析,SenseVoiceSmall保姆级教程

5分钟搞定语音情感分析,SenseVoiceSmall保姆级教程 你有没有遇到过这样的场景:客服录音里客户语气明显不耐烦,但文字转录只显示“请尽快处理”,完全丢失了情绪线索?或者短视频里突然响起的掌声和笑声,让AI…

2026/7/3 11:29:27 阅读更多 →
SAM 3镜像免配置部署:支持Windows WSL2环境,Ubuntu子系统快速验证

SAM 3镜像免配置部署:支持Windows WSL2环境,Ubuntu子系统快速验证

SAM 3镜像免配置部署:支持Windows WSL2环境,Ubuntu子系统快速验证 1. SAM 3模型简介 SAM 3是Meta推出的一个统一基础模型,专门用于图像和视频中的可提示分割任务。这个模型最大的特点是能够接受多种形式的提示输入,包括&#xf…

2026/7/3 16:50:14 阅读更多 →

最新新闻

如何从零开始构建专业的汽车总线测试环境:TSMaster实战指南

如何从零开始构建专业的汽车总线测试环境:TSMaster实战指南

如何从零开始构建专业的汽车总线测试环境:TSMaster实战指南 【免费下载链接】TSMaster A powerful open environment for automotive bus monitoring, simulation, testing, diagnostics, calibration and so on. It supports all kinds of mainstream hardware suc…

2026/7/4 4:58:23 阅读更多 →
面向小企业的 FMEA:风险分析的实用方法

面向小企业的 FMEA:风险分析的实用方法

FMEA简介在当今快节奏且竞争激烈的商业环境中,小型企业面临着众多可能影响其可持续性和发展的挑战。经营一家成功企业最关键的方面之一就是风险管理。失效模式与影响分析(FMEA)是一种结构化方法,有助于企业在潜在风险升级为代价高…

2026/7/4 4:58:23 阅读更多 →
Windows 11优化终极指南:用Win11Debloat让系统更快更安全

Windows 11优化终极指南:用Win11Debloat让系统更快更安全

Windows 11优化终极指南:用Win11Debloat让系统更快更安全 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…

2026/7/4 4:58:23 阅读更多 →
【Java从入门到入土】45:性能调优实战:从理论到实践

【Java从入门到入土】45:性能调优实战:从理论到实践

【Java从入门到入土】45:性能调优实战:从理论到实践 在Java后端开发中,性能问题是绕不开的“拦路虎”——线上服务突然CPU飙升、内存占用持续走高、GC频繁导致接口响应超时、线程死锁引发服务卡死……这些问题不仅影响用户体验,严…

2026/7/4 4:54:21 阅读更多 →
STM32F103C8T6的USB—CDC虚拟端口组件(HAL)

STM32F103C8T6的USB—CDC虚拟端口组件(HAL)

常见的STM32USB端口是Micro-USB,Type-C,USB-BT型口,USB-B方口我们最常见的32最小系统板上的USBD和D-就接到了PA11和PA12单片机I/O端口上新一版的小篮板STM32F103C8T6用的是Type-C,旧一版用的是Micro-USB,需要准备对应的线。我们主…

2026/7/4 4:54:21 阅读更多 →
Windows平台Appium 2.0自动化测试环境搭建与真机连接实战指南

Windows平台Appium 2.0自动化测试环境搭建与真机连接实战指南

1. 项目概述与核心价值如果你是一名移动端测试工程师、自动化开发或者对手机应用自动化感兴趣的技术爱好者,那么“在Windows上搭建一套完整的Appium 2.0 Android SDK环境,并成功连接真机”这件事,大概率是你职业生涯中绕不开的“第一道坎”。…

2026/7/4 4:52:21 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻