1.2 解剖一张图层:几何、属性与空间参考 本节摘要:一张可参与叠加的图层由三要素构成——几何记录"在哪里",属性记录"是什么",空间参考记录"凭什么对齐"。本节拆解三要素的存储方式与相互关系,辨析数据源、图层与图层文件三个易混概念,并给出用 ArcPy 体检一张图层的标准动作。 把一张图层放到解剖台上 上一节的防汛场景里,土地利用图层被我们当成了一个黑盒:加入地图、点开属性表、参与叠加。这一节把黑盒打开。任何一张图层,无论来自 shapefile、地理数据库还是云端服务,内部都可以拆成三个彼此咬合的部分。 几何是图层的身体。矢量世界里它只有三种基本形态:点、线、面。一座气象站是点,一条河道中心线是线,一块耕地是面。
本节摘要:一张可参与叠加的图层由三要素构成——几何记录"在哪里",属性记录"是什么",空间参考记录"凭什么对齐"。本节拆解三要素的存储方式与相互关系,辨析数据源、图层与图层文件三个易混概念,并给出用 ArcPy 体检一张图层的标准动作。
上一节的防汛场景里,土地利用图层被我们当成了一个黑盒:加入地图、点开属性表、参与叠加。这一节把黑盒打开。任何一张图层,无论来自 shapefile、地理数据库还是云端服务,内部都可以拆成三个彼此咬合的部分。
几何是图层的身体。矢量世界里它只有三种基本形态:点、线、面。一座气象站是点,一条河道中心线是线,一块耕地是面。看似简单的三选一,实际上决定了你能做什么运算——缓冲区对三者皆可,而"计算图层的面积"只对面要素有意义。几何在数据文件中以坐标串存储,一个面要素就是一串首尾闭合的坐标点。
属性是图层的记忆。几何只回答"在哪里",至于"这块地是什么、属于谁、哪年调查的",全部记录在属性表里。属性表本质上是一张普通的关系表:一行对应一个要素,一列对应一个字段。几何与属性的绑定是 GIS 区别于绘图软件的根本——这种绑定让"选中所有类型为耕地的地块"这类操作成为可能。
空间参考是图层的户口。坐标串里的数字必须有解释规则才有意义:(4180000, 375000) 是经纬度吗?不是,它可能是高斯克吕格投影下的米制坐标。空间参考就是这串数字的解释规则,它规定坐标原点在哪、单位是什么、地球被摊平成平面时用了什么方法。第 2 章将整章讨论它,这里只需记住:两张空间参考不兼容的图层,坐标数字再精确也叠不到一起。

日常对话里三者都被叫作"图层",但它们的指代完全不同。数据源是磁盘上的物理文件或服务——一个 shapefile、地理数据库里的要素类、一个要素服务。图层是数据源在地图文档中的引用,同一个数据源可以被多个工程引用多次,配不同的符号。图层文件(扩展名 lyrx)保存的是"引用加符号化方案"这层皮,不含数据本身。
三者的关系像剧本、演出和录像带:数据源是剧本,图层是一次具体演出,图层文件记录了这次演出的布景与服装,方便下次复现。理解这个区分,才能解释两个常见现象:为什么删掉图层后磁盘文件还在(只删了演出),为什么拷贝 lyrx 给同事而对方打开是红色感叹号(剧本没给)。
属性表值得单独放大看。以下是一张土地利用图层的属性表节选:
FID 地类编码 地类名称 面积_亩 权属单位 调查年份 1 011 水田 3.2 东风村 2023 2 013 旱地 5.8 东风村 2023 3 031 有林地 12.4 林场 2022 4 104 城镇住宅 0.9 城建档案 2021 5 011 水田 2.6 西河村 2023
这张表能做的事比看上去多:按地类名称汇总面积,是属性统计;选出调查年份早于 2022 的地块优先更新,是属性查询;把地类编码关联到标准分类表补全名称,是属性连接。注意 FID 这类自动编号字段由系统维护,不可编辑,它是几何与属性行之间的锚。
字段类型有讲究。地类编码应该用文本而不是整数——它不参与算术,且前导零会被数值类型吞掉。面积字段用双精度,年份用短整型。字段类型定错,后期改表结构的代价远大于开始时多想一分钟。
拿到任何一张新图层,我习惯先跑一段体检脚本,把三要素状态打出来:
import arcpy fc = r"K:/gisdata/flood_demo.gdb/landuse" desc = arcpy.Describe(fc) # 一、几何要素 print("几何类型:", desc.shapeType) # 输出: Polygon print("要素数量:", int(arcpy.management.GetCount(fc).getOutput(0))) # 输出示例: 要素数量: 1842 # 二、属性字段 fields = [f.name for f in arcpy.ListFields(fc)] print("字段清单:", fields) # 输出示例: 字段清单: ['OBJECTID', 'Shape', '地类编码', '地类名称', '调查年份'] # 三、空间参考 sr = desc.spatialReference print("坐标系名称:", sr.name) # 输出: CGCS2000_3_Degree_GK_Zone_39 print("投影类型:", sr.type) # 输出: Projected,即已定义投影坐标系
三个输出分别对应三要素:shapeType 告诉你几何是否是预期的面,字段清单告诉你关键字段在不在,空间参考名称告诉你坐标系是否明确。任何一项出乎意料,先解决它再谈分析。这段脚本在后续章节会反复以变体出现——叠加之前点名,是图层叠加透视的基本纪律。
再补一个高频小操作:把属性表按字段分组统计,验证属性质量。
import arcpy fc = r"K:/gisdata/flood_demo.gdb/landuse" # 按地类名称汇总面积:输入、统计字段、统计方式、输出表 arcpy.analysis.Statistics(fc, "landuse_stats", [["面积_亩", "SUM"]], ["地类名称"]) # 读取统计结果 with arcpy.da.SearchCursor("landuse_stats", ["地类名称", "SUM_面积_亩"]) as cur: for row in cur: print(row[0], round(row[1], 1), "亩") # 输出示例: # 水田 812.4 亩 # 旱地 1093.7 亩 # 有林地 3420.2 亩
如果输出里出现空名称或负面积,说明属性里混入了脏数据——这正是第 3 章数据质量要系统处理的问题。
💡 关键直觉:以后每接触一种新的 GIS 数据(影像、地形、轨迹),都先问一遍三要素——几何如何表达、属性挂在哪、空间参考是什么。这个问题清单比任何软件操作都保值。
下一节从单张图层抬起头,看 ArcGIS 这个产品家族如何安排图层的整个生命周期。