ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ArcGIS空间分析实验:光盘数据正确使用与坐标系处理

ArcGIS空间分析实验:光盘数据正确使用与坐标系处理

简介:《ArcGIS地理信息系统空间分析实验教程(第2版)》配套光盘第一部分,面向GIS初学者以及需要系统掌握空间分析操作的用户。资源对应教材中的重点实验章节,提供了基础界面操作、数据管理、专题制图、地理处理建模,以及缓冲区、网络、地形等空间分析案例所需的练习数据,解决自学时“有教程无数据”的难题。压缩包共含1207个文件,主要类型为Shapefile矢量数据(shp/dbf)、文件地理数据库(gdbtable/adf)、栅格影像(img)、ArcMap地图文档(mxd)、图层文件(lyr)等,覆盖矢量、栅格、地图工程等多种格式,包体大小39.42MB,目录结构清晰,便于按章节索引所需内容。目前已有822人参与学习,适合希望边学边练、借助真实数据快速上手ArcGIS 10.0空间分析流程的读者。通过完整实验可掌握从数据准备到空间分析出图的整套操作路径,为后续项目应用奠定基础。

1. 一张教学光盘,为什么值得花一周时间往里钻

拿到《ArcGIS地理信息系统空间分析实验教程(第2版)》这套教材,配套光盘 part-1 被很多人当成了普通的“数据包”:复制、解压、双击打开,然后照着书做实验。A同学就是这么干的——底图倒是出来了,可用缓冲区工具就报错,属性表里原本该有的字段全是空值,跟着步骤做出来的结果和示例图差到离谱。问题不在操作,而在于光盘里的数据并不是独立文件,它带着路径约定、坐标系定义和版本依赖。这张光盘要解决两件事:提供一套能跑通完整空间分析的实验数据,和一条照着走不跑偏的操作路径。适合刚接触 ArcGIS 的学生,也适合想规范实验流程的从业者。盘里有宝,但得按它的规则来。

2. 先从光盘目录读起:实验数据、讲义与工具箱的组织逻辑

2.1 根目录结构与 part-1 的边界

教材第2版的配套光盘按常见做法会拆成多个分卷,part-1 代表一号盘或第一部分。拿到盘先别急着复制,打开光盘根目录看两样东西:一是有没有 setup 或使用说明文档,二是有没有以章节或实验编号命名的数据目录。这两个信息决定了你是要“先合并分卷再复制”还是“直接按章节复制”。如果根目录出现 EX1、EX2 这种结构,说明数据已经按实验组织;如果出现 DISK1、DISK2 两个目录,说明 part-1 和 part-2 很可能是分卷,需要看说明里的解压顺序。顺序翻车的表现是某些图层只有文件名没有几何,遇到这种情况要把整个解压目录删掉重新来,别手动补文件。

我习惯先把目录树导出来,再决定怎么处理。Linux 下这么看,Windows 可以把文件管理器里的目录列表另存为文本:

# 递归导出目录结构,存成清单再检索 ls -R /media/cdrom > catalog.txt less catalog.txt

命令逻辑是:ls 带 -R 递归列出所有子目录和文件,重定向到 catalog.txt,方便在编辑器里搜索 Ex、Data、Toolbox 这些关键词,不用靠眼睛一层层点。参数说明:光盘路径如果带空格,shell 里要加引号;Windows 上等价命令是 tree /F /A,导出后同样用文本检索。part-1 与后续分卷的边界通常写在使用说明里,有些按数据量分卷,有些按功能模块分卷,先读说明再动手能避开一半的坑。

2.2 实验编号背后的数据依赖关系

配套数据按“实验编号”组织,每个实验目录一般放四类东西:底图数据、分析对象、参考结果、实验说明。例如缓冲区实验需要点或线要素作为源,再加一个面要素当背景;叠加实验至少要两个面图层。它们之间通过工具界面里的“选择图层”建立关系,而不是靠文件名,但目录结构决定了打开文档时相对路径能不能对上。我建议按实验编号做一张映射表,把“实验名、参与数据、工具、关键输出”列出来,这是可抄作业的做法。

