逆向解析:从公开GIS服务中高效获取城市控规数据

发布时间:2026/9/13 14:54:35

逆向解析:从公开GIS服务中高效获取城市控规数据 1. 从公开GIS服务获取城市控规数据的核心思路很多城市的规划部门都会提供在线GIS服务方便公众查询控规数据。但这些系统通常只支持单点查询不提供批量下载功能。逆向解析的核心思路是通过浏览器开发者工具分析网络请求找到数据接口的调用规律然后用代码模拟这些请求实现批量获取。我去年参与一个城市更新项目时需要获取东莞全市的控规数据。当时发现东莞控规查询系统http://120.86.191.153/DG.GisClient/default.aspx就是典型的ArcGIS Server架构。这类系统有个特点当你点击地图查询时浏览器会向后台发送包含坐标参数的请求返回JSON格式的地块信息。实际操作中我发现几个关键点系统使用RESTful API接口URL结构清晰可预测返回数据包含完整的空间几何信息和属性字段通过修改请求参数可以实现不同区域的数据获取需要处理坐标系转换和分页请求的问题2. 逆向分析ArcGIS REST API接口2.1 定位关键数据接口打开Chrome开发者工具F12切换到Network面板勾选Preserve log。在地图上点击任意地块时会发现一个关键的identify请求http://120.86.191.153:6080/arcgis/rest/services/KGCX/KGCX/MapServer/identify ?geometry12710257,2593523 geometryTypeesriGeometryPoint layersvisible:20 tolerance2 mapExtent12708661,2592799,12710891,2594657 imageDisplay1115,929,96 fjson tokensmLb_QfiJj_0mBbVF32JNFpCvn2PlHdRTRNRkwpRV_HB26u84puTMkLZWYjXTKbk8cucgJVlATcJUX9KvqM5Ew.. sr3857经过反复测试发现只有两个参数必须动态变化geometry查询点的坐标Web墨卡托坐标系EPSG:3857mapExtent当前地图视图范围2.2 参数优化技巧通过删减测试我总结出最小必要参数组合参数作用优化建议layers指定查询图层只保留控规图层20tolerance点击容差保持默认值2imageDisplay屏幕分辨率固定值不影响结果token访问令牌注意有效期特别要注意坐标系问题。该系统使用Web墨卡托坐标系EPSG:3857与我们常用的WGS84EPSG:4326不同。如果要做坐标转换可以用pyproj库from pyproj import Transformer transformer Transformer.from_crs(EPSG:4326, EPSG:3857) x, y transformer.transform(22.123, 113.456) # 纬度, 经度3. 设计自动化采集方案3.1 空间网格划分策略要实现全市数据采集需要解决空间覆盖问题。我的方案是将东莞范围划分为规则网格确定东莞的矩形范围Web墨卡托坐标xmin, ymin 12621272, 2591650 # 西南角 xmax, ymax 12715908, 2649830 # 东北角设置网格间距实测500米较合适delta 500 # 单位米 x_points np.arange(xmin, xmax delta, delta) y_points np.arange(ymin, ymax delta, delta)计算每个网格中心点坐标x_centers (x_points[:-1] x_points[1:]) / 2 y_centers (y_points[:-1] y_points[1:]) / 23.2 请求优化与错误处理直接高频请求会导致IP被封需要做以下优化随机延迟每个请求后暂停0.2-1秒异常重试捕获超时异常并自动重试断点续传记录已完成点位程序中断后可继续def safe_request(url, max_retry3): for i in range(max_retry): try: time.sleep(random.uniform(0.2, 1)) resp requests.get(url, timeout10) return resp.json() except Exception as e: print(f请求失败({i1}/{max_retry}): {e}) return None4. 数据处理与质量验证4.1 空间数据重构API返回的几何数据是坐标串格式需要转换为GeoDataFramefrom shapely.geometry import Polygon features [] for item in response[results]: rings item[geometry][rings] if len(rings) 1: # 简单多边形 geom Polygon(rings[0]) else: # 带洞的多边形 geom Polygon(rings[0], rings[1:]) features.append({ geometry: geom, **item[attributes] }) gdf gpd.GeoDataFrame(features, crsEPSG:3857)4.2 数据质量检查采集完成后需要验证覆盖率检查对比官方地图查看空白区域属性完整性检查字段缺失值几何有效性使用gdf.is_valid检查非法几何我发现在500米网格下东莞共获取36,972条记录但部分区域仍有遗漏。将网格缩小到300米后数据完整性显著提升。5. 完整代码实现以下是整合后的自动化采集脚本import numpy as np import pandas as pd import geopandas as gpd import requests import time import random from shapely.geometry import Polygon # 配置参数 BASE_URL http://120.86.191.153:6080/arcgis/rest/services/KGCX/KGCX/MapServer/identify TOKEN smLb_QfiJj_0mBbVF32JNFpCvn2PlHdRTRNRkwpRV_HB26u84puTMkLZWYjXTKbk8cucgJVlATcJUX9KvqM5Ew.. EXTENT [12621272, 2591650, 12715908, 2649830] # xmin, ymin, xmax, ymax def generate_grid(extent, delta500): 生成采样点网格 x np.arange(extent[0], extent[2] delta, delta) y np.arange(extent[1], extent[3] delta, delta) return [(xx, yy) for xx in (x[:-1]x[1:])/2 for yy in (y[:-1]y[1:])/2] def fetch_parcel_data(x, y): 获取单个点位数据 params { geometry: f{x},{y}, geometryType: esriGeometryPoint, layers: visible:20, tolerance: 2, mapExtent: ,.join(map(str, EXTENT)), imageDisplay: 1115,929,96, f: json, token: TOKEN, sr: 3857 } try: resp requests.get(BASE_URL, paramsparams, timeout10) return resp.json().get(results, []) except: return [] def process_batch(points, batch_size100): 批量处理采集任务 all_features [] for i, (x, y) in enumerate(points): print(f进度: {i1}/{len(points)}) results fetch_parcel_data(x, y) for item in results: rings item[geometry][rings] geom Polygon(rings[0], rings[1:]) if len(rings)1 else Polygon(rings[0]) all_features.append({**item[attributes], geometry: geom}) time.sleep(random.uniform(0.2, 0.5)) return gpd.GeoDataFrame(all_features, crsEPSG:3857) if __name__ __main__: sampling_points generate_grid(EXTENT, delta300) gdf process_batch(sampling_points) gdf.to_file(dongguan_control_plan.shp)6. 工程化建议在实际项目中还需要考虑增量更新记录已采集的地块ID避免重复请求分布式采集使用Scrapy等框架实现多线程数据存储建议使用PostGIS数据库管理可视化监控实时显示采集进度和成功率我曾遇到token过期的问题解决方案是定期从网页源码中提取新token。也可以通过模拟登录获取有效token但这需要分析网站的认证机制。这种逆向方法不仅适用于控规数据也可以用于其他基于ArcGIS Server的公共GIS服务如国土空间规划、不动产登记等系统。关键是要理解REST API的调用规则并设计合理的空间采样策略。
延伸阅读

