简介:《ArcGIS空间分析实例与练习数据3-8章》是一套面向GIS专业人员与学习者的实战型资料,聚焦缓冲区、叠置、网络、地形与栅格等核心空间分析技术,涵盖从初级到高级的典型应用场景,有助于系统提升ArcGIS操作与分析能力。压缩包共657个文件,大小仅26.4MB,主要包含Shapefile矢量数据(shp/dbf/shx)、地图文档(mxd)、地理数据库(mdb)、栅格影像(img)及文本与文档说明,结构清晰,便于按章节加载练习。目前已有393人学习下载。资料内附多组练习数据与实例工程,用户可跟随步骤完成从数据准备、处理分析到结果制图的全流程操作,并借助说明文档理解每类分析的参数意义与应用逻辑,为城市规划、环境评估、灾害响应等工作提供可迁移的方法参考。
1. ArcGIS空间分析实践套路:一份能直接跟练的第3到第8章数据包
干这行的人都知道,ArcGIS空间分析理论看一遍,手上一动就露怯。坐标系选错、缓冲区分区没预检、栅格计算器表达式写崩,哪个坑都能卡掉半天时间。这套实例与练习数据第3到第8章,最大的价值就是把从缓冲区、叠加到成本路径的流程,按章节给你配好了现成数据。你不用去网上翻散落的shp和tif,打开就能复现书里的每一步输出。如果你正被空间分析课程的作业卡住,或者要在模拟项目X里快速出一版分析图,这份资源值得花时间拆一遍。先用第3章的数据预检开始。
2. 数据预检与工程目录搭建:动手前锁死两个变量
2.1 数据目录结构:先把shp和tif按章节归档
拿到这份资源,我建议先别急着双击打开mxd,先做一个强制动作:把3到8章的数据目录完整过一遍。看这套包里的目录结构,第3到8章通常是按功能模块划分的。我一般会用文件管理器把每一章的矢量数据(点、线、面shp)和栅格数据(dem、土地利用tif)分开放,再建立一份索引表。这样做的好处是后面做批量处理时不会反复找路径。
地理数据库优先于文件夹shp。项目数据量一大,散装shp暴露三个问题:字段名容易撞名、拓扑错误难以批量检查、处理速度明显变慢。我的习惯是用ArcCatalog先建一个File Geodatabase,把原始数据导入里面,再开始分析。练习数据包里的原始shp不动,只读引用,所有中间结果都进gdb。
import arcpy arcpy.env.workspace = r"D:\arcgis_exercise\练习数据_3_8章.gdb" arcpy.env.overwriteOutput = True print(arcpy.ListFeatureClasses())这段代码做了三件事:指定工作空间、允许覆盖中间结果、列出当前gdb里所有的要素类。逻辑上是在进入正式分析前先确认数据读得进来。overwriteOutput这个参数非常重要,ArcGIS默认不允许覆盖输出,如果反复调试同一段流程,不设成True会直接报错010152。列表打印出来是空的话,说明导入路径有问题,再回到目录结构排查。
2.2 统一坐标系:把地理坐标和投影坐标分开处理
空间分析的第一个坑往往不是分析本身,而是坐标系不一致。练习数据包里的数据来源不同,有的shp是WGS84地理坐标,有的栅格已经是投影坐标。如果直接做距离计算、缓冲区,结果会离谱。比如同一图层里的两个点,地理坐标下计算距离得到的是度,投影坐标下才是米。
我处理这类问题的固定顺序:先读取源数据坐标系,再看分析目标,最后统一投影。常见的做法是全部转到适合当地范围的投影坐标系。练手时选用UTM带号区域较合适,如果练习数据涉及多个省,就选Albers等积投影。
import arcpy in_fc = r"D:\arcgis_exercise\原始数据\roads.shp" out_crs = arcpy.SpatialReference(32650) # WGS 1984 UTM Zone 50N arcpy.Project_management(in_fc, r"D:\arcgis_exercise\投影后\roads_utm.shp", out_crs)这个投影转换把原始道路数据从原坐标系转成UTM 50N。参数说明:SpatialReference(32650)里32650是WKID,值决定了投影方式和基准面;输出路径不能和输入路径相同;转换后要再运行一次Describe核对坐标系。实际项目里如果图层多,我更推荐用批量投影工具而不是一条条写脚本。
2.3 属性表预检:空值、冗余和类型错位
拿到数据包的第3章练习数据时,你会看到属性表里有一些字段是空的,还有一些字段名里带空格。这类问题在练习数据里出现频率很高,正式分析前必须清干净。比如做缓冲区分析后要做属性连接,连接字段一端是文本型,另一端是数值型,结果就是连接失败。
我的习惯是分三步走:第一步用表属性扫描每个字段的填充率;第二步检查字段别名是否带特殊符号;第三步对栅格数据检查NoData值分布。后一点容易漏,NoData在栅格计算器里往往会被当成0,最后结果出来一团黑。
import arcpy table = r"D:\arcgis_exercise\练习数据_3_8章.gdb\landuse" fields = arcpy.ListFields(table) for f in fields: if f.type in ["String", "SmallInteger", "Integer"]: cursor = arcpy.SearchCursor(table) null_count = 0 for row in cursor: if row.getValue(f.name) in [None, "", " "]: null_count += 1 print(f"{f.name}: 空值 {null_count} 条")这段脚本对每个字段做空值扫描。原理上就是用搜索游标逐行取值。参数上要说明一点:SearchCursor在高版本ArcPro里推荐改用arcpy.da.SearchCursor,性能好一个量级,导出时兼容性也更强。扫描结果里如果某个字段空值超过20%,这个字段在后续操作里最好别作为连接或查询条件;否则连接结果会出大面积空行,排查起来极度费劲。这条经验是某次处理模拟项目X的采集数据时积累的,当时属性连接后丢失了一半记录。
3. 空间分析工具链的串联:从缓冲区到叠加再到栅格计算
3.1 缓冲区分析:先想清楚距离是固定值还是属性值
第3章的重头戏通常是缓冲区分析。很多新手在这一步容易犯的毛病是把缓冲半径写死一个数,完全不管地理意义。缓冲区二维扩张原理不复杂,关键是半径的取值依据。固定距离适合基础设施影响范围,比如道路两侧各100米;属性字段距离适合分级扩散或者按等级生成不同缓冲区的场景。
练习数据里有道路等级字段(比如“高速/省道/县道”),我一般会教学生用属性字段作为缓冲距离来源。具体在工具界面上选“字段”而不是“线性单位”。这样做出来的缓冲区是分级的,叠加到一起看信息量完全不同。
import arcpy arcpy.env.workspace = r"D:\arcgis_exercise\练习数据_3_8章.gdb" in_features = "roads" out_features = "roads_buffer_attr" arcpy.Buffer_analysis(in_features, out_features, "Distance", "FULL", "ROUND", "NONE")这里注意,"Distance"字符串代表距离字段占位,如果直接用Buffer_analysis的Python接口,字段名要写在第七个参数位。实际操作中我更多是在ArcToolbox界面里操作,但脚本方式方便批量跑多图层。缓冲区相接处如果不需要保留重叠区域,用"NONE"参数做融合;要保留每块独立区域,则用"ALL"。后续叠加分析如果是以独立区域为统计单元,建议保留所有独立区,否则面积统计会出错。
缓冲区做完后,往往紧跟着要用擦除或相交来提取非重叠区。这个组合操作在选址类分析里最常见。练习数据第4章一般就进入这个环节。
3.2 叠加分析:相交、擦除、联合的取舍
叠加分析是整个资源包里最核心的部分。三种工具的适用场景有明确边界:相交要的是多图层重叠的部分,比如找生态敏感区和建设用地的重合区;擦除是删掉一个图层的部分区域,比如把水域从地块中剔除;联合则是合并全部要素并保留所有属性,用于综合叠加分等定级。
这三种工具的输入输出差异很大。相交输出的是多边形要素,属性表里包含所有输入图层的字段;联合则是面要素类,会产生大面积属性冗余,因为一对多关系会拆成多行。在练习中我明确建议:除非是要做多因子评价,否则不要用联合,因为它会极大增加属性表体积,而且后续透视统计麻烦。
import arcpy arcpy.env.workspace = r"D:\arcgis_exercise\练习数据_3_8章.gdb" arcpy.Intersect_analysis(["landuse", "floodzone"], "intersect_result", "ALL", "", "INPUT")这一段做两个图层的相交。"ALL"是输出所有输入要素,"INPUT"表示保留输入要素的字段列表。如果不加"INPUT",默认输出只会保留FID和shape,属性信息会丢掉。新手在这步最容易踩的就是丢字段。跑完相交后,我建议立即用Table To Excel导出一份属性表,看看每个要素的来源字段是否齐全。字段编号对不上的情况,多半是因为投影或几何容差设置问题。
3.3 栅格计算器与重分类:把连续值变成决策等级
叠加分析做出来的是矢量结果,但空间分析项目往往要用栅格做最终评价。练习第5章会用到栅格计算器和重分类。核心价值是把坡度、高程、距离等连续栅格统一到一个评价体系里。
重分类的核心是断点设定。比如坡度按0到5度、5到15度、15到25度、25度以上分四级。断点怎么定?我用的是自然间断点法,或按目标地理意义定阈值。练习数据里给出的坡度栅格是浮点型,直接做分级前要先确认统计值域,否则分级会漏掉极值区。
"slope_reclass" = Reclassify("slope_dem", "Value", RemapRange([[0,5,1],[5,15,2],[15,25,3],[25,90,4]]))表达式含义是把slope_dem按数值区间映射到1到4。RemapRange参数表是左闭右开区间。输出栅格的值域是1到4,代表四个适宜性等级。要注意浮点栅格在重分类时,边界值会因浮点精度产生微小误差,比如0.9999会掉到上一级。解决办法是在重分类前先执行一次Int取整,或直接在重分类时人工调整断点。减少这种边界误差的一套操作是:先Zonal Histogram看每个区间的像元占比,再回头调整断点。这个习惯能让你在汇报时解释清楚每个等级的面积来源。
4. 完整实战链路:基于第6章数据做一个成本路径
4.1 目标设定:找一条兼顾坡度和地类的合理路线
第6章练习数据一般会给出一块研究区的DEM、土地利用和已有道路。实操目标设为“模拟一条从起点到终点的低成本路径”。成本的定义取决于场景:可以是坡度越大成本越高,也可以是水域和林地不可通行。在这份练习包里,土地利用栅格已经做了地类编码,适合给它重新赋成本值。
成本路径的原理不复杂:先通过坡度生成成本栅格,再算累积成本距离,最后用最短路径函数提取最小成本线。这里关键有两次数据转换:一是从矢量源点转栅格;二是把地类成本赋给连续栅格。任何一步坐标系不一致,最终路径都会歪。
import arcpy arcpy.env.workspace = r"D:\arcgis_exercise\练习数据_3_8章.gdb" # 坡度 out_slope = arcpy.sa.Slope("dem") out_slope.save("slope_cost") # 重分类坡度:成本1到10 slope_cost = arcpy.sa.Reclassify("slope_cost", "Value", RemapRange([[0,5,1],[5,10,3],[10,20,5],[20,35,8],[35,90,10]])) slope_cost.save("slope_cost_re")这段代码先把DEM转坡度,再按坡度大小赋成本值。成本值越大表示越难通过。参数上注意Slope默认输出的是度,不是百分比。如果要的是百分比坡度,要加参数"PERCENT_RISE"。成本栅格的值域直接决定路径趋向,成本赋值过低会让路径顺着陡坡走,与实际工程经验不符。
4.2 累积成本距离与成本路径提取
有了成本栅格,下一步是计算累积成本距离。这个工具会产出两个栅格:累积成本栅格和回溯链栅格。回溯链是提取路径的关键输入。不少人在这一步只保存了累积成本栅格,回溯链被覆盖或没保存,后面路径提取直接报错。
import arcpy arcpy.env.workspace = r"D:\arcgis_exercise\练习数据_3_8章.gdb" source = arcpy.sa.Raster("start_point") cost = arcpy.sa.Raster("slope_cost_re") out_dist = arcpy.sa.DistanceAccumulation(source, cost) out_dist.save("cost_dist") out_back = arcpy.sa.DistanceBackLink(source, cost) out_back.save("cost_backlink")DistanceAccumulation在ArcGIS Pro里替代了旧版的CostDistance,计算速度快一截,参数也清晰。source必须是栅格,矢量点要先转栅格。DistanceBackLink输出的是方向编码栅格,每条路径对应一个方向值,取值范围是0到360度。后一步CostPath依赖这两个输出,缺一个都不行。
生成路径后,我看到不少人的顺序反了:先做了路径再裁切成本栅格。正确顺序是先裁切成本栅格到研究区范围,再算距离,能显著减少边缘误差。
4.3 路径结果验证:用剖面图确认合理性
路径结果出来之后不能只看线型平不平滑。我的验证动作:对路径做3D剖面,查看沿路径的坡度变化。如果剖面图上出现连续陡坡段落,说明成本设置有问题,重点查地类赋值和重分类断点。
arcpy.InterpolateShape_3d("dem", "path_line", "path_profile")这个工具把DEM高程值提取到路径线的每个折点上。输出后用属性表查看坡度变化。成本路径分析的最终输出要准备三张图:成本面、累积距离面、路径叠加影像。练习数据包刚好提供了对应的底图数据,出图效果比干巴巴线条好不少。我从这套流程里总结的经验是:永远把成本面的图例显示为从低到高渐变色,否则决策者无法一眼判断路径为什么这样绕。
5. 常见坑与排查:练习数据里暗藏的四个翻车点
5.1 栅格像元大小不一致导致叠加错位
现象:叠加两个栅格时,范围明明一样,结果却是满幅空值,属性表里NoData占九成。
原因:两个栅格虽然没有发生坐标系投影错误,但是像元大小不同,一个有10米,一个有30米。叠加分析时默认重采样规则不一致,导致大面积无值。
解决:把参与叠加的栅格先统一用Resample设成相同像元大小,开启Snap Raster环境设置。这个环境变量在ArcToolbox的“环境”选项卡里,设成基准栅格。之后所有输出都会对齐到同一网格,空值问题就消失了。
import arcpy arcpy.env.snapRaster = r"D:\arcgis_exercise\练习数据_3_8章.gdb\dem" arcpy.env.cellSize = 30这段代码在Python里设置了环境变量。snapRaster强制所有栅格输出对齐到dem的网格位置,cellSize设置输出像元尺寸。如果练习数据里存在投影栅格和地理坐标栅格混用的情况,先做投影再设环境,顺序不能反。这个环境设置对后续所有栅格计算都生效,尤其是在第5章重分类操作时,可避免错位产生的黑线。
5.2 缓冲区分区结果被后续叠加吞掉
现象:做缓冲区与地块相交时,输出面积远小于直接相交的面积,部分地块消失。
原因:缓冲区分区使用了FULL融合模式,相同重叠区被合并为一个大图形,某些穿过融合区的小地块被完全吞掉。
解决:缓冲区参数选择NONE来保留每个独立要素的缓冲结果,或者叠加前先执行Explode Multipart。处理时要注意属性表里的记录条数,如果输出数量明显少于输入,大概率是融合模式造成的。
5.3 Reclassify报错“Unable to use input raster”
现象:重分类工具报输入栅格不可用,点击 Details 显示无法读取。
原因:输入栅格路径里包含中文字符或空格,ArcGIS的栅格格式驱动对中文路径支持不太稳定。练习数据若解压到练习数据_最终版这类文件夹,极易触发这个报错。
解决:把数据放到纯英文路径下,比如D:\gis_data\ch3。同时确认栅格格式是img或tif,格式太老旧(比如栅格目录)也会导致重分类失败。处理这类路径问题没有玄学,就是老老实实建一个纯ASCII路径的目录,把练习数据全部复制进去,再做分析。
5.4 整型栅格重分类后面积统计出现巨大偏差
现象:做好重分类后统计各等级面积,总和比研究区面积大了或小了20%。
原因:重分类时设置了NoData保留,而NoData区域在面积统计时被当成0级参与计算;或者重分类区间重叠导致一个像元被分到多个等级。
解决:重分类前先把研究区外的区域通过Extract by Mask裁切掉,再用SetNull把NoData统一清掉,最后重分类。面积统计用Zonal Geometry as Table,不要用属性表里肉眼估算。用栅格面积作为最终汇报值时,必须追查NoData占比,这一步不可省略。
import arcpy from arcpy.sa import * mask = arcpy.sa.ExtractByMask("landuse_re", "study_area") mask.save("landuse_clip") final_re = arcpy.sa.Reclassify("landuse_clip", "Value", RemapRange(...)) final_re.save("landuse_final")这段代码实现掩膜提取后再重分类。ExtractByMask按研究区矢量范围切割栅格,切割后NoData只出现在研究区外部,内部是完整数据区。这样面积统计的偏差就控制在了可接受范围内。练习数据包里那几块栅格,如果不做这步,面积差异能大到30%以上,第一次跑通时着实让人摸不着头脑。
6. 进阶技巧:快速校验你的处理结果是否可靠
练到第8章时,你应该已经有了一整套自己的分析工作流。但输出结果能不能用,不能只看颜色好不好看。我养成了一个固定习惯:每次分析完成后,选取三个检查点做交叉验证。
第一个检查点是面积守恒。打开属性表,统计某一级重分类的面积占比,和该地类在原始土地利用栅格中的面积占比对比,误差超过5%就说明重分类或裁切环节有问题。这是最快发现数据损坏的手段。
第二个检查点是坐标零点验证。在ArcMap里放一个已知坐标的控制点,和输出栅格的内存值对比。如果控制点对不上,大概率是投影或者像元角点对齐出了问题。这个动作在练习数据包的第3章数据上尤其重要,因为原始坐标系设定混杂了多种投影。
第三个检查点是路径可靠性。成本路径的结果线不总是最短路径,看起来绕一大圈却成本最低。把成本面的渐变色显示调出来,把路径叠上去,人眼检查路径是否避开了深色高成本区域。这个检查手段不需要代码,但确实能节省大量汇报时的解释成本。
import arcpy in_path = r"D:\arcgis_exercise\练习数据_3_8章.gdb\final_path" arcpy.stats.ZonalGeometryAsTable(r"D:\arcgis_exercise\练习数据_3_8章.gdb\cost_level", "VALUE", in_path, "path_stats")这段代码计算路径穿过的成本等级的统计表。输出表里能看到路径经过每一级成本区的长度占比。正常情况下,高成本等级占比应低于10%。超过这个比例,路径选择就有问题。统计表也是汇报时的硬数据,比截图更有说服力。
复盘我自己在模拟项目X里的那次演练,按这套流程从预检到验证走完,整个分析只返工了一次,返工原因是底图数据的坐标系没对齐,而不是分析逻辑本身。之后每次拿到空间分析的数据包,我都强制走一遍环境设置—投影统一—栅格对齐—成本面验证的流程,每一步都留日志,再也不靠肉眼来判断对错。希望这套思路能帮你减少练习时重复返工的时间,更高效地把第3到8章的数据吃透。
本文还有配套的精品资源,点击获取