实验方向常见参与数据常用工具关键输出
缓冲区分析点/线源要素、背景面缓冲区缓冲面要素
叠加分析两个面或线要素相交、裁剪、擦除叠加结果面
表面分析DEM 栅格坡度、坡向、重分类分级栅格
网络分析道路线要素网络数据集路径或服务区

建表的时候你会发现,绝大多数实验的数据依赖只有两三层,真正让人翻车的不是工具,而是“以为数据全了,其实缺了一个 .prj 文件”。另外,实验过程中不要随手新建图层存到默认临时目录,空间分析的中间输出应该统一写到实验目录,否则工具跑完结果不知道落在哪里,找回输出像拆盲盒。我一般会在实验前把 ArcToolbox 环境里的“工作空间”指到当前实验目录,这样每一步输出都能在同一个地方找到。

2.3 从只读光盘到可写目录:复制数据的正确姿势

光盘是只读介质,而空间分析工具几乎都要写中间文件:相交要生成临时要素、栅格计算器要写缓存、编辑会话要产生锁定文件。直接在光盘里跑,轻则提示“无法写入”,重则卡死在创建输出要素那一步。所以第一步就是把数据完整复制到本机磁盘,并且路径里不要出现中文和空格。常见做法是建一个纯英文的实验目录,按实验编号建子目录:

# 关键:复制到本地,别从光盘直接打开 mkdir -p D:/gis_experiment/ex1 cp /media/cdrom/part1/Ex1/* D:/gis_experiment/ex1/ cp /media/cdrom/part1/Ex2/* D:/gis_experiment/ex2/ ls -lh D:/gis_experiment/ex1/

复制完不要立刻双击文档,先检查每个 shapefile 是否带齐附属文件。一个完整的 shapefile 至少有 .shp(几何)、.shx(索引)、.dbf(属性表),有 .prj 才有坐标系定义。如果拷出来只有 .shp 和 .dbf,缺了 .prj,后面所有涉及投影距离或面积的分析都会出错。参数说明:cp 命令逐个文件复制,目录整体复制要用 cp -r;如果目标目录有同名文件,用 cp -i 让系统先询问,避免覆盖原始数据。

注意:复制数据后仍从光盘直接打开文档,ArcGIS 会因只读介质无法写入临时文件,可能直接假死。所有实验请先复制到本机再启动。

把数据搬完,最后一步是确认没有只读属性。从光盘复制出来的文件常常保留只读标记,shapefile 的 .dbf 只读时,编辑属性表或写 join 结果都会失败。Linux/macOS 下执行 chmod -R +w,Windows 下选中整个实验目录,右键属性里取消“只读”。这一步做完,环境才算真正准备好。

3. 实验环境三件事:坐标系、数据格式与工具箱加载

3.1 先定坐标系再动手:地理坐标与投影坐标的分工

空间分析实验里一半的“结果对不上”,根子都在坐标系。地理坐标系用经纬度描述球面上的位置,单位是角度;投影坐标系把球面展开成平面,单位是米。缓冲区距离、面积统计、坡度坡向、道路长度分析都依赖投影坐标系,因为“在经纬度下做 100 米缓冲区”在几何上没有意义。很多教材实验直接给结果图,不讲坐标系,但你自己做的时候必须先确认数据落在哪个坐标系。

操作顺序我固定是这样:加载数据后,先打开图层的属性表,看“源”页签里的坐标系和范围。如果只有地理坐标系,在工具箱里搜 Project 工具,把数据转到适合本区域分析的投影坐标系再做后续操作。这里说的“适合本区域”通常指能保长度的等距投影或适合面积计算的投影,而不是随手选 Web 墨卡托。判断数据有没有坐标系定义可以从范围数值猜:一个坐标值在 100 万量级而单位是米,多半已经定义了投影;如果数值是 116 度、39 度这种形态,说明是地理坐标系,面积分析前必须转投影。写个十行脚本能快速把一批数据的坐标系摸清楚:

import arcpy fc = r"D:/gis_experiment/ex1/roads.shp" desc = arcpy.Describe(fc) # 只读元数据,不改动原数据 print(desc.spatialReference.name) print(desc.spatialReference.linearUnitName) print(desc.extent)

这里的 Describe 不会修改数据,只读取元信息。spatialReference.name 输出坐标系名称,linearUnitName 输出线性单位,extent 输出要素范围。参数说明:如果三项分别输出 Unknown、Degrees 和类似“116.xx 39.xx”的范围,说明数据缺投影定义,要用“定义投影”工具把正确的坐标系写回数据,而不是在 ArcMap 里手动猜。

3.2 矢量、栅格与表:三类数据容器的特性

配套光盘里大部分是 shapefile 和 TIFF 栅格,偶尔带个人地理数据库。三类数据在实验里分工不同:矢量存离散对象,点表示学校、井位,线表示道路、河流,面表示地块、区域;栅格存连续表面,DEM 高程、坡度、距离栅格、重分类结果都是栅格;表格存属性,统计表、关联表、坐标表是实验的辅助材料。空间分析实验里最容易出错的是把表格 join 到矢量时,关联字段类型对不上。比如要素类里的地块编号是文本,表格里却是数字,join 后要么全空,要么只有几行有值。拿到每张表先看字段类型:文本型、长整型、双精度,再决定要不要用字段计算器构造一个统一的编码字段。

选型上我习惯把实验输出写到文件地理数据库(gdb),而不是往磁盘里散落 shapefile。原因很实际:shapefile 的字段名会截断到 10 个字符,空间分析工具生成的字段名偏长时,写着写着字段就变成 FID_1、FID_2 这种让人看不懂的编号,和教材里的字段名对不上,排查起来非常痛苦。gdb 支持长字段名,结果放在一个容器里也方便复制和转移。个人地理数据库(mdb)在老光盘里常见,但在较新版本里经常只能读不能写,需要把源数据复制到 gdb 再跑分析,直接往 mdb 写结果容易碰上“数据源只读”的报错。

3.3 工具箱加载与搜索习惯:环境设置比背菜单更实用

空间分析那组工具需要在菜单栏“自定义→扩展模块”里勾选“空间分析”,否则工具按钮灰色,点了没反应。不同版本菜单位置不一样,所以我不建议背菜单路径,更推荐用 ArcToolbox 顶部的搜索窗:输入“缓冲区”“坡度”“擦除”这些关键词,工具会自动带出路径和参数说明。搜索窗的作用不只是找工具,还能直接打开工具帮助页,很多参数比如侧类型、融合方法,里面解释得比教材还细。

动手做实验前,我一般会把环境设置写进 ArcPy 或直接在工具箱里配置:

import arcpy # 工作空间:所有中间结果默认写到当前实验目录 arcpy.env.workspace = r"D:/gis_experiment/ex1" # 覆盖输出:重复跑实验时不会因结果已存在而中断 arcpy.env.overwriteOutput = True # 输出坐标系:和主要输入数据保持一致,避免结果坐标系漂移 arcpy.env.outputCoordinateSystem = arcpy.describe("roads.shp").spatialReference

这段脚本的逻辑是先把默认输出目录切到实验目录,防止中间文件落到系统临时目录找不到;再打开覆盖输出,这样同一个工具反复调参跑多次,不会因为“要素集已存在”卡住;最后把输出坐标系锁定成和 roads.shp 一致,这样无论输入里混了什么别的投影,最后结果的地理基准是统一的。参数说明:outputCoordinateSystem 不设置时,大部分工具会沿用第一个输入数据的坐标系,一旦输入数据间坐标系不一致,输出结果就会随机取一个,这是结果和教材差出几公里的隐藏原因。

4. 从教材实验到能迁移的方法:四个空间分析套路与参数细节