更多相关文章

2026/9/11 12:09:49

小米269元智能音箱评测:高性价比智能家居控制中心

这次我们来看智能音箱的市场选择,特别是小米这款269.1元的高性价比产品。对于想要入手智能家居控制中心或者提升家庭娱乐体验的用户来说,价格和功能的平衡是关键考量因素。智能音箱已经不再是简单的音乐播放设备,而是成为了智能家居的中枢控制…

2026/9/12 9:43:18

从汇编到Cache:湖南大学CS-2019期末核心考点实战剖析

1. 汇编指令实战解析:从填空题到综合题 湖南大学CS-2019期末试卷的第一大题填空题,看似简单却暗藏玄机。以第3小题为例,题目给出了寄存器值和内存地址映射关系,要求分析 addl 指令执行后的内存变化。这种题型考察的是对x86寻址方…

2026/9/10 22:35:02

ZYNQ-FPGA高速AD/DA环路测试:从正弦波生成到ILA验证

1. 高速AD/DA系统设计基础 在ZYNQ-FPGA平台上构建高速AD/DA测试环路,首先要理解几个核心概念。AD(模数转换)和DA(数模转换)就像电子系统的翻译官——DA负责把数字世界的0和1转换成模拟信号,AD则把现实世界的…

2026/9/13 14:52:45

可食用程序技术:从二维码到生物编码的创新应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 14:52:45

GD32F103手搓FreeRTOS内核:从启动文件到上下文切换全链路解析

1. 项目概述:这不是“点灯”,而是一次嵌入式系统认知的彻底重装“点灯大师进阶,从手搓操作系统开始(10)”——这个标题乍看像极了嵌入式新手教程里常见的“点亮LED”彩蛋,但括号里的“(10&#…

2026/9/13 14:52:45

gRPC-Go 客户端创建反模式与 RPC 错误处理最佳实践

gRPC-Go 客户端创建反模式与 RPC 错误处理最佳实践 【免费下载链接】grpc-go The Go language implementation of gRPC. HTTP/2 based RPC 项目地址: https://gitcode.com/GitHub_Trending/gr/grpc-go 本文以 grpc-go 仓库的 anti-patterns.md 为核心,系统梳…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码