简介:在不动产登记与土地确权工作中,宗地四至描述是权属调查成果的关键组成部分,其准确性与规范性直接影响登记质量和法律效力。传统人工填写方式依赖内业人员逐宗判读地籍图,工作量大且方向判断容易出错。借助地理信息系统中的空间分析技术,可以将相邻关系计算转化为自动化流程:通过要素转线提取边界、判断边界与宗地内部点的相对方位,再按规则聚合邻接对象名称,即可批量生成规范的四至文本和界线文件。该方案适用于地籍调查、集体土地确权、权籍建库等场景,能够显著提升内业效率,降低人为误差,同时为登记系统提供可追溯的数据成果。本文从地籍数据处理的实际工程需求出发,介绍一种结合空间运算与属性关联的宗地四至批量处理方法,并给出可落地的技术路径与常见问题应对策略。 干过土地确权登记、不动产登记的朋友,一定对“四至”这两个字印象深刻。每次整理土地证材料,最磨人的往往不是外业测点,也不是内业成图,而是把每一宗地的东至、南至、西至、北至写得又准又规范。一个县几千宗地,要是靠人一宗一宗去看图、翻资料、比对邻宗名称,工作量真的能让人崩溃。这个项目的目标很直接:用已有的地籍图数据,通过空间分析批量生成宗地四至描述,同时输出可用于归档和登记系统的“四至界线文件”,把原来三五天的内业工作压缩到一两个小时。
我本身是做测绘地理信息出身的,这些年接触过不少地籍调查、集体土地确权、不动产权籍调查的项目,也亲眼见过同事对着屏幕一条边一条边描、一个方向一个方向写“四至”的场景。这篇内容就是把我实际操作过的批量处理方案完整复盘一遍,把思路、流程、脚本、踩过的坑都写清楚。不管你是做测绘的内业人员、自然资源系统的业务骨干,还是刚接触地籍数据处理的学生,看完之后至少能知道该从哪里下手,能避开哪些坑。
1. 先搞懂宗地四至到底在填什么,批量填写的真正难点在哪
1.1 四至不是简单的方位词,是有法律效力的权属描述
很多人刚接触地籍数据时,觉得四至就是“东边是什么、南边是什么”而已。这话不能说错,但放到土地登记的业务场景里,四至远没有这么简单。
土地证、不动产权证书以及权籍调查表里的“四至”,其实是对宗地四周边界邻接关系的文字化表达。它在法律上承担着明确权属范围、避免界址纠纷的作用。一张图上如果只画了红线,没有文字说明,登记系统无法归档,也不便于公众查询。尤其在集体土地确权登记工作中,四至内容必须与宗地图、界址点坐标保持一致,三者互相印证。一旦四至描述与实际图面不符,轻则退件重做,重则引发邻里权属纠纷。
所以四至描述有一个隐含要求:既要简练,又要准确。例如“东至:XX村民委员会,南至:XX路,西至:XX河,北至:XX公司”,这已经是比较规范的四至写法了。它本质上是在回答四个方向的问题——宗地边界的外侧邻接了什么。如果宗地边界由多段线组成,每一段邻接的对象不同,四至描述还要根据方位把它们合理地归并到一起,不能漏写,也不能张冠李戴。
1.2 为什么批量填写比想象中难
知道了四至的业务含义,就能理解为什么批量填写这件事一直不好做。
首先是量大。一个县的集体土地确权项目,几千宗地再正常不过。每宗地四个方向,哪怕每宗地只花三分钟,也是几个小时起步。但实际操作中三分钟通常写不完,因为要先去看图、缩放、找邻宗权利人名称、确认道路名称,还要保证同一邻宗在不同宗地上写法一致,这已经接近“做编辑”的工作量了。
其次是方向判断容易乱。人工看图时,东南西北靠肉眼判断,宗地长得不规则的时候,判断出来的方向常常不一致。同一条边界,有人写东至,有人写东北至,最后汇总的成果五花八门,质检阶段很痛苦。
第三是邻接对象的准确性很难保证。图形上能看到边界,但边界外面是谁、叫什么名字,要靠地籍库属性或者现场调查资料去查。光看图不看属性,很容易把“相邻宗地”写错,或者把“道路”写成“空地”。
把这些问题放到一起就能明白,批量填写四至本质上不是“输入法提速”的问题,而是一个空间分析问题:从图形上计算出每条宗地边界外侧是谁,自动判断方位,再按规范生成文字。想通了这一点,技术路线其实就清晰了。
2. 方案选型:与其手工慢慢填,不如把“相邻关系”算出来
2.1 常规做法能跑通,但代价太大了
我知道有些团队也用Excel、Word做了不少“半自动”工作。比如先把所有宗地的权利人、地类导出来,然后按东、南、西、北各建一个字段,最后根据人工看的图逐个填。这种方法本质上还是人在看图,只是把纸张换成了屏幕,效率提升非常有限。
还有一种常见做法是只统计四个方向最近的宗地,把这个最近宗地的权利人作为该方向的四至。这种方法在宗地特别规整、边界横平竖直的平原地区勉强可用,但只要遇到弧形边界、斜向边界、或者一块宗地同时邻接好几家单位,误差就大得离谱。我见过用这种方法生成的成果,同一个邻宗在四个方向里出现了三次,权籍调查表拿出去根本没法用。
所以我在这个项目里没有走“最近邻”的思路,而是选择了“边界邻接分析”。核心就是:找出每一条宗地边界线,判断它的左侧和右侧分别是谁,其中一侧是本宗地,另一侧就是邻接对象。这样就获得了完整的“哪条边邻接谁”的对应关系,再结合方位角判断边界位于本宗地的哪个方向,自然就能生成四至描述。这套思路对任意形状的宗地都适用,不用管宗地是正方形还是L形。
2.2 核心思路:把空间距离翻译成文字
理解这个方案,只需要想清楚三个问题。
第一,宗地的边界线是什么。在地籍图里,宗地是面要素,它的边界是一圈闭合线。批量处理时,我们要把这些闭合线拆分成一段一段的独立线段。每段线都拥有两个邻接对象,左边一个面,右边一个面。如果左边是本宗地,右边就是外侧对象;反过来也一样。
第二,外侧对象是谁。如果宗地图里已经把相邻宗地、道路、河流全部建成了面,那么通过“要素转线”功能,自动就能得到每个边界线段的左右面编号。再用编号去关联面属性表,就能拿到外侧对象的地块编号、权利人名称、地物名称等字段。如果外侧没有面,说明这块地外面是空地图斑或者未建库的数据,这时需要单独标记,不能默认跳过。
第三,这根边界线在宗地的哪个方向。我采用的是“以宗地内部点为中心,计算边界线中点相对内部点的方位角”的方法。如果边界线中点在宗地内部点的东侧,这段边界就归入东至;南侧就归入南至。之所以用内部点而不是质心,是因为凹多边形(比如L形、U形地面)的质心可能落在宗地外部,直接用质心算出来的方向会错得很离谱。
2.3 工具链选择:ArcGIS + arcpy,兼顾效率和可维护性
工具方面,我选择的是ArcGIS(Desktop或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 = r"D:\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_length=4) arcpy.AddField_management(fc_boundary, "PARCEL_ID", "TEXT", field_length=50) arcpy.AddField_management(fc_boundary, "NB_NAME", "TEXT", field_length=200) 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", "SHAPE@XY"]) 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里,做成带参数的工具面板,让不懂代码的内业人员也能自己跑;二是把“四至界线文件”对接不动产登记系统,实现从地籍库到登记簿的一体化更新。这些我在后面的项目里还在继续试验,等跑通了再来分享。
本文还有配套的精品资源,点击获取