4.1 缓冲区分析:距离参数与融合选项背后的地理含义

缓冲区是看着容易、做出来容易错的第一类实验。工具界面上几个参数不是摆设:距离、侧类型、末端类型、融合类型。距离决定缓冲半径,教材会给一个固定值,但换数据时你得先确认数据的单位。如果数据集还是地理坐标系,缓冲区工具里距离填 100,实际可能是 100 度而不是 100 米,结果完全不能用,这就是第3章先定坐标系的意义。

融合选项是另一个重灾区。不融合,每个源要素生成独立缓冲面,相邻缓冲各自重叠;融合后,重叠区合并成一个要素。实验里要求做“禁建区”时一般选全部融合,输出只有一条记录,表示整个区域范围;按类别做禁建区就选“按字段融合”,字段选类别编码。对应 ArcPy 参数顺序是这样的:

import arcpy arcpy.env.workspace = r"D:/gis_experiment/ex1" arcpy.env.overwriteOutput = True # 缓冲距离100米;FULL表示双侧;ROUND表示圆头端;ALL表示全部融合 arcpy.Buffer_analysis("source_points", "result_buffer", "100 Meters", "FULL", "ROUND", "ALL")

Buffer_analysis 的参数顺序是输入要素、输出要素、缓冲距离、侧类型、末端类型、融合方法。FULL 表示双侧建立缓冲区,适合道路两侧等距扩展;只缓冲道路左侧或右侧要选 LEFT 或 RIGHT。末端类型 ROUND 是圆头,点源实验基本都用它;FLAT 是平头,常用来模拟沿道路的噪声线源。融合方法 ALL 把所有输出的缓冲合并成一个要素,属性表只剩一条记录,适合做总禁建范围。跑完验证两步:右键结果图层打开属性表看记录数,再对照教材示例图看形态,面积单位不对就回到坐标系检查。

4.2 叠加分析:相交、裁剪、擦除的选择逻辑

叠加分析有三个名字相近但逻辑完全不同的工具,选错是家常便饭。判断口诀:需要双方属性,用相交;只求输入被边界切一块,用裁剪;只想把某块区域从输入里挖掉,用擦除。举例来说,“计算道路与缓冲区的重叠面积”用相交,结果里同时保留道路和缓冲区的属性,能算出每段路在哪条缓冲带里;“把某区域内的道路提取出来”用裁剪,输出的还是道路要素,只是范围被切了;“找出不适合建房的区域”用擦除,把生态红线从地块里挖掉,剩下的是可建区域。

输出几何保留哪些属性典型场景
相交双方属性都保留找出既属于 A 又属于 B 的区域
裁剪只保留输入属性从大范围数据切出研究区
擦除只保留输入属性排除禁建区、保护地

叠加分析有两个高频坑。第一个是输入图层坐标系不一致,相交后产生大量细碎多边形,图面看起来像麻点,统计面积也失真,解决办法是回到第3章统一投影。第二个是输出格式问题:相交结果字段多,输出到 shapefile 时字段名被截断,看起来像乱码,解决方法是把输出目标指到 gdb。另外,参与叠加的要素不能有自相交或空洞,否则会在结果里生成异常小面片。跑工具之前先执行“检查几何”,能筛掉一批潜在问题,这步在复杂区域数据上几乎必做。

4.3 表面分析:DEM 重分类与坡度坡向的阈值设置

表面分析起点是 DEM 栅格。坡度工具输出每个像元的坡度角,单位是度;坡向输出 0-359.9 的方位角。很多教程直接让用“重分类”把坡度分成 5 级,但 0-90 度按等间隔分级通常不适合真实地形:平缓区全被压进第一级,图面一片深色,统计上也没有区分度。我一般先看坡度直方图或累计频率,再手动设断点,比如 0-3 度平地、3-8 度缓坡、8-15 度中等坡、15-25 度陡坡、25 度以上极陡,这样分级才符合地貌实验的常见认知。

