简介:面向基础地理信息专业人员和技术管理人员,这份技术规程系统规定了1∶500、1∶1 000、1∶2 000比例尺基础地理信息要素数据转换为基础地理实体数据的技术流程。正文按范围、引用文件、术语定义、基本要求、作业流程、源数据收集分析、预处理、映射转换、语义化处理、质量控制、成果归档等章节展开,对时空基准、数据格式、精度粒度、生产及元数据要求作出明确约束,并给出映射表制作、语义化处理等关键环节的作业方法,可直接用于新型基础测绘和实景三维中国建设中的二维基础地理实体数据生产。任务实施时需注意,组合与聚合地理实体数据另有参考文件,不可直接套用该规程。压缩包为单个PDF文档,共924KB,便于直接查阅、打印和内部培训使用。已有204人学习下载,对需要系统规范理解转换流程、提升实体数据生产效率与质量的管理和技术人员具有实用参考价值。
1. 拿到这份大比例尺地理实体转换规程,先看它到底管什么用
某测绘院接了一个实景三维建设任务,要求把存量 1:500 基础地形图转成地理实体数据。院里的技术负责人在院里翻了一上午,发现手头最缺的不是软件,而是一份能统一作业口径、能对上质检规则、能约束各作业组不各自为政的技术规程。这份基于 1:500、1:1000、1:2000 基础地理信息要素数据转换生产基础地理实体数据的技术规程,解决的正是这个衔接问题:它告诉你存量要素数据怎么拆、怎么合、怎么重定义,才能从「画得好看的地形图」变成「管得住的实体数据」。适合三类人:在新型基础测绘项目中负责数据生产的作业员、写转换脚本的 GIS 开发、以及要做成果验收的质检人员。它不是教科书,是生产线上的操作依据。
2. 读懂规程前,先理解三套关键机制:尺度、实体模型与标识码
2.1 三种比例尺的转换差异:尺度决定精度、取舍与作业方式
1:500、1:1000、1:2000 虽然都归大比例尺,但在转换生产里完全是三种作业场景。
1:500 的数据多来自房产测绘、地籍调查,图上房屋边线、阳台轮廓、台阶细节极其丰富,坐标精度要求到厘米级。转实体时最麻烦的是「碎」:一个房屋要素可能由十几个面构成,转换时要把它们合并成一个房屋实体,同时保留结构线。1:1000 是城市基础测绘的主力比例尺,数据覆盖广、要素类型全,转换时主要矛盾从「碎」变成了「全」——确保植被、管线、交通、水系每一类都按规程要求的实体粒度去组织。1:2000 偏向规划与乡村区域,数据相对粗略,转换时反而要多做一件事:补全。有些区域只有线状房屋轮廓,没有附属设施,规程要求你按周边要素推导出完整的实体边界。
三套比例尺的转换不是同一套代码改三个参数那么简单。面积阈值的设定就差异巨大:1:500 数据里一块 3 平方米的棚房可能是合法独立实体,但在 1:2000 数据里同类要素就该合并进相邻建筑实体。坐标保留位数也一样,1:500 转换成果坐标保留到小数点后三位,1:2000 保留两位就够,多了反而给拓扑检查制造噪声。规程里所有涉及「最小面积」「最小宽度」「最小间距」的阈值,是分比例尺给的,作业时先查清楚你用哪个尺度的参数表,别拿 1:500 的参数去处理 1:2000 的数据,那会生产出一堆毫无意义的细碎实体。
2.2 地理实体数据模型:语义实体、几何位置、空间关系三层结构
转换生产地理实体数据,本质上是把要素数据从「制图模型」搬到「实体模型」。制图模型的核心是符号和图层:一条等高线存的是线坐标和等高距,一个房子存的是面坐标和房屋结构代码。实体模型的核心是对象和身份:一个房屋实体除了几何位置,还有一个唯一标识码、一个类别语义、一组空间关系。
规程里定义的实体数据模型可以拆成三层。语义层负责「它是什么」:房屋、道路、河流、植被、管线、行政区划,每个实体有一个分类编码,分类体系在规程附录里按门类、大类、中类、小类四级展开。几何层负责「它在哪」:实体的空间表达可能是点、线、面,也可能是多面体,转换时最常见的问题是房屋实体要不要保留高程信息——如果源数据是二维 DLG,实体几何只能先建二维,高程作为属性挂接,后续由倾斜摄影或 LiDAR 数据补充。关系层负责「它跟谁连着」:房屋实体必须关联到它所在宗地实体,道路实体必须关联到它连接的两个路口节点,水系实体必须关联到其汇入的下级或上级水系。这三层关系在转换时就要建立,不能等数据入库后再补。
其中关系层是最容易被作业组忽略的。很多团队转出来的实体几何位置没毛病,语义编码也正确,但实体之间的关联关系全丢,到了数据入库和三维场景叠加阶段才发现没法用。我的经验是:转换脚本里就预留关系字段,在几何转换的同时完成关系判读,哪怕先写得粗糙一些,也比整库跑完再回头补关系要省成本。
2.3 唯一标识码与时空身份:转换中必须保住的命脉
地理实体数据的核心身份标识是唯一标识码,通常由「行政区划代码 + 实体类型码 + 顺序号 + 校验位」组成。规程对标识码的生成规则有明确规定,但在转换生产中真正容易翻车的不是生成规则,而是两件容易被忽略的事:原要素标识的继承,和派生实体标识的溯源。
继承的意思是,如果源 DLG 数据里每个要素自己带了要素标识码,转换生成实体时要把这个码写进实体的「来源要素标识」字段,这条线索对后续变更检测和更新极其重要。很多生产团队做转换时只建新码、不挂旧码,结果半年后做变化发现时对不上历史数据,等于断了时空追溯链。溯源的意思是,一个实体可能由多个要素合并而来,规程要求记录「组成部分清单」——哪几个源要素合并成了这个实体,以哪条要素为主、哪条为附。这个字段在质检阶段会被重点抽查,漏填直接判不合格。
我建议生产单位把标识码生成和溯源记录做成一个独立模块,而不是散落在各个转换脚本里。它应该支持批量回填:要素合并完成后自动生成「实体标识 + 来源标识 + 组成要素列表」三列,输出一个对照表。这个对照表不仅质检要交,后续做实体更新、历史回溯、版本比对时都是最省力的依据。
3. 转换生产落地的三个环节:统一基准、语义映射与拓扑重构
3.1 第一步:数学基础统一与数据准备,坐标基准不一致先推倒重来
转换之前先做数据体检,这一步最枯燥,但是翻车概率最高。某作业组拿到的两个测区数据分别是地方坐标系和 CGCS2000,脚本跑了一半发现坐标对不上,全部返工。我的处理顺序是:先检查所有源数据的坐标系定义,确认是否已转为 CGCS2000;再检查高程基准,确认是否为 1985 国家高程基准;最后检查分幅规则,1:500 和 1:1000 通常按 50cm × 50cm 分幅,1:2000 按 40cm × 40cm 分幅,转换前要确认接边关系完整,不能有缝隙或重叠。
坐标系和基准没有问题之后,下一步做数据规整。DLG 数据里普遍存在三个问题:悬挂点、重复边、伪节点。悬挂点会让后续拓扑构建报错;重复边会导致实体边界被识别成两条线;伪节点会让一条完整的道路边被打断成几段。常见做法是先用拓扑检查工具跑一遍,把三类错误修干净后再进入转换流程。
# 以 GDAL/OGR 为例,检查 shapefile 的几何有效性并存出报告 ogrinfo -so -al city_1_500.shp ogr2ogr -dialect sqlite \ -sql "SELECT geometry, ST_IsValid(geometry) AS is_valid FROM 要素层" \ invalid_geometry.gpkg city_1_500.shp这段命令的作用分两层。第一层ogrinfo快速输出要素总数、几何类型、字段结构,确认数据能正常打开;第二层用ST_IsValid把几何无效的要素筛出来单独输出到 GPKG,方便逐一查看错误类型。做数据规整时保持着一条原则:宁可多花半天排查几何错误,也不要让错误要素进入转换脚本,因为实体数据的拓扑要求远高于制图数据,源数据一个点没闭合,转换后可能多出一个空洞面,后面再改就难了。
坐标基准检查我一般会写一段日志:记录每个输入文件的坐标系统描述、单位、基准面,转换完成后记录输出文件的相同信息。这样质检阶段可以直接比对日志,不用重启软件逐层查看属性。
3.2 第二步:要素到实体的语义映射,用字典驱动方式实现可维护
要素到实体的映射是转换的核心逻辑。一套完整映射关系至少包含四列:源要素图层名、源要素分类代码、目标实体分类代码、映射操作类型。操作类型有四种:一对一直接映射、多对一聚合映射、一对多拆分映射、一对零丢弃映射。
举个例子:源数据里「房屋」图层有「一般房屋」「简易房屋」「棚房」三个分类代码,在实体模型里它们应该合并成一个「房屋建筑」实体类型,但要保留「房屋结构」属性字段说明类别差异。这就是典型的多对一聚合映射。又比如源数据里「水系」图层有一条「河流」要素,同时标注了「河流中心线」「河流边线」「河流结构线」,转换时要拆成「河流实体」的主几何面和「河流辅助线」的点线实体,这就是一对多拆分。
import csv import json # 载入映射字典,字典外部维护,不写死在脚本里 map_file = "mapping_rule.json" with open(map_file, "r", encoding="utf-8") as f: mapping_rules = json.load(f) def map_feature_to_entity(layer_name, source_code): # 查找当前图层和源码对应的映射操作 key = f"{layer_name}:{source_code}" if key not in mapping_rules: return None, None # 无映射则丢弃并记录日志 rule = mapping_rules[key] target_code = rule["target_code"] operation = rule["operation"] return target_code, operation # 批量读取源要素并生成实体记录 source_features = read_features("city_1_500.shp", "房屋") for feat in source_features: layer_name = feat.layer src_code = feat.attr("分类代码") tgt_code, op = map_feature_to_entity(layer_name, src_code) if tgt_code is None: write_skip_log(feat.fid, src_code, "未定义映射") continue entity = create_entity(tgt_code, feat.geometry, op) write_entity(entity)这段脚本里有两个参数值得关注。第一个是mapping_rule.json的结构设计,每一条规则包含source_layer、source_code、target_code、operation四个字段,实际生产里我会再加一个condition字段,用来表达「面积大于某值的房屋映射为实体 A,否则映射为实体 B」这类带条件的映射。第二个是write_skip_log的存在,未定义映射的要素不能静默丢弃,必须输出一条包含要素 ID 和源分类代码的日志,便于后续补规则。生产中第一次跑映射总会有一批要素没有对应规则,这是正常的,关键是日志要清晰,方便作业员逐步补齐规则,而不是在脚本里加几十个 if else 分支。
属性映射同样重要。源数据里「房屋」图层的「层数」属性是字符串,实体模型的「房屋层数」字段需要整数,转换时要做类型转换。源数据里「道路」图层的「路面材料」代码是 2002 年旧标准,实体模型采用新国标代码,要建立新旧代码对照表。属性映射的常见做法是单独维护一个字段级映射字典,结构为「源字段名、目标字段名、转换函数、默认值」。转换函数可以是 python 函数名,也可以是一段 SQL 表达式,但我建议统一用 Python 函数,方便做单元测试和日志记录。
3.3 第三步:拓扑重构与关系建立,实体边界必须干净闭合
几何映射完成之后,实体数据初步有了形,但拓扑关系基本是乱的。三个高频问题需要专门处理:相邻实体共享边界不一致、实体内部出现细碎多边形、跨图幅实体被硬性打断。
相邻实体共享边界不一致的典型表现是:两个相邻房屋实体之间有一道 0.1 米宽的缝隙,或者有一道 0.05 米的重叠。原因在于源 DLG 数据本来就是独立采集的,相邻要素之间并未做严格的共享边处理。实体数据要求相邻实体共享同一组边界坐标,因此处理时要选定主实体,把相邻实体边界统一到主实体坐标上。规程给的做法是按图幅做整体拓扑重建,而不是逐实体修边。
import geopandas as gpd from shapely.ops import unary_union # 读取转换后的房屋实体面 gdf = gpd.read_file("entity_house.shp") # 方法一:用 unary_union 做边界融合,消除重叠和缝隙 merged = unary_union(gdf.geometry) # 将融合结果重新拆分为单个面实体 cleaned_geoms = list(merged.geoms) if hasattr(merged, "geoms") else [merged] # 方法二:按属性字段分组做融合,避免把不同属性的邻居也合并到一起 gdf_grouped = gdf.groupby("实体分类码").agg({"geometry": lambda x: unary_union(list(x))})处理三步走:第一步做全局边界清理,把重叠和缝隙统一消除;第二步按属性分组,避免误合并;第三步做边界一致性检查,确保每对相邻实体共享同一条边。这里有一个参数值得注意:unary_union的容差默认是 0,意味着即使两个坐标只差 1e-9 也会被视为不同点,建议显式设置容差为源数据坐标精度的一半。比如 1:500 数据精度 0.01 米,容差就设为 0.005 米。
跨图幅实体打断问题更隐蔽。一个大型公共建筑横跨四个分幅,转换脚本按图幅逐个处理,生成了四个独立的建筑实体,标识码各不相同。规程要求这类情况必须合并为一个实体,同时记录组合关系。这种合并我一般不会在批量脚本里做,而是分幅转换完成后跑一个空间关联检查,把几何相距小于阈值且类型相同的实体挑出来,人工确认后合并。阈值通常设为 0.1 米,但要注意别把真实相邻的独立房屋误合并,需要结合属性层的楼栋号、门牌号等字段判断。
4. 生产转换踩坑实录:六个高频异常与对应修正参数
4.1 图幅接边处出现缝隙实体,所有相邻实体互相独立
现象:做完转换和拓扑清理后,检查图幅接边处发现每个实体边缘都带一条极细长的缝隙面,面积约 0.02 平方米,虽然不影响统计面积,但在三维场景里显示成一道黑线,质检直接判不合格。
原因:源数据分幅存储时,不同图幅对同一条道路边界的采集坐标存在厘米级差异,转换脚本按图幅独立读入,没有做跨图幅接边预处理,缝隙就是两幅图坐标差异留下的空当。
解决:在转换前先做接边处理。我用的是 ArcGIS 的Integrate工具(或 QGIS 的 Topology Checker),把相邻图幅的边界点捕捉到同一坐标。捕捉容差设为 0.01 米,即 1:500 数据坐标精度的 1 倍。接边完成后重新跑转换,缝隙面自动消除。之后每次拿到新分幅数据,我都会先随机抽三对相邻图幅检查接边差,超过 0.01 米的直接退回测绘部门修正,不把问题带进转换流程。
4.2 旧国标地类代码映射后丢失了语义,属性值全部落空
现象:房屋实体的「房屋结构」属性字段中出现了大量空值。作业员反馈映射字典没有少写规则,但在成果统计里空值率超过 40%。
原因:源数据的「房屋结构」字段没有直接用国标代码,而是用了地方扩充代码。比如新国标里「混合结构」的代码是 202,地方数据里却存了「202-砖混」「202-框架」这种带后缀的复合码,映射字典按精确匹配处理导致匹配失败。
解决:映射匹配逻辑从精确匹配改成前缀匹配加长优先。字典里先匹配完整代码,匹配不上再按前三位匹配并保留原始后缀子串存入冗余属性字段。另外我在映射脚本里加了一个统计数据量覆盖率的输出,跑完后自动汇报「每类实体中被映射属性比例不足 90%」的提示,让作业员不用全量抽查就能知道有没有漏映射。
4.3 房屋实体合并时误合了相邻的独立房屋,打散后无法恢复
现象:某团队用面积阈值做聚合,把相邻两栋楼合并成一个大实体,但这两栋楼分属不同宗地、不同权属,入库后被甲方退回。
原因:聚合条件里只写了「几何相邻且类型相同」,没有加权属字段判断。规则太宽。
解决:聚合判断必须加入语义约束。我在映射字典的condition字段里增加了组合条件配置:只有当「空间相邻 + 实体分类码相同 + 权属单位相同 + 建筑年代相近」四个条件同时满足时才聚合。参数的含义分别是空间相邻判定距离 0.1 米、权属字段完全一致、建筑年代差值不超过 5 年。条件表达式的语法我改成了类似简单规则引擎的格式,比如distance(geom1, geom2) <= 0.1 AND attr("权属单位") == attr("权属单位"),由脚本解析执行,不写死逻辑。从那以后我再没用过纯几何的自动聚合。
4.4 高程转换整体偏移约 20 厘米,成果高程精度不合格
现象:转换后的实体高程值与项目复测的检查点高程系统性偏高了 0.2 米,不是随机误差。
原因:源数据高程基准是 1956 年黄海高程系,规程要求 1985 国家高程基准,两者之间存在约 0.2 米的系统差。转换脚本没有做高程基准转换处理。
解决:在转换流程里加了高程基准转换步骤,统一先做高程基准转换再做实体几何提取。我有一次连续排查了三天,才在数据元数据文件里找到了高程基准的说明,之前作业员默认所有数据都是同一基准,属于流程设计缺陷。现在我把基准检查写进了数据体检清单的第一行,每次入库先看元数据。
4.5 实体标识码重复,两个不同实体拿到同一个码
现象:质检脚本检查标识码唯一性时发现两个分隔很远的水系实体共用了同一个标识码。
原因:标识码生成器的序号段分配是以图幅为粒度做的,但水系实体是跨图幅的,转换后合并成一个实体时才去申请标识码,而两个图幅的序号段重叠导致同一个码被分配两次。
解决:把标识码生成改成「先合并后发码」的顺序。具体做法是,分幅转换时先生成临时 ID,全部图幅处理完成后做跨图幅实体合并,合并结束再统一按行政区划和实体类型批量分配正式标识码。正式发码逻辑是:行政区划代码 + 实体类型码 + 全库流水号,流水号由一个全局计数器控制,不按图幅分段。跑这一步时我加了个日志文件记录每次发码的序号范围,方便事后追溯。
4.6 测区边缘实体残缺,靠近数据边界处无法构建闭合面
现象:转换测区边缘的实体时有大量边界要素无法构面,生成的实体与测区边界齐平截断,但规程要求测区边缘实体必须完整表达。
原因:测区边缘的源数据本身不完整,一部分要素落在测区外,转换脚本读取数据时只处理了测区内的几何,导致边缘实体的面缺失。
解决:处理测区边缘数据时先把缓冲区外的要素一并读入,用于辅助构面。缓冲区半径通常取该比例尺最大实体对角线长度,1:500 数据建议 100 米,1:1000 建议 200 米,1:2000 建议 400 米。构面完成后,再把落在正式测区范围外的辅助几何切除,保留实体在测区内的完整表达。这个问题第一次遇到时我以为是代码 bug,后来才知道是数据裁剪参数设错了。
5. 成果质检规则与参数细化:从人工目检升级为规则化校验
5.1 质检层次拆解:完整性、空间精度、属性一致性、语义正确性
规程里的质检要求不只是一张检查表,它有严格的层次结构。按我的理解可以拆成四层检验:第一层是完整性,检查实体数量、空间范围、图层结构是否符合预期;第二层是空间精度,检查几何与原始 DLG 的位置误差是否在允许范围内;第三层是属性一致性,检查关键属性是否有空值、类型是否正确、代码是否合法;第四层是语义正确性,检查实体之间的关系是否合理、分类编码是否符合规程附录对照表。
这四层不是平级的。完整性不过关,后面三层做了也白做;语义正确性不过关,前面三层全过也不能交付。实际生产中常见的误区是把所有检查项无条件轮流跑一遍,结果跑到后面语义检查报错时,前面几轮的修改已经污染了数据状态。我的习惯是先跑完整性和属性一致性,确认数据形态稳定后,再跑空间精度和语义正确性。这样每个错误报出来时,你基本能确定它属于哪一类。
5.2 规则化校验的 SQL 设计与参数取值:写清楚每一项的判定依据
规则化校验可以用 PostGIS 直接写 SQL 执行,优点是过程可复现、判定条件可追溯。以下三条是生产里最常用、也最能拦下问题的检查。
-- 1. 检查标识码重复 SELECT 标识码, COUNT(*) AS cnt FROM 实体图层 GROUP BY 标识码 HAVING COUNT(*) > 1; -- 2. 检查几何自相交 SELECT 实体标识, ST_IsValid(geom) AS valid_flag, ST_IsValidReason(geom) AS invalid_reason FROM 实体图层 WHERE ST_IsValid(geom) = false; -- 3. 检查面实体面积下限(1:500 数据最小实体面积) SELECT 实体标识, 实体分类码, ST_Area(geom) AS area_m2 FROM 实体图层 WHERE ST_Area(geom) < 1.0 AND 实体分类码 = '房屋建筑';第一条查重用是安全检查,不用多说。第二条ST_IsValid会抓出所有自相交、重复点、断环等问题,报错信息可以直接定位错误所在。第三条按面积下限过滤,这里的关键是阈值本身需要论证。规程里一般会给出「次要实体最小面积」的参考值,但真正生产时应该做一次小范围试生产来确定:抽一个标准图幅完整转换一遍,统计面实体的面积分布直方图,取分布曲线上明显断裂的位置作为面积阈值,而不是直接拿一个拍脑袋的数。
5.3 质检报告结构建议:每项结论都要能反查到数据证据
质检报告建议包含三个部分:检查项清单及其判定依据、不合格项清单及错误类型分布、修正建议及修正后复检结果。报告不追求长,但要保证每一项不合格都能反查到具体实体标识码和几何位置。
我见过最头疼的质检报告是只写了「图幅 3 存在房屋实体面积小于阈值 12 个,请修正」,既不说是哪些实体,也不说哪个具体面积值,作业员得全图幅逐个人工复查。合格的做法是报告里直接附一张表,列出每个不合格实体的标识码、面积值、最小面积阈值、所在图幅号、错误截图或高亮范围。这个表从哪来?从前面那条 SQL 查出来之后直接导出,不重新手写。
6. 把映射规则做成配置:一套转换工具吃下三种比例尺的日常习惯
最后分享一个我自己的生产习惯。早期做转换项目,每个比例尺各写一套脚本,1:500 一套 params,1:1000 一套,1:2000 再复制一套。三个版本改三个月,改出三份互相不兼容的代码,谁维护谁崩溃。后来我把所有参数全部抽到配置文件里,脚本本体只保留逻辑,不同比例尺切换只是加载不同的配置模板。
# 比例尺配置模板示例 1:500 scale: "1:500" coordinate_precision: 0.001 topology_tolerance: 0.005 min_entity_area: 房屋建筑: 1.0 构筑物: 5.0 植被: 10.0 merge_rule: house_aggregate: distance_threshold: 0.1 attribute_conditions: - 权属单位 - 建筑年代 mapping_dictionary: "mapping_1_500.json" output_identifier_prefix: "500"这套YAML配置模板配合前两章的 Python 脚本,实现了三个目标。第一是比例尺切换从改代码变成改配置,换到 1:1000 只需要加载另一份模板,脚本不动;第二是所有阈值集中管理,甲方要调整最小面积阈值时只改一个文件,不用在脚本里到处搜if area <;第三是生产过程的可追溯性提高了,每跑一批数据都记录「用的哪份配置、哪个版本号、改了哪些参数」,质检或甲方追问的时候能直接拿出来回答。
模板里几个字段的作用分别是:topology_tolerance控制拓扑清理的最小容差,设大了会误合并相邻实体,设小了清理不干净;attribute_conditions里列出的字段会被组合成聚合判断条件,举例来说,只有权属单位和建筑年代一致的相邻房屋才会合并。换作业区或换数据源时,我会额外注意一件事:配置模板里涉及的空间参考和基准面参数不能只写代号,要写全参考椭球体和基准面描述,防止源数据与配置模板之间坐标系定义有细微差异。
熟练了这个流程之后,现在的生产习惯就比较稳定了:拿到任何新区域的数据,第一步跑数据体检脚本,输出的体检日志会告诉我坐标系、几何错误、属性完整度三个关键状态;第二步选择配置模板,如果测区是山地、丘陵、平原的混合地形,会把min_entity_area里的植被阈值调高一档,因为地形起伏带来的图斑碎片会让阈值不适用;第三步试转一个标准图幅,人工检查一版,确认无误后全区域批量跑;最后跑质检规则包,把输出的报告挂到成果说明文档里。
希望帮到你。
本文还有配套的精品资源,点击获取