3.1 矢量与栅格:同一条河的两种表达


文档摘要

3.1 矢量与栅格:同一条河的两种表达 本节摘要:GIS 用两种模型表达世界——矢量用点线面精确刻画离散对象,栅格用规则格网采样连续现象。模型选择决定存储量、精度与分析手段:矢量擅长属性查询与边界明确的运算,栅格擅长连续表面与逐像元叠加。本节对比两种模型的表达、存储与分析差异,并给出按现象特征选模型的判断规则。 同一条河的两种身世 在水利部门的数据柜里,同一条河有两份档案。一份是矢量:一条折线要素,从上游水库到下游河口共 1200 个折点,属性表里挂着河名、等级、管理单位。另一份是栅格:一张 30 米分辨率的遥感分类图,这条河表现为一串被标记为"水体"的像元,蜿蜒但没有明确的边界线。 两份档案都对,但用途天差地别。要查"这条河归谁管",矢量档案一行属性就答了,栅格档案只能干瞪眼;

3.1 矢量与栅格:同一条河的两种表达

本节摘要:GIS 用两种模型表达世界——矢量用点线面精确刻画离散对象,栅格用规则格网采样连续现象。模型选择决定存储量、精度与分析手段:矢量擅长属性查询与边界明确的运算,栅格擅长连续表面与逐像元叠加。本节对比两种模型的表达、存储与分析差异,并给出按现象特征选模型的判断规则。

同一条河的两种身世

在水利部门的数据柜里,同一条河有两份档案。一份是矢量:一条折线要素,从上游水库到下游河口共 1200 个折点,属性表里挂着河名、等级、管理单位。另一份是栅格:一张 30 米分辨率的遥感分类图,这条河表现为一串被标记为"水体"的像元,蜿蜒但没有明确的边界线。

两份档案都对,但用途天差地别。要查"这条河归谁管",矢量档案一行属性就答了,栅格档案只能干瞪眼;要算"河道两岸 30 米内植被覆盖度",栅格档案逐像元统计立等可取,矢量档案还得先转成栅格。这不是谁更好的问题,是两种世界观分工的问题。

矢量的世界观是对象:世界由一个个有边界的实体组成,每个实体的位置用坐标串精确记录,身份与性质记录在属性表。栅格的世界观是场:世界是连续变化的表面,用规则格网采样,每个像元存一个值——高程、温度、反射率。对象与场,离散与连续,这就是两种模型的分野。

图:矢量与栅格对同一区域的编码

图:矢量与栅格对同一区域的编码

存储与分析:差异的由来

两种模型的能力差异,根源在存储结构。矢量只存"有用的地方"——一条河 1200 个折点就 1200 对坐标,周围大片空地不占一个字节;栅格不管有没有地物,整个范围逐格记录,30 米分辨率覆盖一个县就是上亿像元。所以矢量图层的文件常常以兆计,栅格数据动辄以吉计。

存储结构又决定了分析方式。矢量叠加(第 5 章)要做几何求交运算,精确但计算量大;栅格叠加(第 6 章)是逐像元的数值运算,像元对像元天然对齐,速度极快。这就是"栅格叠加快、矢量叠加准"的由来。精度上,矢量的边界是数学精确的;栅格的边界受分辨率限制,30 米像元意味着小于 30 米的地物要么被吞掉要么被放大。

分辨率还带来一个容易忽视的性质:栅格的存储量随分辨率平方增长。分辨率从 30 米提高到 3 米,像元数变一百倍。盲目追求高分辨率,先算一算磁盘与算力预算。

动手:用同一只眼看两种数据

用 ArcPy 分别体检一份矢量河流与一份栅格高程,观察两套属性体系:

import arcpy arcpy.env.workspace = r"K:/gisdata/county.gdb" # 矢量一侧 fc = "rivers" desc = arcpy.Describe(fc) print("类型:", desc.shapeType, "| 要素数:", int(arcpy.management.GetCount(fc))) # 输出: 类型: Polyline | 要素数: 37 with arcpy.da.SearchCursor(fc, ["NAME", "LEVEL"]) as cur: print("首条属性:", next(cur)) # 输出: 首条属性: ('东干渠', 3) # 栅格一侧 ras = arcpy.Raster("dem30") print("尺寸:", ras.width, "x", ras.height, "| 像元大小:", ras.meanCellWidth) # 输出: 尺寸: 4321 x 3680 | 像元大小: 30.0 print("像元类型:", ras.pixelType, "| 无效值:", ras.noDataValue) # 输出: 像元类型: F | 无效值: -3.4e+38

注意两套"属性"的位置:矢量的属性在表里一行行查;栅格的"属性"分散在每个像元的值里,想问"某个点的高程"得按坐标取像元值:

import arcpy ras = arcpy.Raster("K:/gisdata/county.gdb/dem30") # 读取某个坐标点的高程:先做几何点再取值 pt = arcpy.PointGeometry(arcpy.Point(449361.8, 4417904.3), arcpy.SpatialReference(4534)) result = arcpy.management.GetCellValue(ras, f"{pt.centroid.X} {pt.centroid.Y}") print("该点高程:", result.getOutput(0), "米") # 输出: 该点高程: 62.437 米 # 统计整幅栅格的基本特征 arcpy.management.CalculateStatistics(ras) print("最小 最大 均值:", ras.minimum, ras.maximum, round(ras.mean, 1)) # 输出: 最小 最大 均值: 11.2 873.5 96.8

两段脚本对照着看,"对象与场"不再是抽象概念:矢量的提问方式是"这条要素的 NAME 是什么",栅格的提问方式是"这个坐标格子的值是多少"。

相互转换:单向门与双向代价

两种模型可以互转,但代价不对称。矢量转栅格(要素转栅格)是无损方向之一:边界按像元量化,损失边界精度,换来规整结构。栅格转矢量(栅格转面)则是有损的:像素化的锯齿边界被追成矢量面,需要再经平滑与化简才能看。

选型的经验法则因此是:能一开始就选对模型最好;确实两用时,以主分析类型的模型为存储格式,另一种按需派生。第 6 章的适宜性建模就是典型——矢量地块最终要转成栅格参与叠加,因为逐像元加权合算是那类问题的主场。

⚠️ 常见坑:矢量转栅格时忽虑像元对齐参数。多源栅格若像元大小或左上角原点不一致,逐像元叠加时图层会错位半个格子。转换时统一指定 snapping 捕获栅格,是第 6 章的前置纪律。

💡 关键直觉:把矢量当"名词清单"、栅格当"照片底片"。名词清单适合点名与查户口,底片适合量色与算面积。分析任务说要点名还是要量色,模型选择自动揭晓。

要点回顾

  • 两种世界观:矢量是对象模型,栅格是场模型,分野在离散与连续
  • 存储决定分析:矢量叠加几何求交精确而慢,栅格叠加逐像元对齐而快
  • 分辨率平方律:像元减半存储乘四,选分辨率先算预算
  • 提问方式不同:矢量查表,栅格取格,两套体检脚本各有一套
  • 转换不对称:矢量转栅格量化边界,栅格转矢量产生锯齿,尽量源头选对

下一节进入容器内部,看地理数据库用什么制度管理这一屋子的矢量与栅格。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U