简介:面向GIS专业学习者的《ArcGIS空间分析实例与练习数据(第3—8章)》是一套实操型练习资源,内容围绕缓冲区分析、叠置分析、网络分析、地形分析和栅格分析等核心空间分析技术展开,适合在城市规划、环境保护、灾害应对等场景下提升技能。压缩包共657个文件,整体大小26.4MB,以Shapefile矢量数据(shp/shx/dbf)、GRID栅格数据(adf)、ArcGIS地图文档(mxd)和MDB地理数据库等主流格式为主,数据类型多样但又不过度臃肿,可直接加载到ArcMap中对照练习。目前已有393人学习下载,适合希望从基础到进阶系统掌握ArcGIS空间分析操作的用户。配套练习包含地图文档、结果图层及操作说明,读者可沿完整流程练习数据加载、参数设置、分析执行与成果导出,逐步形成规范化的空间分析工作思路。
1. 为什么照着书操作,结果却总是和书里不一样
拿到一本空间分析教材的第 3 到 8 章配套练习数据,很多人的第一反应是“按书上的步骤跑一遍”。但真正动手时你会发现,明明工具和参数都对,结果图却和书里对不上:缓冲区范围离谱、叠加结果空得只剩边界、插值表面布满异常凸起。这不是你操作错了,而是练习数据在进入你的电脑之前,坐标系、路径、字段和容差这些“环境变量”已经决定了结果。
这套练习数据的价值不在于让你复现书里的图,而在于让你把矢量分析、栅格分析、插值和地形分析这几条主线串成一套能迁移到真实项目里的流程。适合这几类人:刚学完基础操作但没做过完整案例的学生、入职后要独立出图的初级工程师、以及准备把空间分析真正用于生产的开发者。接下来我会按数据准备、矢量分析、栅格与插值、地形分析的顺序,把每一步的参数选择和踩过的坑讲清楚,照着做就能跑通,跑完还能拿这套流程去接新数据。
2. 数据先理清再用:目录、坐标系与三个高频准备工作
2.1 别急着拖数据:先给练习数据建一个能复用的工程目录
练习数据的原始文件夹通常解压后直接可用,但我强烈建议你不要在原始文件夹里做任何操作。常见做法是复制一份到自己的工作目录,并且按“原始数据 / 中间成果 / 最终成果”三层结构组织。这个习惯在练习阶段看不出差别,一旦数据量超过几十个图层,或者你需要在不同方案之间切换对比时,它能救命。
我的标准目录结构是这样:
D:/gisdata/ch3/ ├─ source/ # 原始练习数据,只读,不改动 ├─ workspace/ # 中间结果,gdb 或 mdb └─ output/ # 最终出图、导出表、模型文件建立目录后,先在 ArcGIS Pro 里新建一个地图工程,把 workspace 里的数据库作为默认地理数据库。这一步非常关键:后续所有工具的默认输出都会落到这个数据库里,而不是散落在 C 盘临时目录。很多人做练习时中途崩溃,就是因为输出路径指向了系统临时目录,工具一报错结果就找不到了。
2.2 用一段脚本批量检查所有矢量图层的坐标系
练习数据里最隐蔽的问题就是坐标系不统一。你在地图上看到两个图层“叠”在一起,其实是软件做了动态投影,并不代表数据本身的坐标系一致。缓冲区的距离单位、叠加分析的容差、面积计算结果,全部由每个图层自身的坐标系决定,而不是由地图显示决定。
打开属性表逐个查看太慢,我一般直接跑一段脚本批量打印所有图层的坐标系信息。ArcGIS Pro 的 Python 窗口里这样写:
import arcpy p = arcpy.mp.ArcGISProject("CURRENT") m = p.activeMap for lyr in m.listLayers(): if lyr.isFeatureLayer: sr = lyr.spatialReference if sr: print(lyr.name, "|", sr.name, "|", "EPSG:" + str(sr.factoryCode)) else: print(lyr.name, "| 未定义坐标系")这段代码会输出每个矢量图层的坐标系名称和 EPSG 编号。注意sr.factoryCode是整数,转成字符串拼接输出更直观。如果你用的是 ArcMap,把arcpy.mp.ArcGISProject("CURRENT")换成arcpy.mapping.MapDocument("CURRENT"),activeMap换成activeDataFrame即可。
跑完的结果里如果出现混合情况,比如有的图层是 WGS84 地理坐标系,有的是 CGCS2000 投影坐标系,你需要先统一。练习数据通常不会给你一个现成的统一工具,实操中我会选择以投影坐标系为准,用“投影”工具把地理坐标系的图层转过去。切记不要用“定义投影”去改,那是给缺失坐标系的文件补信息的,不是用来转换的。
2.3 路径与文件命名:两个让练习中途翻车的小习惯
第一是路径。工具报错 999999 或 000732 时,十个里有八个是路径问题。中文路径、带空格的文件名、网络映射盘都可能导致工具读不到数据。练习数据如果放在带中文的目录下,我的建议是直接复制到纯英文路径下再开始。
第二是字段名。Shapefile 的属性字段名会被截断到 10 个字符,而且不能以数字开头。练习数据如果是从 mdb 导出的 shp,字段名可能已经变样。你在栅格计算器里写表达式时,字段名带空格或特殊字符必须加引号,否则表达式直接报语法错误。后面第四章我会给一个具体例子,这里先记住:任何写入表达式或 SQL 查询的字段名,都先打开属性表确认它长什么样。
3. 矢量分析三件套:缓冲区、叠加与擦除的选址实战
3.1 缓冲区:先把距离单位讲透再设置参数
练习数据第 3 到 5 章里,缓冲区一定是最早上手的一个工具。它表面上一个参数就能跑,实际上最容易翻车。核心问题不是缓冲距离填多少,而是你填进去的数字被当成了什么单位。
当输入图层是地理坐标系(比如 WGS84),数据框单位默认是“度”。此时你在缓冲区距离里填 500,工具会认为你要缓冲 500 度,而不是 500 米。结果就是缓冲区把整个区域盖满,看起来“没生效”。反过来,如果数据框是投影坐标系,你填 500 就可能真的只缓冲了 500 米,和书里图上展示的范围完全两样。
我在练习中一定写成带单位的字符串,而不是裸数字。这是缓冲区工具的参数表,照着设基本不会错:
| 参数 | 推荐设置 | 说明 |
|---|---|---|
| 输入要素 | 练习数据中的点要素 | 点线面都可缓冲,线要素注意侧类型 |
| 缓冲距离 | "500 Meters" | 务必带单位,不要只写 500 |
| 线侧类型 | FULL | 默认 FULL;线要素选 LEFT/RIGHT 用于河岸分析 |
| 端头类型 | ROUND | FLAT 用于道路扩宽等场景 |
| 融合类型 | ALL | 所有重叠区域融合成单个要素,统计面积更方便 |
| 输出要素 | 写入 workspace 数据库 | 不要输出到 shp,避免字段名截断 |
这里最值得说的是融合类型。NONE保留每个原始要素的独立缓冲区,重叠区域会被重复计算;ALL会把所有缓冲区合并成一个大面,方便后续用面积来衡量覆盖范围。练习里的选址场景通常选ALL,因为你要的是“整个服务范围”,而不是“每个点的单独范围”。
3.2 叠加分析:相交、联合与擦除怎么选
缓冲区做完,下一步就是把缓冲区和其他图层叠加,筛选出符合条件的区域。练习里最常见的三个工具是相交、联合、擦除,很多人搞不清什么时候用哪个。
相交(Intersect)输出的是多个输入图层的重叠部分,适合做“同时满足多个条件”的分析。比如你既要避开生态敏感区,又要靠近道路,就用相交取两边的交集。
联合(Union)把所有输入图层的范围合并,属性表里每条记录保留原始图层的所有字段,适合做分类统计。但如果输入超过两个图层,字段组合爆炸,属性表会变得很难看,练习阶段尽量别一次联合太多。
擦除(Erase)是“扣除”的意思,用擦除要素把输入要素中重叠的部分删掉,适合做排除式分析。选址练习里最常见的流程是:先做适宜区,再用擦除把禁建区、水域、断层带去掉。
我的迭择逻辑很简单:条件之间是“并且”关系用相交,是“排除”关系用擦除,需要保留两侧所有属性再统计用联合。这个判断标准在真实项目里同样适用。
3.3 用 Python 把三件套串成一条命令链
练习数据的价值就在于你可以反复跑。当你把同一套流程换到不同区域、不同数据上时,手动操作每个对话框会很痛苦。我习惯把三件套写成一段可复用的脚本。
import arcpy arcpy.env.workspace = r"D:/gisdata/ch3/data.gdb" arcpy.env.overwriteOutput = True # 第一步:缓冲区 arcpy.Buffer_analysis( in_features="schools", out_features="schools_buf500", buffer_distance_or_field="500 Meters", line_side_type="FULL", line_end_type="ROUND", dissolve_option="ALL" ) # 第二步:擦除不宜建设区域 arcpy.Erase_analysis( in_features="schools_buf500", erase_features="forbidden_zone", out_features="schools_valid" ) # 第三步:与道路缓冲区分带求交,统计覆盖面积 arcpy.Intersect_analysis( in_features=[["schools_valid", ""], ["roads_buf100", ""]], out_features="schools_final" )这段代码的逻辑链是:先圈出学校周边 500 米覆盖范围,再排除禁建区,最后和道路缓冲区求交,得到既有服务覆盖又靠近道路的候选区。overwriteOutput = True保证了重复运行时不会因为同名输出报错。
参数细节:Erase_analysis的第二个参数是擦除要素,顺序不能反;Intersect_analysis的输入用列表套列表的格式,内部第二个空字符串保留默认连接属性。跑完检查一下schools_final的属性表,如果某个字段全部为空,说明对应的输入图层属性没有带上,回去查输入数据是否真的参与了叠加。
4. 栅格分析与插值:从重分类、克里金到水文提取
4.1 重分类与栅格计算器:把多条件叠加成一张适宜性图
矢量分析解决的是边界和范围问题,栅格分析解决的是连续表面和多条件评估问题。练习数据到第 6、7 章通常会给你一组栅格:距离道路的欧氏距离、坡度、土地利用类型,要求你做一张适宜性分级图。这一步的核心工具是重分类和栅格计算器。
先做重分类。把连续栅格按阈值分成 4 级,得到一个重分类表:
| 原始值区间 | 重分类值 | 含义 |
|---|---|---|
| 0 - 500 | 3 | 高适宜 |
| 500 - 1000 | 2 | 中适宜 |
| 1000 - 2000 | 1 | 低适宜 |
| 大于 2000 | 0 | 不适宜 |
| NoData | NoData | 保持不变 |
重分类对话框里最容易被忽视的是“将 NoData 保留为 NoData”这个选项。如果你不小心把它设成 0,后面计算面积时 NoData 区域会被当成“不适宜区”统计进去,结果面积虚高。练习数据里的 NoData 区域往往是数据覆盖范围之外,把它们算进结果会让你的制图范围和书里完全不一致。
重分类完成后,用栅格计算器把多个条件叠起来。练习里常用的表达式是:
Con("recl_dist" == 3, Con("recl_slope" >= 2, 3, 2), Con("recl_dist" == 0, 0, 1))逻辑是:距离分级为 3 且坡度分级不低于 2 的,输出 3;距离分级为 0 的输出 0;其余输出 1。Con函数是条件判断,嵌套使用要注意括号配对。栅格计算器报错 000539 时,先检查表达式里的字段名有没有带引号、括号有没有闭合、有没有用了中文标点。
4.2 克里金插值:参数不是默认值就够用
插值章节的练习数据通常是一批采样点,要求生成连续表面。默认情况下你直接点“克里金”工具就能出图,但结果往往不理想:表面布满以采样点为中心的“牛眼”,或者出现负值。这是因为默认搜索邻域和半变异模型并不适配每一套数据。
克里金插值最关键的两个参数是半变异模型和搜索邻域。练习数据里样本点不多时,我一般这样设:
| 参数 | 推荐设置 | 说明 |
|---|---|---|
| 半变异模型 | 球面(Spherical) | 空间相关性随距离线性衰减,最通用 |
| 搜索邻域-最大邻域数 | 12 | 样本太少时降到 8,避免过度平滑 |
| 搜索邻域-最小邻域数 | 8 | 至少保证每个预测点有足够样本 |
| 输出像元大小 | 与原栅格一致 | 取练习数据中 DEM 的像元大小 |
| 输出表面 | 栅格而不是点 | 方便后续做坡度、填挖方向分析 |
如果结果仍有明显牛眼,问题通常出在数据分布上:采样点过于集中,或者存在离群值。一个有效手段是先在“探索数据”里做一个直方图检查,看看数据的分布和趋势。练习数据如果只有几十个点,别指望克里金能产出光滑表面,合理做法是和反距离权重法做对比,选择误差更小的结果。
交叉验证是检验插值质量的标准手段。在插值工具的“验证数据”选项中留出一部分点不参与插值,然后用生成表面提取这些点的预测值,和实测值对比求解均方根误差。后面第六章我会给出一个完整的验证流程。
4.3 坡度、坡向与水文提取:地形分析上手就能用的参数
地形分析是练习数据里最容易“照着跑但跑不出图”的部分。坡度坡向工具参数少,但输出栅格需要和原 DEM 的像元大小一致。我在练习中固定把环境设置里的“像元大小”改为“与 DEM 相同”,而不是默认的“最大值”,否则坡度结果会明显粗于原始 DEM。
水文分析的流程是固定的:填洼 → 流向(D8)→ 流量 → 河网提取。这个流程每个步骤都依赖上一步的输出,填洼的 Z 限制是第一个坑。默认的填洼工具会把所有洼地全部填平,导致河网密度异常,生成大量不该有的平缓河段。练习数据里我建议把 Z 限制设成 10 米以内,只填真正的数据错误洼地,保留地形本身的洼地特征。
河网提取的关键参数是流量阈值。阈值越小,提取的河网越密,但伪河道也会更多;阈值越大,河网越稀疏,主河道越清晰。练习数据我一般先用 5000 试跑一次看效果,再调整到 10000 对比。这不是玄学,而是根据两种阈值下的河网形态和水文逻辑做判断,最终选择与书里水系最接近的那个参数。
5. 这套练习最容易翻车的五个坑与排查思路
5.1 缓冲区结果“隐形”或巨大无比,先查数据框坐标系
现象:缓冲区跑完,地图上根本看不到结果,或者结果把整个区域盖满。原因:输入图层是地理坐标系,缓冲区距离被当成度。解决:在“地图属性”里查看数据框坐标系;把缓冲区距离写成带单位的字符串,例如 "500 Meters",如果工具的输入框本身不认字符串,就先投影数据完成后再缓冲。
5.2 叠加结果为空或范围错位,字段名与容差在作怪
现象:相交或擦除后的图层记录数为 0,或者输出范围比输入缩小了一大圈。原因通常是两类:一是两个输入图层的坐标系不一致,软件在叠加时做了动态投影,容差被放宽或压缩导致结果异常;二是属性表里用于筛选的字段名不匹配,例如文本型字段和数值型字段直接做连接或条件过滤导致全部被过滤掉。解决:先统一坐标系,再检查两个图层是否有共同字段,确认字段类型一致后再叠加。
5.3 重分类后 NoData 被算作一类,结果面积虚高
现象:重分类结果看起来正常,但统计面积比实际覆盖范围大很多。原因:重分类时没有把 NoData 排除,NoData 区域被赋予了一个有效值。解决:在重分类对话框里显式选择“将 NoData 保留为 NoData”,不要让它落到任何分类。这一步在栅格计算器里同样适用,Con函数默认会认为 NoData 不满足条件,落到 else 分支,所以一定要先处理 NoData 分支。
5.4 克里金结果出现负值和异常凸起,半变异模型选错了
现象:插值表面在采样点附近出现凸起,甚至出现负值(实测值都是正数)。原因:样本量太少,半变异模型选得过于复杂,拟合出的变异函数在外推区域失控。解决:换成球面模型,并把搜索邻域的最小邻域数提高到 8 以上;如果仍然有负值,用“提取值到点”检查哪些点周围出现负值,再把那些测定值明显异常的点去掉重跑。这一步属于清洗样本,不是篡改数据。
5.5 栅格计算器报 000539,标点符号和字段名是重灾区
现象:表达式看起来没问题,但一运行就报 000539。原因:表达式里用了中文括号、中文引号,或者字段名带空格没有加引号,导致解析失败。解决:在代码编辑器里先写好表达式再粘贴进栅格计算器,确保所有符号是英文半角。字段名如果包含空格、特殊字符,用双引号括起来,例如"dist to road"。这个坑几乎每个练习者都会踩一次,踩过之后就会形成条件反射。
6. 把练习变成能力:模型构建器固化流程与插值精度验证
6.1 用模型构建器把选址流程固化成一次点击
练习数据跑完之后,最值得做的就是把前面手点过的工具串成一个模型。打开“模型构建器”,把第 3 章的缓冲区、擦除、相交三个工具依次拖入,用“连接”把上一步的输出作为下一步的输入。模型建成后,把输入图层和参数设置成模型参数,换一套数据就能直接重跑。
关键是把缓冲距离、流量阈值这类最常调整的参数暴露出来。双击模型里的工具,右键参数,选择“模型参数”,这个参数就会出现在模型工具的对话框里。这样每次重跑只需要改一个数字,不用重新打开三个工具对话框。
6.2 检验插值质量:留一交叉验证与误差统计
插值结果是否可信,不能只看表面是否光滑。把采样点数据拆成两份,一份用于插值,一份用于验证。用插值表面提取验证点位置的预测值,再在属性表里添加一个字段计算“预测值 - 实测值”,最后用“汇总统计数据”看均方根误差。误差越小,说明插值结果越可靠。
这个验证流程在练习数据里跑一遍,你就能直观感受到“选不同半变异模型对结果的影响有多大”。以后再拿到实测数据,也会本能地先问一句:这个表面误差多少,而不是只看图好不好看。
6.3 一个收尾习惯:每次练习后导出参数为配置文件
模型构建器里的模型可以直接导出为 Python 脚本,工具参数会以变量的形式写在脚本里。导出后稍微整理,这套练习数据就算真正吃透了。我个人的习惯是每个练习章节保留一个模型文件和一个导出脚本,文件名里标注数据集对应的坐标系。这样半年后再翻出来看,打开脚本就能知道当时为什么选这个参数。
插值要对比几种模型,选址要对比几组距离,这种“对比”思维才是练习数据真正给你的东西。数据会过期,工具会更新,但参数分析和误差验证这套流程不会过时。把这套动作练成本能,比多跑几遍书里的案例有用得多。希望帮到你。
本文还有配套的精品资源,点击获取