简介:一份面向国土资源信息化建设者与GIS从业人员的专业方案文档,系统归纳了“一张图”工程的总体建设思路。文档从发展现状与趋势切入,阐述建设必要性,围绕“二网、一中心、一平台”综合管理框架,给出总体建设目标、原则、架构与建设内容,并依次梳理总体部署、软硬件配置、技术基础与可行性、典型应用案例及方案特点。内容紧扣海量异构数据统一管理、多平台数据转换精度差异、业务系统分散割裂等现实痛点,提出基于MapGIS K9平台的整体解决路径,涉及TB级空间数据编辑、遥感影像处理、真三维动态建模与异构数据中间件等技术能力,兼顾数据建库、应用共享与二次开发,适合在国土“一张图”项目规划、数据整合、方案汇报或技术选型时参考。整份内容仅含1个PDF文件,大小约4.99MB,目录结构完整,章节划分清晰,便于按需查阅。目前已有84人浏览学习,可作为行业内同类解决方案的归纳素材。
1. 一张图工程的真正门槛是异构数据与业务串联
2010 年前后,多数省市县国土部门手里的数据比想象中的更乱:二调成果是 MapGIS 6X,规划库在 ArcGIS MDB 里,征地红线散落在 CAD 图纸中,遥感影像又是另一套 TIFF。领导要求“一张图”,但图本身不难画,难的是把格式、精度、坐标系、更新周期完全不同的数据统一放进一个库,还要能在用地审批时自动判断地块是否占用基本农田。这套郑州麦普的解决方案,把重点压在 MapGIS K9 与数据中心集成开发平台上,核心不是制图,而是建一套“异构数据统一入库 + 批供用补查业务串联动更新”的双通道系统。适合正在做自然资源信息化整合、数据治理,或者想理解国土业务系统怎么和 GIS 平台结合的人读。
2. 总体架构怎么搭:MapGIS K9 双通道设计
整套方案的骨架可以抽象成一句话:一个基础平台,两个子系统,一个共享数据库。基础平台是 MapGIS K9,两个子系统分别是 C/S 架构的数据管理子系统和 B/S 架构的业务审批子系统,它们不各自建库,而是从同一个数据仓库读写数据。这种做法在当年很超前,很多同类项目是“数据中心归数据中心,业务系统归业务系统”,数据口径对不上,到了年底汇总时才发现耕地面积对不齐。
2.1 为什么选 MapGIS K9 而不是 ArcGIS
选型理由在原文档里写得很直白:MapGIS K9 能直接编辑和管理 MapGIS 6X、MapGIS 7、ArcGIS、CAD 格式的矢量数据,以及 TIFF、MSI、GRD 等栅格数据,同时支持基于中间件的异构数据访问。注意“直接编辑”这个词,它不是通过转换格式来兼容,而是把异构数据当作同一类数据对象来处理。这在 TB 级数据规模下非常关键——如果每次入库都做格式转换,转换过程中的拓扑错误和属性丢失会消耗大量人工质检时间。
另一个选型理由是数据中心集成开发平台。该平台支持 SOA、组件式搭建开发,提供了五种可组合的能力:工作流、电子表单、构件仓库、搭建运行平台和国土业务插件。这意味着业务人员可以像搭积木一样组合出新的审批流程,而不是每次需求变化都找开发商改代码。日常国土业务涉及的土地利用现状、规划、基本农田、储量、矿业权、卫片执法等专题,都有现成插件可直接挂接。
2.2 C/S 与 B/S 的职责边界
系统按数据结构分成了两条使用路径。后台数据管理维护用 C/S 结构,运行在图形工作站上,负责数据检查入库、编辑处理、动态投影、数据更新和统计输出,面向数据中心管理员。前端业务应用用 B/S 结构,基于 MapGIS-IMS 技术发布,面向国土厅(局)处室、二级单位的业务人员,他们不需要安装客户端,登录局域网内网站点就能查图、办理审批、看统计报表。
这种设计的好处在于安全性和易用性兼顾。业务人员不接触原始数据,只能通过 Web 服务调用经过授权的图层和分析功能,避免了误操作导致底图数据被破坏;而专业的数据管理员在 C/S 端可以做细粒度的拓扑编辑和批量更新。下表是两套子系统在核心功能上的分配情况:
| 功能维度 | C/S 数据管理子系统 | B/S 业务审批子系统 |
|---|---|---|
| 核心定位 | 数据生产与维护 | 数据应用与决策 |
| 典型用户 | 数据中心管理员 | 处室业务人员、领导 |
| 主要功能 | 数据入库、编辑、更新、质检、备份 | 图层浏览、条件查询、叠加分析、案卷审批 |
| 数据操作 | 读写(含批量更新) | 只读(含空间分析) |
| 部署方式 | 图形工作站独立安装 | 浏览器访问(局域网/政务专网) |
| 数据更新机制 | 批量入库、增量包更新 | 实时查看已发布成果 |
2.3 分层架构的落地形态
从物理部署看,整个系统分成四层:
- 基础存储层:IP SAN 存储架构,承载 Oracle 10G 数据库文件与空间数据文件,省级数据量 2~4TB、市级 300~500GB、县级约 20GB。
- 数据服务层:GIS 数据服务器安装 Oracle 与空间数据引擎,完成数据的定义、存储、检索和完整性约束。
- WebGIS 服务层:负责接收浏览器端请求,调用 MapGIS IMS 组件完成地图出图、空间查询和业务分析,需要空间数据时再向数据服务层请求。
- 应用层:C/S 数据管理子系统直接连接数据服务层;B/S 业务审批子系统通过 WebGIS 服务层间接访问数据。
这套分层的核心价值在于把“数据管理”和“地图服务”拆开。即便 WebGIS 服务因并发过高而宕机,数据管理子系统依然可以正常工作,不会影响当天的数据入库任务。反过来,业务审批高峰期的大量地图浏览请求也不会直接压到数据库连接池上——IMS 服务层会在中间做地图缓存和请求合并。
提示:如果项目预算有限,可以先把 GIS 数据服务器和数据库服务器合并部署,等数据量涨到 TB 级再拆分。但要保证 IP SAN 存储独立,因为数据文件迁移的成本远比服务迁移高。
2.4 一张“图”的前端实现机制
B/S 端的地图浏览并不是简单地把整张图切成图片扔给前端。MapGIS-IMS 支持矢量和栅格图形的任意放大、缩小、移动漫游,图层的符号、线形、图案是实时生成的,同时支持图层叠加控制、多媒体属性查询、图元捕获与闪烁显示。也就是说,前端的地图渲染逻辑是动态的,用户打开图层控制面板勾选“基本农田保护区”,IMS 服务端才去数据库中抽取该图层数据并实时渲染,而不是全量加载。
数据加密传输也被写进了方案。B/S 发布模块对传输过程做加密控制,保证空间数据在政务专网上传输时不被截获。这一点在做跨部门数据共享时尤为重要——国土数据涉及地块权属和坐标,一旦泄露可能直接影响征拆补偿的核定。
3. 数据入库怎么做:格式、中间件与变更回溯
数据入库是“一张图”工程里最枯燥但最不能出错的环节。原方案里列出的入库方式很清晰:遥感影像数据支持 TIFF、MSI、GRD 格式,上载过程中可以选择删减带号;MapGIS 格式数据直接入库(6X、7X);ArcGIS 数据通过 SDE 中间件入 MDB、通过 ArcgisLocal 中间件入 Shapefile;此外还支持 VCT、E00、Mif、Dxf、Txt 等交换格式。删减带号这个功能非常实用——很多影像数据带分带信息,入库前不处理会导致跨带拼接时出现接边错位。
3.1 入库流程中的关键检查项
一个合格的数据入库流程,至少要包含四步检查:空间参考检查、几何完整性检查、属性完整性检查和重复性检查。下面这段 Python 脚本是我经常用来对入库前矢量数据做预检的简化版本,逻辑和原方案中“提供日志文件记录入库过程状态”的思路一致:
# ingest_precheck.py import json from osgeo import ogr def precheck_vector(path, expected_epsg=4490): """入库前矢量数据预检:检查空间参考、几何类型、属性缺失率""" ds = ogr.Open(path) layer = ds.GetLayer(0) # 1. 空间参考检查 srs = layer.GetSpatialRef() if srs is None or srs.GetAuthorityCode(None) != str(expected_epsg): print(f"[WARN] 空间参考异常: {srs.ExportToWkt()[:60] if srs else 'N/A'}") else: print(f"[ OK ] 空间参考 EPSG:{expected_epsg}") # 2. 几何与属性抽样检查 total = layer.GetFeatureCount() bad_geom = 0 null_attr = {} sample = 0 for feat in layer: sample += 1 geom = feat.GetGeometryRef() if geom is None or not geom.IsValid(): bad_geom += 1 for fld in ["DLBM", "QSXZ", "MJ"]: if fld in feat.keys() and feat.GetField(fld) is None: null_attr[fld] = null_attr.get(fld, 0) + 1 if sample >= 5000: break print(f"[INFO] 共 {total} 条要素,抽样 {sample} 条,无效几何 {bad_geom} 条") for fld, cnt in null_attr.items(): print(f"[WARN] 字段 {fld} 空值 {cnt} 条,占比 {cnt/sample*100:.1f}%") ds = None return bad_geom == 0 if __name__ == "__main__": # 依次传入;实际场景下按批次目录批量遍历 paths = json.loads(open("ingest_list.json").read()) for p in paths: precheck_vector(p)这段脚本做了三件事:校验图层空间参考是否为 CGCS2000(EPSG:4490),检查几何对象是否有效,抽样统计关键业务字段的空值率。bad_geom、null_attr和sample分别是无效几何计数、空值字段计数字典和抽样数,这些指标会汇总成入库日志。实际项目中,我会把检查结果写入一张INGEST_LOG表,包含批次号、文件路径、检查时间、通过状态和失败原因,便于后期回溯查库时定位问题数据。
提示:不要在生产库上直接跑全量检查。千万级以上要素的图层,空间参考和几何有效性检查建议用抽样方式,否则会拖垮数据库 I/O。
3.2 栅格数据入库的带号处理与金字塔
影像入库比矢量入库多一个环节——金字塔构建。一张 2GB 的 TIFF 影像不建金字塔直接发布,前端缩放一次的服务响应时间可能在十秒以上;建立金字塔后,每次缩放只读取对应级别的瓦片,响应时间能压到一秒以内。原方案中的“删减带号处理”发生在栅格上载阶段,作用是把影像自带的分带信息剥离,统一到数据库设定的坐标参考中。
常见做法是入库时按 5 个级别构建金字塔:原始分辨率、二分一、四分一、八分一、十六分一。数据量超过 500GB 时,建议拆分为 256×256 的瓦片块存储,配合 MapGIS K9 的多粒度空间索引,能让影像检索耗时控制在百毫秒级。这个多粒度索引机制也是原文档点名的关键技术之一,它的本质是给不同比例尺层级建立不同粒度的空间索引,避免用同一棵索引树调度所有等级的图斑。
3.3 变更数据入库:增量包与历史回溯
数据更新机制决定了系统能不能长效运行。方案设计了两种更新方式:以年度为单位接收县级更新数据进行批量更新,以变更增加为单位接收地方上报数据进行增量更新。增量包在入库前必须做拓扑一致性检查——如果一条公路拓宽导致两侧耕地地块边界变化,但更新包中只有公路要素没有相邻地块的变更信息,入库后就会出现图斑重叠。
原方案提到的“变更数据历史回溯”是另一个容易忽略的设计点。它在图斑层面保留了一条历史记录链:每次更新不是覆盖旧图斑,而是将旧图斑标记为“历史版本”,新图斑写入当前版本,两者通过变更前图斑ID字段关联。用这种设计,业务人员可以随时调出某个地块在五年内的变化记录,用于执法检查中认定违法占地的起始时间。
4. 批供用补查业务串联与空间分析实现
“一张图”区别于普通 GIS 展示系统的核心特征,是把业务逻辑织进空间数据里。原方案里有一个图,画的是土地管理业务板块之间的循环:农转用审批通过后,地块进入土地征收转用项目库;征收完成后进入储备库;供地后从储备库移除,同时登记发证;供地后进入交易或变更流程;开发整理项目补充耕地指标,又反哺到农转用的占补平衡校验。这五个环节就是国土行业常说的“批、供、用、补、查”。
4.1 案卷触发规则与网状关联
实现这个循环的机制叫“触发活动”。系统内置了一套规则引擎,定义不同案卷类型之间的先后、依赖关系。比如农转用审批启动前,系统会检查建设用地项目是否已完成补充耕地挂钩、用地指标是否充足;土地供应后,系统自动在不动产登记库中创建待办任务;供地项目超过约定开工时间未动工,监管模块会自动亮红灯。
每一类案卷都遵循统一的编号规则,包含行政区划代码、业务类型、年度和流水号。一个项目对应一个或多个案卷,案卷之间通过关联案卷ID形成网状结构。下面用一条 SQL 模拟从任意案卷出发回溯整个关联链条的逻辑,这种设计在工程上通常由数据中心的业务流程表支撑:
-- case_trace.sql -- 从指定案卷出发,依据前置案卷链回溯关联记录 WITH RECURSIVE trace AS ( SELECT case_id, pre_case_id, project_no, status, 1 AS depth FROM biz_case_registry WHERE case_id = :target_case_id UNION ALL SELECT c.case_id, c.pre_case_id, c.project_no, c.status, t.depth + 1 FROM biz_case_registry c JOIN trace t ON c.case_id = t.pre_case_id -- 沿 pre_case_id 向上游回溯 ) SELECT depth, case_id, pre_case_id, project_no, status FROM trace ORDER BY depth;biz_case_registry是案卷登记表,case_id是当前案卷号,pre_case_id是前置依赖案卷号,project_no是统一项目编号,status标识案卷当前所处的审批阶段,depth表示距起始案卷的层级距离。这条递归查询让业务人员从一个在办或已归档的案卷入手,就可以查出与其相关的所有上游案卷,实现“追根溯源”。真实项目里,案卷表通常还会冗余存一份trigger_type字段,记录触发关系类型(如“占补平衡”“指标核减”),便于规则引擎直接查询。
4.2 地块坐标串与空间叠置分析
B/S 端业务审批模块里最重要的能力是导入坐标串后的自动分析。用地单位报批时提供地块范围坐标串,系统会自动与数据仓库中土地利用现状、耕地、基本农田、规划圈等专题图层做空间叠置分析,判断地块占用现状地类、是否压占基本农田、是否符合规划。这个功能把原本需要几天的人工比对压缩到了分钟级。
空间叠置分析的 SQL 逻辑可以这样理解(以 PostGIS 语法示意,生产环境由 MapGIS K9 功能仓库或 Oracle Spatial 实现):
-- overlay_analysis.sql -- 将报批坐标串转为几何,统计占用耕地与基本农田面积 WITH apply_geom AS ( SELECT ST_GeomFromText('POLYGON((...坐标串...))', 4490) AS geom ) SELECT ROUND(SUM(ST_Area(ST_Intersection(a.geom, ag.geom)) / 10000.0), 2) AS occupied_arable_mu, ROUND(SUM(ST_Area(ST_Intersection(b.geom, ag.geom)) / 10000.0), 2) AS occupied_protected_mu FROM apply_geom ag LEFT JOIN land_use_2023 a ON ST_Intersects(a.geom, ag.geom) AND a.dlbm LIKE '01%' LEFT JOIN basic_farmland b ON ST_Intersects(b.geom, ag.geom);ST_GeomFromText把报批坐标串构造成面几何,ST_Intersection计算重叠部分,除以 10000 是把平方米换算成亩;dlbm LIKE '01%'是土地利用现状代码中“耕地”大类的地类编码前缀。输出结果是两个数字:占用耕地面积、占用基本农田面积。国土审批人员用这两个值来判定是否触发“先补后占”流程。如果占用基本农田面积大于零,系统直接拦截报批,要求项目方提供补划方案。
4.3 业务板块对空间数据的反向更新
业务审批不只是读取空间数据做分析,它还会反向写回业务专题图层。下表列举了原方案中定义的几种典型触发更新关系:
| 空间数据库 | 库类型 | 录入方式 | 触发案卷类型 |
|---|---|---|---|
| 基础地理数据库 | 基础库 | 批量更新 | 不触发 |
| 土地利用现状数据库 | 基础库 | 批量或增量更新 | 不触发 |
| 基本农田数据库 | 基础库 | 批量更新 | 不触发 |
| 建设项目用地数据库 | 业务库 | 报件时导入红线 | 征收、农转用 |
| 土地供应数据库 | 业务库 | 报件时导入红线 | 供地 |
| 储备数据库 | 业务库 | 报件导入地块 | 征收、收购、回收、供应 |
| 土地开发整理项目数据库 | 业务库 | 报件导入红线 | 开发、整理、复垦、补充耕地 |
| 土地房产登记数据库 | 业务库 | 建市县级库 | 发证、交易变更、征收注销 |
| 土地利用计划指标库 | 业务库 | 批量导入 | 批地、补地 |
基础库的更新节奏基本是一年或多年一次,由 C/S 数据管理子系统统一维护;业务库中的空间专题数据,是在案卷收件时一宗宗实时导入的,审批通过后直接落地到真实专题图层。这种“基础库慢更新 + 业务库快更新”的混合模式,既保证了底图数据的稳定性,又让审批结果能即时反映到“一张图”上。
原方案特别强调“批、供、用、补、查”板块间的串联是整个方案设计的重点,原因在于:如果各板块只是把数据堆到一个库里、但彼此不建立案卷级关联,那么“一张图”就退化成了一张电子挂图,失去了动态监管的意义。真正把图做“活”的,是那些触发规则和案卷关联关系。
5. 部署方案与并发验证:从硬件选型到压测
原文档的部署部分给出了一套完整的软硬件配置,以 2010 年的技术标准看相当务实。软件方面是 Windows Server 2003/2008 + Oracle 10G + MapGIS K9 组合;硬件方面配置了万兆核心交换机、IP SAN 网络存储、2 台数据库服务器和 1 台应用服务器。数据库服务器标配 8GB 全缓冲内存,最大可扩至 128GB;存储配置了 750GB SATAII 硬盘 13 块,单机柜最大支持 16 块。这套配置对应市级 300~500GB 数据量是够用的,对省级 2~4TB 数据量则建议直接把存储扩容到全柜 16 块盘以上。
5.1 部署层次的职责划分
三台服务器的职责划分值得借鉴。图形应用服务器安装 C/S 数据管理子系统,承担入库、维护和更新操作;WebGIS 服务器接收浏览器请求,利用 MapGIS IMS 组件进行业务处理,需要数据时再向 GIS 数据服务器发请求;GIS 数据服务器安装数据库,管理空间地理数据的存储、检索和完整性约束。隔离网闸用于内外网数据交换,阻断 TCP/IP 协议直连,保证涉密数据不能从政务内网非法流出。
注意:不要把数据入库任务和 WebGIS 服务混在同一台物理服务器上。入库时的大事务写操作会占满磁盘 I/O,导致地图服务响应时间剧烈抖动。
5.2 数据库层的并发调优
在多用户并发访问场景下,Oracle 的连接数配置是第一个瓶颈。默认的processes=150在几十个业务人员同时浏览地图时会很快耗尽。常见做法是调整为processes=500、sessions=555,并把 MapGIS IMS 服务的数据源连接池上限控制在 50 以内,避免前端地图请求把数据库连接全部占掉,导致 C/S 端无法登录。
连接数只是基础,更关键的是长事务处理。空间数据入库动辄更新几十万条记录,如果和地图浏览共用一个回滚段,浏览端会出现 ORA-01555 快照过旧错误。需要单独为大事务创建回滚表空间,并把undo_retention设为 3600 秒以上。
5.3 用压测确认部署合格
部署完成后,建议用下面的方法验证并发能力:准备一台测试机,模拟 50 个用户同时打开 MapGIS-IMS 的图层预览页面,连续操作 10 分钟,记录两个指标——地图瓦片请求的平均响应时间、GIS 数据服务器的 Oracle 当前连接数。如果平均响应时间超过 3 秒,优先检查 WebGIS 服务器的地图缓存大小和图层是否做了金字塔;数据层的查询优化可以先用EXPLAIN PLAN查看大表的空间索引是否被正确使用——空间索引失效是“一张图”响应慢的头号原因,尤其常见于反复执行批量更新后未重建索引的专题表。
部署完成的最后一步,是核对专题图层的更新机制是否符合第 4 章中“基础库批量更新、业务库实时更新”的设计约束。随机抽一个已办结的农转用案卷,对照它的报批红线是否已落到建设项目用地数据库的专题图层上;再抽一个巡查发现的违法用地案件,确认它的处置状态已同步到卫片执法图层。步骤不高深,但足以判断整套系统是否真的把“一张图”从概念落到了日常作业里。
本文还有配套的精品资源,点击获取