发布时间:2026/7/15 9:49:39
逆向解析:从公开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/7/15 9:49:39

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

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

2026/7/15 9:49:39

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

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

2026/7/15 9:49:39

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

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

2026/7/15 11:50:22

TR-069协议核心机制剖析与高效运维实战

1. TR-069协议基础认知 第一次接触TR-069时,我正负责一个运营商级光猫管理项目。当时团队被设备远程配置问题困扰——每次新设备入网都需要工程师现场调试,效率极低。直到发现这个藏在宽带论坛技术报告中的协议,才真正打开了自动化运维的大门…

2026/7/15 11:50:22

群体基因组学揭示:面包小麦跨欧亚大陆扩张的适应性进化图谱

1. 面包小麦的起源与驯化之谜 面包小麦作为人类最早驯化的谷物之一,其起源一直是科学家们关注的焦点。最新研究表明,面包小麦的驯化过程远比我们想象的复杂。通过对795份小麦样本的全基因组测序分析,研究人员发现面包小麦起源于里海西南部地区…

2026/7/15 11:50:22

3分钟上手OBS多平台直播插件:obs-multi-rtmp完全指南与实战技巧

3分钟上手OBS多平台直播插件:obs-multi-rtmp完全指南与实战技巧 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 想要在多个直播平台同步推流,却苦于重复配置的繁…

2026/7/14 12:47:32

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/14 12:47:31

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…