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

发布时间:2026/10/29 22:07:07

逆向解析:从公开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/10/29 22:06:11

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

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

2026/10/28 18:37:38

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

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

2026/10/24 23:02:03

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

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

2026/10/29 22:04:51

具身智能导航架构:从原理到工程实践

1. 具身智能导航架构概述 具身智能导航架构是近年来机器人学和人工智能交叉领域最具突破性的研究方向之一。与传统的基于规则或SLAM的导航系统不同,具身智能强调"身体在环境中的智能表现",其核心在于将感知、决策与物理执行视为一个有机整体。…

2026/10/29 22:04:51

具身智能导航架构:从模块化到端到端的技术演进

1. 具身智能导航架构的技术背景与核心挑战在机器人学和人工智能的交叉领域,具身智能(Embodied Intelligence)正经历着革命性的发展。这种智能形态强调智能体必须通过物理身体与真实环境进行交互来获得认知能力。导航作为具身智能最基础也最具挑战性的能力之一&#…

2026/10/29 22:04:51

404页面与多媒体内容的SEO优化实战

1. 网站纠错页面的SEO价值解析404错误页面是每个网站都无法避免的存在,但大多数站长往往忽视了它的SEO潜力。实际上,精心设计的纠错页面不仅能降低跳出率,还能成为流量挽回的利器。我在管理多个企业官网时发现,优化后的404页面平均…

2026/10/29 22:04:51

AI驱动的工程建设变更管理系统架构与实现

1. 项目背景与核心价值在工程建设领域,变更管理一直是项目成本控制和进度管理的痛点。传统模式下,设计变更单、现场签证等文件流转慢,工程量清单更新滞后,经常出现"月结季清"时才发现成本超支的情况。我们团队开发的这套…

2026/10/29 21:59:49

Caveman Debugging:用print语句和二分法徒手定位Bug的实战指南

"caveman"这个标题,在开发者圈子里其实是个挺有意思的"黑话"。它通常不是指《摩登原始人》,也不是啥考古项目,而是指那种"原始人式"的排错手段——说白了,就是不用高端调试器、不搞分布式追踪&…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

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

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

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