
简介在不动产登记与土地确权工作中宗地四至描述是权属调查成果的关键组成部分其准确性与规范性直接影响登记质量和法律效力。传统人工填写方式依赖内业人员逐宗判读地籍图工作量大且方向判断容易出错。借助地理信息系统中的空间分析技术可以将相邻关系计算转化为自动化流程通过要素转线提取边界、判断边界与宗地内部点的相对方位再按规则聚合邻接对象名称即可批量生成规范的四至文本和界线文件。该方案适用于地籍调查、集体土地确权、权籍建库等场景能够显著提升内业效率降低人为误差同时为登记系统提供可追溯的数据成果。本文从地籍数据处理的实际工程需求出发介绍一种结合空间运算与属性关联的宗地四至批量处理方法并给出可落地的技术路径与常见问题应对策略。 干过土地确权登记、不动产登记的朋友一定对“四至”这两个字印象深刻。每次整理土地证材料最磨人的往往不是外业测点也不是内业成图而是把每一宗地的东至、南至、西至、北至写得又准又规范。一个县几千宗地要是靠人一宗一宗去看图、翻资料、比对邻宗名称工作量真的能让人崩溃。这个项目的目标很直接用已有的地籍图数据通过空间分析批量生成宗地四至描述同时输出可用于归档和登记系统的“四至界线文件”把原来三五天的内业工作压缩到一两个小时。我本身是做测绘地理信息出身的这些年接触过不少地籍调查、集体土地确权、不动产权籍调查的项目也亲眼见过同事对着屏幕一条边一条边描、一个方向一个方向写“四至”的场景。这篇内容就是把我实际操作过的批量处理方案完整复盘一遍把思路、流程、脚本、踩过的坑都写清楚。不管你是做测绘的内业人员、自然资源系统的业务骨干还是刚接触地籍数据处理的学生看完之后至少能知道该从哪里下手能避开哪些坑。1. 先搞懂宗地四至到底在填什么批量填写的真正难点在哪1.1 四至不是简单的方位词是有法律效力的权属描述很多人刚接触地籍数据时觉得四至就是“东边是什么、南边是什么”而已。这话不能说错但放到土地登记的业务场景里四至远没有这么简单。土地证、不动产权证书以及权籍调查表里的“四至”其实是对宗地四周边界邻接关系的文字化表达。它在法律上承担着明确权属范围、避免界址纠纷的作用。一张图上如果只画了红线没有文字说明登记系统无法归档也不便于公众查询。尤其在集体土地确权登记工作中四至内容必须与宗地图、界址点坐标保持一致三者互相印证。一旦四至描述与实际图面不符轻则退件重做重则引发邻里权属纠纷。所以四至描述有一个隐含要求既要简练又要准确。例如“东至XX村民委员会南至XX路西至XX河北至XX公司”这已经是比较规范的四至写法了。它本质上是在回答四个方向的问题——宗地边界的外侧邻接了什么。如果宗地边界由多段线组成每一段邻接的对象不同四至描述还要根据方位把它们合理地归并到一起不能漏写也不能张冠李戴。1.2 为什么批量填写比想象中难知道了四至的业务含义就能理解为什么批量填写这件事一直不好做。首先是量大。一个县的集体土地确权项目几千宗地再正常不过。每宗地四个方向哪怕每宗地只花三分钟也是几个小时起步。但实际操作中三分钟通常写不完因为要先去看图、缩放、找邻宗权利人名称、确认道路名称还要保证同一邻宗在不同宗地上写法一致这已经接近“做编辑”的工作量了。其次是方向判断容易乱。人工看图时东南西北靠肉眼判断宗地长得不规则的时候判断出来的方向常常不一致。同一条边界有人写东至有人写东北至最后汇总的成果五花八门质检阶段很痛苦。第三是邻接对象的准确性很难保证。图形上能看到边界但边界外面是谁、叫什么名字要靠地籍库属性或者现场调查资料去查。光看图不看属性很容易把“相邻宗地”写错或者把“道路”写成“空地”。把这些问题放到一起就能明白批量填写四至本质上不是“输入法提速”的问题而是一个空间分析问题从图形上计算出每条宗地边界外侧是谁自动判断方位再按规范生成文字。想通了这一点技术路线其实就清晰了。2. 方案选型与其手工慢慢填不如把“相邻关系”算出来2.1 常规做法能跑通但代价太大了我知道有些团队也用Excel、Word做了不少“半自动”工作。比如先把所有宗地的权利人、地类导出来然后按东、南、西、北各建一个字段最后根据人工看的图逐个填。这种方法本质上还是人在看图只是把纸张换成了屏幕效率提升非常有限。还有一种常见做法是只统计四个方向最近的宗地把这个最近宗地的权利人作为该方向的四至。这种方法在宗地特别规整、边界横平竖直的平原地区勉强可用但只要遇到弧形边界、斜向边界、或者一块宗地同时邻接好几家单位误差就大得离谱。我见过用这种方法生成的成果同一个邻宗在四个方向里出现了三次权籍调查表拿出去根本没法用。所以我在这个项目里没有走“最近邻”的思路而是选择了“边界邻接分析”。核心就是找出每一条宗地边界线判断它的左侧和右侧分别是谁其中一侧是本宗地另一侧就是邻接对象。这样就获得了完整的“哪条边邻接谁”的对应关系再结合方位角判断边界位于本宗地的哪个方向自然就能生成四至描述。这套思路对任意形状的宗地都适用不用管宗地是正方形还是L形。2.2 核心思路把空间距离翻译成文字理解这个方案只需要想清楚三个问题。第一宗地的边界线是什么。在地籍图里宗地是面要素它的边界是一圈闭合线。批量处理时我们要把这些闭合线拆分成一段一段的独立线段。每段线都拥有两个邻接对象左边一个面右边一个面。如果左边是本宗地右边就是外侧对象反过来也一样。第二外侧对象是谁。如果宗地图里已经把相邻宗地、道路、河流全部建成了面那么通过“要素转线”功能自动就能得到每个边界线段的左右面编号。再用编号去关联面属性表就能拿到外侧对象的地块编号、权利人名称、地物名称等字段。如果外侧没有面说明这块地外面是空地图斑或者未建库的数据这时需要单独标记不能默认跳过。第三这根边界线在宗地的哪个方向。我采用的是“以宗地内部点为中心计算边界线中点相对内部点的方位角”的方法。如果边界线中点在宗地内部点的东侧这段边界就归入东至南侧就归入南至。之所以用内部点而不是质心是因为凹多边形比如L形、U形地面的质心可能落在宗地外部直接用质心算出来的方向会错得很离谱。2.3 工具链选择ArcGIS arcpy兼顾效率和可维护性工具方面我选择的是ArcGISDesktop或Pro都可配合arcpy脚本。原因很简单地籍数据绝大多数就是File GDB或Shapefile格式ArcGIS的“要素转线”“空间连接”“标识”这些工具在数据量大时稳定而且arcpy脚本可以重复跑还能批量处理整个要素数据集。如果你只有QGIS也完全可以用类似思路实现。QGIS里“Polygon to Lines”可以完成面转线“Join attributes by location”可以按位置关联处理原理是一样的。只是arcpy在生产环境里更容易和已有的数据管理流程整合所以我下面写的脚本也以arcpy为例。还要提一下这个方案并不是要替代人工而是把人工从“看图写字”里解放出来让人去做更有价值的“审核判断”。所以流程设计上我把自动生成的四至字段全部放在临时字段里等人工审核确认后再赋值到正式字段避免误操作覆盖原始数据。3. 数据准备批量生成能不能成第一步就定生死3.1 先盘点手上有什么数据很多人在项目开始时容易犯一个错误拿到宗地面层就直接跑分析工具结果出来的邻接关系全是乱的。实际上数据准备才是整个流程里最花时间的部分。做批量四至生成至少需要以下数据宗地面层这是核心数据必须有唯一标识字段比如地块编号、宗地代码最好还有权利人名称、地类用途等属性。邻接地物面层包括相邻宗地、道路、河流、沟渠、农田、空闲地等。如果只有宗地面层没有道路和河流面生成结果中“临路”“临河”这类描述就永远出不来。文字名称数据道路名、河流名、单位名。这些名字可能存在于面层的属性字段里也可能是单独的注记图层。如果没有标准化名称后面就会遇到“同一块地在不同图幅里写法不一样”的问题。如果手头已经有经过检查组验收的地籍数据那最好可以直接用。如果是初始调查数据必须先做一轮图形和属性的清理否则后续所有步骤都是白做。3.2 拓扑和几何检查别让细小错误毁掉整个批次要素转线这个工具对输入数据的要求非常高。面与面之间有重叠、有缝隙、边界线未完全重合都会导致输出的左右面编号错乱或出现大片FID为-1的情况。我实际遇到过一种典型问题相邻两个宗地的共享边看上去是贴在一起的但放大后会发现两条线之间有一个几厘米的缝隙。这个缝隙肉眼几乎看不出来但在计算邻接关系时边界线会变成三段左右邻接面全部错位生成的四至自然就乱了。所以在批量处理前先做几何检查和拓扑检查。几何检查方面用ArcGIS的“修复几何”工具可以先清掉自相交、空几何、重复顶点这类问题。拓扑检查方面建议在建好的GeoDatabase里创建拓扑规则加上“不能重叠”和“不能有缝隙”把错误项筛查出来后再统一修正。实际操作中我一般先跑一遍“修复几何”再用拓扑工具检查。如果有几千个小缝隙直接用“消除”工具批量合并到相邻宗地或者用“捕捉”工具将边界顶点对齐。缝隙处理必须在“要素转线”之前完成否则转出来的线会出现大量短小的碎线后面的方向判断会受影响。3.3 坐标系、容差和字段预处理整个分析过程里所有图层的坐标系必须统一。地籍成果一般使用国家大地坐标系下的高斯投影单位是米。如果混用了地理坐标系经纬度计算出来的长度和方位角都会失真后续处理结果不能直接使用。容差设置这块容易被忽略。ArcGIS默认的XY容差和拓扑容差不一定适合你的数据。我的建议是在要素转线前先把环境的XY容差设为0.001米匹配容差可以设成0.005米既能保证边界对齐又不会把有效边界吞掉。具体数值取决于数据精度比如1:500地籍图的容差可以小一些1:10000的可以适当大一点。字段预处理的重点是名称字段。权利人名称、地物名称必须统一格式不能一个用全称一个用简称也不能出现前后空格和特殊字符。建议在进入分析前写一个简单的字段清理脚本把字段里所有空格、制表符、换行符全部去掉统一简繁体。这一步不用花太多时间但能大大减少后面“同名不同字”的合并问题。4. 核心流程落地从邻接线到四至描述4.1 用要素转线构造每条宗地边界的左右关系数据准备完毕正式进入分析流程。整个过程分四步第一步就是把面要素转成线要素。在ArcGIS里使用“要素转线”工具输入宗地面层和所有辅助面层输出一个线图层。这个图层里每一根线都是一段宗地边界而且自动带上了LEFT_FID和RIGHT_FID两个字段分别表示这条边左侧和右侧的面要素编号。这一步有几个关键参数需要注意。一是“属性”选项。要素转线工具有一个选项可以选择是否保留输入要素的属性。在批量生成四至时我通常不保留属性因为左右FID已经足够关联回面层查询保留属性反而会让线层字段特别多影响后续处理速度。二是“识别存储”那里的“空”选项保持默认即可。三是输出位置建议存放在File GDB里不要输出到Shapefile否则长字段名会被截断。转完线以后建议先看一眼属性表。如果左右FID大量出现-1就说明输入面层之间存在缝隙或者未闭合的问题。这时候不要急着继续必须回到数据准备阶段去修几何否则后面所有结果都会带错。4.2 方向判断边界在宗地的哪一侧拿到边界线后要为每一段线判断方向它位于本宗地的东侧、南侧、西侧还是北侧。我采用的方法是对每一段线取中点坐标再对当前宗地用“要素转点”工具生成内部点取内部点坐标。然后用线中点相对内部点的方位角来确定方向。方位角采用从正北起算、顺时针旋转的方式正北为0度正东为90度正南为180度正西为270度。约定东方向为45度到135度南方向为135度到225度西方向为225度到315度其余为北方向。这里有个容易被忽视的细节线要素在数据里的数字化方向是任意的不能直接用线起点到终点的方位角来判断边界方向。正确做法是取线中点坐标和宗地内部点坐标计算相对方位角。判断的是“边界线位于宗地哪个方向”而不是“线的朝向”。举一个例子一条南北走向的边界线它的朝向可能是正北或正南但这根线本身可以是宗地的东至也可以是西至完全取决于它位于宗地内部点的哪一侧。关于内部点不要直接用默认的质心计算。ArcGIS属性里的“质心”对于凹多边形可能落在外部我习惯使用“要素转点”工具并勾选“INSIDE”选项生成的内部点一定在多边形内部这样方位角计算才稳定。4.3 生成四至文本组装规则和arcpy脚本方向判断完成后每一段边界线都有了三个关键信息本宗地编号、邻接对象编号或名称、方向。接下来的工作就是按方向分组把邻接对象拼成一句话。文本组装规则我建议按以下顺序执行按“本宗地编号 方向”分组。组内的邻接对象名称去重。同一个邻宗如果和本宗地有多段共享边界只能出现一次。组内多个邻接对象用顿号分隔。名称顺序按边界长度降序排列长度越长越优先。如果某个方向的邻接对象名称缺失用“空地”或者“未登记地块”占位不要留空方便后面人工识别补录。最终四至字段建议拼接成“东至XX南至XX西至XX北至XX”的格式方便直接进权籍调查表。这里有我踩过坑后的经验文本生成阶段先保留一个“原始描述”字段里面存的是没有做任何规范化加工的拼接结果比如“XX村委会,YY公路”。然后再设计一个“规范描述”字段通过规则把逗号转成顿号、补充方位词。这样做的好处是后期对比方便一旦发现某个方向描述错误能快速判断是规则问题还是数据问题。下面给一段arcpy脚本的框架核心逻辑在这段脚本里基本都能体现import arcpy import math # 输入参数 gdb_path rD:\work\zongdi.gdb fc_boundary gdb_path r\boundary_line # 要素转线后的线层 fc_parcel gdb_path r\parcel # 宗地面层 fc_inside_point gdb_path r\parcel_inside # 内部点层 # 给线层添加方向字段 arcpy.AddField_management(fc_boundary, DIRECTION, TEXT, field_length4) arcpy.AddField_management(fc_boundary, PARCEL_ID, TEXT, field_length50) arcpy.AddField_management(fc_boundary, NB_NAME, TEXT, field_length200) def get_direction(ax, ay, bx, by): 计算点a到点b的方位角返回中文方向 dx bx - ax dy by - ay angle math.degrees(math.atan2(dx, dy)) if angle 0: angle 360 if angle 45 and angle 135: return 东 elif angle 135 and angle 225: return 南 elif angle 225 and angle 315: return 西 else: return 北 # 读取宗地内部点字典parcel_id - (x, y) point_dict {} with arcpy.da.SearchCursor(fc_inside_point, [PARCEL_ID, SHAPEXY]) as cursor: for row in cursor: point_dict[row[0]] row[1] # 遍历边界线计算方向关联本宗地和邻宗信息 with arcpy.da.UpdateCursor(fc_boundary, [SHAPE, LEFT_FID, RIGHT_FID, PARCEL_ID, NB_NAME, DIRECTION]) as cursor: for row in cursor: geom row[0] left_fid, right_fid row[1], row[2] # 这里根据实际数据结构把 LEFT_FID / RIGHT_FID 映射到宗地编号和邻宗名称 # 省略中间关联步骤 midpoint geom.positionAlongLine(0.5, True).firstPoint # 内部点需要通过关联确定当前线属于哪个宗地 parcel_id 示例宗地号 center point_dict.get(parcel_id) if not center: row[5] 未判断 cursor.updateRow(row) continue direction get_direction(center[0], center[1], midpoint.X, midpoint.Y) row[3] parcel_id row[5] direction cursor.updateRow(row) # 最后用 pandas 或 arcpy.Statistics_analysis 按 parcel_id direction 分组拼接 # 拼接规则在外部完成也可以直接把分组结果输出到表里再处理上面的脚本只是示例框架真实生产环境里还需要把LEFT_FID、RIGHT_FID和宗地面层的OBJECTID关联起来判断哪一侧是本宗地、哪一侧是邻宗。判断逻辑一般是如果LEFT_FID是当前宗地的FID那么RIGHT_FID对应的面就是邻宗反过来也一样。如果一侧FID为-1说明该侧没有面需要做特殊标记。4.4 输出土地证四至界线文件四至文本生成后下一步是输出“四至界线文件”。这个文件既是为了提交给登记系统也是为了方便后续检查。我通常输出两个成果。第一个是宗地面层副本在属性表里加上“东至”“南至”“西至”“北至”四个正式字段以及一个“四至总描述”字段。第二个是边界线层每条线带上“本宗地编号”“邻宗编号”“邻宗名称”“方向”“界址线长度”等字段。这个线层就是四至界线文件的核心它把“哪条边邻接谁、在哪个方向”全部记录下来之后的质检、抽查、争议调处都能用上。输出文件的命名和分层要规范。推荐命名方式ZDDM宗地代码_SZDW四至单位_SX属性或者直接用中文拼音缩写。文件格式建议输出File GDB要素类因为字段长度限制更宽如果对方需要SHP再导出SHP副本注意SHP字段名有10字符限制中文长字段名会出现截断问题导出前先改好字段名。另外建议顺便导出一份Excel四至汇总表每行一宗地包含宗地代码、权利人、东至、南至、西至、北至。这份表不用做得很复杂方便甲方或者项目负责人直接打开看也方便后续导入权籍调查表模板。Excel字段可以直接用中文也不用担心字段名长度问题。5. 实战踩坑记录这些问题在测试数据里根本看不出来5.1 拐角处边界被重复归类第一次跑批量流程时我抽样检查成果发现不少宗地在东北角、西南角这些拐角位置的邻宗名称会同时出现在两个方向里。比如东北角的一个邻宗既出现在“东至”里又出现在“北至”里。原因其实不复杂。拐角位置本身就是两条边界线交汇的地方拓扑上存在两个方向的边界线段各有一段邻接着同一个对象。如果严格按方位角归类东北角那个邻宗确实同时接触了东侧边界和北侧边界。这种情况从图形上看没错但从四至描述习惯上看同一对象同时出现在两个方向会显得冗余。解决办法有两个我倾向第二种。第一种是调整方位角的划分区间把东北角那部分角度比如45度附近单独归到“东北”方向但这样会引入新的方向词和地籍调查表的标准格式不一致。第二种是在文本生成环节做规则约束如果同一个邻宗已经出现在前一个方向里且两段共享边界长度差别不大则优先归入边界总长度更长的那个方向并在另一个方向中剔除。这个规则用属性查询和去重就能实现不需要改动底层空间数据。5.2 同一条路被拆成多个面四至变啰嗦村庄里的路或者河流经常被多个村组的面层分割成很多段。在生成四至时就会出现“东至一组道路、二组道路、三组道路”这种看起来非常奇怪的描述。严格来说这块地东侧邻接的就是同一条道路只是数据库里这条路被村界切成了多段。之所以会出现这种情况是因为输入面层里道路不是独立图层而是被当作权属单位的面参与分析的。如果道路宽度不大、方向一致我建议在数据准备阶段就把同一条道路合并成一个面不要让它被权属界线切割。如果因为数据来源限制道路面没法合并也可以在文本生成阶段做“名称聚合”。也就是说只要邻接对象的“地物名称”字段相同分组时就把它们合并成一个对象不按FID强行区分。前提是这些道路面必须有一个可靠的道路名称字段没有的话就要提前人工补充。5.3 邻宗名称不规范出来一堆“未命名”生成结果里最让人头疼的批量问题就是“未命名”。明明图上能看到邻宗属性表里却查不到名称或者名称字段是空的。这种情况多半出在数据入库阶段。有些区域的地籍图只录了地块编号和面积权利人名称、地物名称没有录入完整或者只录在了CAD的注记层里没有转到GIS属性表中。遇到这个问题没有什么省事的捷径必须回到原始资料去补录。但可以做一个工作先把所有“未命名”的记录导出成清单按图幅号和宗地代码排序交给外业或者资料管理员一次性补充而不是让内业人员在成果表里一个个找。这个过程看起来和“批量生成”没关系但实际项目里它往往是最耗时的一环务必提前规划。我还习惯在输出四至界线文件时额外加一个“数据来源”字段标注这一条邻接对象名称是来自GIS属性表、外业调查表还是人工补录。后面如果成果要提交质检这个字段能省掉不少解释时间。5.4 人工复核怎么查效率最高自动生成完之后人工复核依然必不可少但复核也有技巧不需要每宗地都全量核对。我建议抽样复核按“高风险宗地优先”的原则来。优先检查三类地块一是形状特别不规则的宗地比如L形、狭长形、弧形边界二是位于村庄边缘、外侧是耕地或空地的宗地三是邻接对象特别多、四至字段特别长的宗地。这三类地块正好是自动生成最容易出错的对象。批量生成过程中我还会让脚本输出一个“疑点清单”。比如边界线左右FID中有一侧为-1的记录方向无法判断的记录四至描述里出现超过5个邻接对象的记录都写进清单。这个清单就是复核的优先顺序表按清单过一遍比从头到尾看几千宗地高效得多。5.5 常见问题速查表问题现象常见原因建议处理方式边界线左右FID大量为-1面层之间有缝隙或未闭合回到数据准备阶段用拓扑工具消除缝隙四至描述出现同一邻宗多次同一对象被多个面切割或与宗地有多段共享边按“宗地方向名称”去重方向判断错误使用质心而非内部点改用“要素转点”工具生成内部点再计算方位角道路名称重复啰嗦道路面被权属线切开数据准备阶段合并道路面或按名称聚合邻宗名称为空或“未命名”属性表缺少名称字段导出清单补录标注数据来源拐角对象出现在两个方向拓扑上确实多方向邻接按共享边界长度优先级归入主方向Shapefile输出后字段名变短SHP字段名10字符限制先在GDB里处理完导出前重命名字段6. 最后分享一点个人体会这个批量填四至的流程我在不同项目里反复调整过很多次。最大的体会是自动化能解决的永远是“重复劳动”这部分数据质量的上限决定了批量生成的正确率上限。数据干净脚本跑出来基本能用数据乱再好的规则也救不回来。所以每到一个新项目我宁愿多花几天时间做数据检查和清理也不愿意急着去跑流程。另一个实际经验是自动生成的字段尽量用临时字段保存审核通过后再替换正式字段。这样万一发现某个方向规则写错了可以改了规则重新生成不用恢复数据。如果直接把正式字段覆盖了改一次规则就要重导一次原始数据非常被动。后续如果想把这个流程再做得精细一点可以往两个方向扩展。一是把这些规则集成到ArcGIS Toolbox里做成带参数的工具面板让不懂代码的内业人员也能自己跑二是把“四至界线文件”对接不动产登记系统实现从地籍库到登记簿的一体化更新。这些我在后面的项目里还在继续试验等跑通了再来分享。本文还有配套的精品资源点击获取