重分类工具里把旧值区间映射成新等级,断点自己填,面板会把连续值分段。参数细节:输出像元大小不要随意改,保持与原始 DEM 一致;重分类边界处理建议用默认值。坡向分析更隐蔽的坑是类别映射:坡向输出是连续角度,要按正北为 0、顺时针计数,把角度归成 9 类(北、东北、东、东南、南、西南、西、西北、平地),需要在重分类的表格里逐段填上下限,不能直接拿连续角度制图。做完再统计各类占比,和教材数字对不上时先查重分类断点,再查 DEM 范围是否被裁过。

4.4 网络分析:道路数据与阻抗字段的坑

网络分析和前面几种不同,不能直接拿道路线要素跑路径分析,必须先构建网络数据集。构建过程会读入道路线的连通性,因此矢量里一堆“看起来相交但没打断”的道路,是路径结果绕路的主要来源。构建网络之前,先用“检查几何”工具看自相交和悬垂线,再用“打断相交线”把交叉口真正打断,这样路径分析才会按道路实际连通关系计算。这个步骤在教材里常常一笔带过,实际做的时候却决定结果是否可信。

阻抗字段选择是网络分析里最像玄学的地方。选长度,只用 shape_length 字段就行;选时间,得先给道路表加一个通行时间字段,再按道路等级填速度值。阻抗单位不一致会让最短路径“看起来绕了但算起来更快”,因为系统在优化时间而不是距离。操作流程:工具箱里搜“构建网络数据集”,向导里依次设置连通性、高程模型、阻抗属性和转弯模型。如果实验数据里已经带了现成的网络数据集,直接加载它就行,不要重建,重建会把原来的方向字段覆盖掉,字段一丢,教材里的结果就再也对不上了。

5. 光盘配套数据用起来的常见问题:路径、投影与字段类型排查

5.1 中文路径导致数据加载失败

现象:从光盘复制到本机后,加载 shapefile 提示“无法添加数据”,图层列表里只有名字没有图形;执行工具时弹出“数据集不存在”或“无法打开工作空间”。 原因:ArcGIS 的某些版本对非 ASCII 路径支持不完整,中间文件写不进带中文的目录;光盘目录名里如果带了空格或括号,也会让工具定位失败。 解决:把整个实验目录复制到纯英文路径,目录名只用字母、数字、下划线。复制完先确认路径栏里没有中文和空格,再打开软件。如果数据已经从光盘解压到中文目录,直接整体移动,别单独挪文件,否则相对路径信息又丢了。

5.2 数据看不到却存在:图层刷新与坐标系误判

现象:图层树里有名字,内容窗口却一片空白,缩放全图也找不到要素,属性表能打开但记录数正常。 原因:坐标系信息缺失或定义错,数据被放到远离本区域的坐标范围。比如数据实际是投影坐标系,但 .prj 丢了,软件默认按地理坐标系显示,要素就会缩到坐标轴附近看不见。 解决:右键图层→属性→源,看“范围”里的坐标值。如果数值明显不在本区域范围,用工具箱里的“定义投影”把正确的坐标系写回数据,再点缩放全图刷新视图。注意“定义投影”是在“不知道坐标系或定义错误”时用,数据本身带着正确投影时不要重复定义,否则会把坐标值重新解释一遍,造成更严重的错位。

5.3 字段值读出来是空的:个人地理数据库与文件地理数据库的差异

现象:图层属性表打开,某个字段全是<Null>;做 join 之后,目标表新增字段也全部为空。 原因:多数是关联字段类型不匹配:要素类里是文本型,表格里是数值型;另一个常见原因是数据放在个人地理数据库(mdb)里,较新版本对 mdb 只读,工具没法在源表上写临时关联字段。 解决:先打开两个表的属性,看关联字段类型是否一致。不一致时用“字段计算器”把其中一方转成相同类型,或者新建一个统一编码字段。要跑空间分析的话,先把 mdb 里的要素类用“复制要素”转到文件地理数据库,再执行后续工具,直接往 mdb 里写结果大概率失败。

5.4 实验结果与教材对不上:相对路径引用与样本集范围

现象:每一步都按书做了,输出的统计值比教材少了一大截或多出一倍,图形形状也对不上。 原因:教材示例结果常用完整数据集,配套光盘里的实验数据可能经过抽稀或按章节裁剪,范围和对象数量本来就不一样;另外,文档里的图层源可能还指向光盘路径,软件打开时找不到数据,展示的只是残缺结果。 解决:先看实验说明是否注明“使用本章数据”,如果没有,回到光盘目录找名为完整数据或原始数据的位置。在 ArcMap 里检查每个图层的“数据源”属性,若还指向光盘或旧路径,用“设置数据源”重新指向本地实验目录。每次开始实验前,把图层源刷新一遍,不要急着做分析,这习惯能省出大量后期排查时间。

5.5 工具按钮灰色与扩展模块未启用

现象:菜单上“空间分析”一组工具全部置灰,点下去没有反应;ArcPy 调用坡度或缓冲区时提示工具不存在。 原因:空间分析扩展模块没有勾选,或者当前的软件许可类型未包含该模块接口。 解决:在菜单栏“自定义→扩展模块”里勾选“空间分析”,重启软件后再试。如果环境中安装了多个许可等级,把许可切换到 Advanced 或同等完整级别,再执行一次脚本。检查是否生效的方法很简单:工具箱搜索窗输入“坡度”,能打开参数面板就是模块已启用。

6. 把配套数据变成自己的训练场:三个进阶用法

6.1 用 Python 批量验证光盘数据的可用性

把实验目录当成训练集,写一个脚本一次检查所有要素类的坐标系、范围、要素个数,比在界面里逐层点开可靠得多。常见做法是循环每个实验文件夹,读取元数据:

import arcpy, os root = r"D:/gis_experiment" for folder in ["ex1", "ex2", "ex3"]: arcpy.env.workspace = os.path.join(root, folder) for fc in arcpy.ListFeatureClasses(): desc = arcpy.Describe(fc) # 输出文件名、坐标系名称、范围,方便对照排查 print(fc, "|", desc.spatialReference.name, "|", desc.extent)

这里 ListFeatureClasses 只列矢量要素类,检查栅格要改用 ListRasters;spatialReference.name 为空时就表示缺 .prj。参数说明:os.path.join 负责拼路径,避免手写斜杠的格式问题;每个文件夹单独设置 workspace,脚本就能在循环里切换目录。跑完看一眼输出,凡 Unknown 坐标系的文件提前处理,后面所有实验都能少踩一轮坑。

6.2 从复现实验到改造实验:参数灵敏度与验证习惯

教材参数是“标准答案”,但不是唯一答案。复现一遍之后,我会刻意改两三个参数观察结果变化:缓冲区距离、重分类级数、叠加对象顺序。改之前记录原参数,改之后对比图面分布和统计值变化幅度,这样既能验证自己是不是真懂,也能积累调参手感。

实验尝试参数观察指标
缓冲区100 / 200 / 500 米面积与覆盖变化
表面分析3 级 / 5 级 / 8 级重分类各级面积占比
叠加分析分别用相交、裁剪、擦除输出要素数量差异

6.3 给每个实验记一份可复现的参数笔记

我自己的习惯是每个实验做完,在实验目录里放一个说明.txt,写清数据路径、坐标系、关键参数、输出文件名。这既是半年后的后悔药,也是换电脑时的救命稻草——空间分析的结果图看不出参数,时间一长,连自己当初为什么选那个融合类型都想不起来。翻车最多的地方就是坐标系和字段名,所以现在每做一个实验先跑一遍 6.1 的脚本再开始点界面。这条路走通以后,遇到新分析任务的第一反应不再是打开工具箱找按钮,而是先想清楚数据属于哪一类、要在什么坐标系下计算、输出用什么容器保存。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进