简介:这份资源是《ArcGIS10从入门到精通(牟乃夏版)》的配套实验数据压缩包,面向GIS初学者、地理信息相关专业学生及需要系统练习ArcGIS10操作的从业者,用于在动手实践中巩固教材理论、补齐软件操作短板。压缩包为rar格式,整体约203.43MB,上游未提供具体文件数量与类型明细,但内容围绕教材实验案例组织,涵盖数据导入与管理、地图制作、空间分析、地理编码、遥感图像处理、三维GIS、数据发布共享及GIS项目管理等模块,可支撑从基础操作到高级应用的完整练习链路。目前已有3349人学习下载,说明其在GIS入门群体中具备一定认可度。读者可借助这些实验数据对照教材章节逐步操作,理解缓冲区分析、叠置分析、网络分析等典型任务的实现过程,并熟悉Shapefile、GeoTIFF、CAD等多格式数据的组织与处理,从而把理论知识转化为可复用的实践技能,适合作为课程实验、自学练习与项目练手的配套素材。
1. 拿到《ArcGIS10从入门到精通牟乃夏版配套实验数据.rar》之后:先别急着双击解压
很多人下载完这个压缩包,第一反应是解压、找 shp、往 ArcMap 里拖。结果十有八九是:图层一片灰、坐标系对不上、属性表乱码、工具报 999999。这不是数据坏了,而是你跳过了「环境对齐」这一步。牟乃夏版教材的实验数据是围绕 ArcGIS 10.x 桌面端设计的,里面的矢量、栅格、表格、地图文档是配套章节组织的,它默认你用的是同一代软件、同一套中文环境、同一套默认地理数据库路径。你拿 ArcGIS Pro 去开、拿 10.8 去开、甚至拿英文版去开,都会出现「能打开但用不了」的玄学现象。这篇笔记就按一线干活的顺序,把这份实验数据从解压、目录识别、坐标系核对、典型实验复现,一路讲到常见报错排查和进阶技巧。适合刚装完 ArcGIS 10.x 的学生、要照着教材做实验的助教,以及想拿这套数据练手但不想被环境问题卡住的从业者。核心词 ArcGIS 会反复出现在参数和工具名里,因为离开具体工具谈数据没有意义。
2. 解压前先看清目录:实验数据到底按什么逻辑组织
2.1 压缩包里通常有哪几类文件
牟乃夏版教材的实验数据一般不是单一 shp 集合,而是按章节或实验编号分文件夹。常见结构是:一个总目录,下面按「实验一」「实验二」或「ch01」「ch02」分,每个子目录里混着 shp、tif、mdb、mxd、txt、xls。你要先建立一张「文件类型 → 用途」的对照表,否则后面找数据全靠猜。
| 文件类型 | 典型用途 | 打开方式 |
|---|---|---|
| .shp / .dbf / .shx | 矢量点线面 | ArcMap 直接拖入 |
| .tif / .img | 栅格影像、DEM | 拖入或 Add Data |
| .mxd | 地图文档,含符号和布局 | 双击用 ArcMap 打开 |
| .mdb | 个人地理数据库 | 通过 Catalog 连接 |
| .txt / .xls | 坐标点、属性表 | 转表或加 XY 数据 |
| .lyr | 图层符号模板 | 拖到内容列表 |
提示:shp 是「一组文件」,单独拷 .shp 会丢属性。复制时必须把同名 .dbf、.shx、.prj 一起带走。
2.2 用 Catalog 而不是资源管理器来认数据
Windows 资源管理器只能看到文件名,看不到坐标系、字段类型、要素数量。正确做法是打开 ArcMap,调出 Catalog 窗口,把解压后的根目录「连接到文件夹」。这样你能在右侧看到每个 shp 的要素类型图标,右键属性里能直接读空间参考和字段。这一步花三分钟,能省掉后面半小时的「为什么投影不对」。
# 如果要在命令行快速确认目录规模,可以用系统自带命令 # Windows 下统计各类型文件数量,便于判断数据量 dir /s /b *.shp | find /c /v "" dir /s /b *.tif | find /c /v ""这段命令只是帮你数清楚有多少 shp 和 tif,不是必须步骤。逻辑是:先知道数据规模,再决定是逐个实验做还是批量处理。参数上/s表示递归子目录,/b表示只输出路径,find /c /v ""是统计行数的老技巧。如果你在 PowerShell 里,可以用Get-ChildItem -Recurse -Filter *.shp替代。
2.3 先建一个自己的工作目录,别在原目录里改
教材数据是只读参考,你所有编辑、裁剪、导出都应该落到自己的工作目录。常见做法是:在 D 盘建arcgis_lab_work,里面再按实验编号建子目录,并把默认地理数据库设到这里。这样做的原因是 ArcGIS 很多工具会往默认 gdb 写中间结果,如果默认 gdb 在 C 盘深层目录,路径过长或权限不足都会报错。设置位置在 ArcMap 的「地理处理 → 环境 → 工作空间」里,把「当前工作空间」和「临时工作空间」都指到你的工作目录。
3. 坐标系和投影:实验数据能不能用,全看这一步
3.1 先判断数据是地理坐标还是投影坐标
打开一个 shp 的属性,看「源」里的空间参考。如果单位是 Degree,说明是地理坐标系,通常是 GCS_WGS_1984 或 GCS_Xian_1980;如果单位是 Meter,说明是投影坐标系,常见有 UTM、高斯克吕格 3 度带或 6 度带。教材数据里不同实验可能混用两种,直接叠加会错位。判断方法很简单:把两个图层同时加载,看右下角坐标显示。如果一个是 116.xx,另一个是 500000 级别,那就是一个地理一个投影,必须先统一。
# 用 arcpy 批量读取 shp 的空间参考,快速摸清数据底细 import arcpy, os root = r"D:\arcgis_lab_work\data" for dirpath, dirnames, filenames in os.walk(root): for f in filenames: if f.endswith(".shp"): p = os.path.join(dirpath, f) desc = arcpy.Describe(p) sr = desc.spatialReference print(f, "|", sr.name, "|", sr.linearUnitName if sr.type == "Projected" else sr.angularUnitName)这段脚本的逻辑是遍历目录下所有 shp,用arcpy.Describe拿到空间参考对象,再打印名称和单位。参数上sr.type返回Projected或Geographic,据此决定后面要不要投影转换。注意 arcpy 只能在 ArcGIS 自带的 Python 2.7 环境里跑,如果你装的是 ArcGIS 10.x,路径通常在C:\Python27\ArcGIS10.x。跑完你会得到一张清单,哪些是投影、哪些是地理一目了然。
3.2 统一坐标系的两个安全做法
如果数据是地理坐标系而你要做面积、长度计算,必须投影。常见做法是用「投影和变换 → 要素 → 投影」工具,目标坐标系选对应带号的高斯克吕格或 UTM。另一种做法是「批量投影」用模型构建器或 arcpy 循环。这里给一个 arcpy 批量投影的骨架:
# 批量投影到 CGCS2000 3度带,带号按经度计算 import arcpy, os arcpy.env.workspace = r"D:\arcgis_lab_work\data" out_folder = r"D:\arcgis_lab_work\projected" out_sr = arcpy.SpatialReference(4547) # CGCS2000 3 Degree GK CM 117E,按实际经度改 for shp in arcpy.ListFeatureClasses("*.shp"): out_path = os.path.join(out_folder, shp) arcpy.Project_management(shp, out_path, out_sr) print("done:", shp)逻辑说明:SpatialReference(4547)是 EPSG 代码,代表 CGCS2000 高斯克吕格 3 度带中央经线 117E。参数怎么改:如果你研究区在 114E 附近,用 4546;在 120E 附近,用 4548。不要随便选 WGS84 UTM,因为教材数据很多是国内坐标系,转错基准会导致几十米偏移。投影完要抽查:把原数据和投影后数据叠加,看是否重合,再看属性里的单位是否变成 Meter。
3.3 坐标系改不动时的排查顺序
热词里「arcgis无法更改坐标系」是高频问题。现象是右键属性里坐标系是灰的,或者改了不生效。原因通常有三个:一是数据本身有投影定义,你改的是显示不是定义;二是 shp 的 .prj 文件只读或被占用;三是你在布局视图里改,没在数据框属性里改。解决顺序:先关掉所有占用该数据的程序,检查 .prj 是否只读,然后在「数据框属性 → 坐标系」里改数据框,而不是改图层。如果只是想让数据框跟着第一个图层走,用「视图 → 数据框属性 → 坐标系 → 导入」从图层导入。
4. 照着教材做实验:从加载到出图的完整链路
4.1 加载数据与在线底图的正确顺序
教材实验通常第一步是加载 shp 和影像。顺序建议:先加底图或影像,再加矢量,最后加注记。热词里「arcgis加载在线影像图」和「arcgis加载天地图不显示」很常见。在线底图不显示,多半是服务地址变了、网络策略限制、或者坐标系不匹配。稳妥做法是先用本地 tif 做实验,在线底图只作为参考。加载本地 tif 时,如果提示「缺少空间参考」,不要直接点确定,先查 .tfw 或 aux 文件是否存在,没有的话用「定义投影」补上。
# 用 arcpy 把 tif 和 shp 一起加载并检查范围是否重叠 import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd)[0] tif = r"D:\arcgis_lab_work\data\dem.tif" shp = r"D:\arcgis_lab_work\data\boundary.shp" arcpy.mapping.AddLayer(df, arcpy.mapping.Layer(tif), "BOTTOM") arcpy.mapping.AddLayer(df, arcpy.mapping.Layer(shp), "TOP") arcpy.RefreshActiveView() print("tif extent:", arcpy.Describe(tif).extent) print("shp extent:", arcpy.Describe(shp).extent)逻辑是:先加栅格再加矢量,保证矢量压在上面。参数上"BOTTOM"和"TOP"控制图层顺序。打印范围是为了确认两者是否在同一区域,如果 XMin 差几十万,说明坐标系没统一,回到第 3 章处理。这段脚本在 ArcMap 的 Python 窗口里直接跑,前提是当前有打开的 mxd。
4.2 裁剪影像和矢量:clip 工具到底用哪个
热词里「arcgis裁剪影像」和「arcgis clip raster 中文叫什么」指向同一个困惑:矢量裁剪用「裁剪(Clip)」,栅格裁剪用「裁剪(数据管理)」,在中文界面里都叫裁剪,但工具位置不同。矢量裁剪在「分析工具 → 提取 → 裁剪」;栅格裁剪在「数据管理工具 → 栅格 → 栅格处理 → 裁剪」。参数上,矢量裁剪要选「输入要素」「裁剪要素」「输出要素类」;栅格裁剪要选「输入栅格」「输出范围」「是否使用输入要素裁剪几何」。常见坑是栅格裁剪时没勾「使用输入要素裁剪几何」,结果输出还是矩形范围。
# 矢量裁剪:用边界裁路网 import arcpy arcpy.Clip_analysis( in_features=r"D:\arcgis_lab_work\data\roads.shp", clip_features=r"D:\arcgis_lab_work\data\boundary.shp", out_feature_class=r"D:\arcgis_lab_work\out\roads_clip.shp" ) # 栅格裁剪:用同一边界裁 DEM arcpy.Clip_management( in_raster=r"D:\arcgis_lab_work\data\dem.tif", rectangle="", # 留空表示用要素范围 out_raster=r"D:\arcgis_lab_work\out\dem_clip.tif", in_template_dataset=r"D:\arcgis_lab_work\data\boundary.shp", nodata_value="0", clipping_geometry="ClippingGeometry" )逻辑说明:Clip_analysis是矢量专用,输出仍是矢量;Clip_management是栅格专用,clipping_geometry="ClippingGeometry"就是「使用输入要素裁剪几何」的代码写法。参数nodata_value设成 0 还是空,取决于你的 DEM 是否有 0 值区域,设错会把有效值当无数据。裁剪完要检查输出范围是否和边界一致,用「缩放至图层」看。
4.3 属性表操作:字段计算器和连接
教材实验里经常要算面积、编号、提取字段。热词「arcgis字段计算器怎么只保留后三位数字」是个典型需求。做法是新建字段,用字段计算器写 Python 表达式。比如要把 ID 字段后三位提取出来:
# 字段计算器表达式,Python 解析器 # 假设原字段是 TEXT 类型,名为 old_id !old_id![-3:] if len(!old_id!) >= 3 else !old_id!逻辑是 Python 切片取最后三个字符。参数上,!字段名!是 ArcGIS 字段计算器的语法,不是标准 Python。如果字段是数字类型,先转字符串:str(!old_id!)[-3:]。注意字段计算器里不能直接写中文引号,也不能有缩进错误。算完抽查几条记录,确认没有丢前导零。
4.4 出图与导出:图例乱码和导出报错
热词「arcgis图例乱码」通常出现在布局视图里,原因是字体缺失或编码不对。解决:在「图例属性 → 项目 → 样式」里把字体改成宋体或微软雅黑,不要用默认的 Arial Unicode。导出时如果报「已超过最大记录长度」,多半是属性表字段太多或文本字段太长,导出 shp 时先删掉不用的字段,或者导出成 gdb 要素类。热词「arcgis导出数据时错误已超过最大记录长度」就是这个坑,shp 的字段名限制 10 个字符,文本字段限制 254 字节,超了就报错。
5. 避坑与排查:实验数据最常见的 5 个翻车现场
5.1 现象:工具报 999999,没有任何提示
原因:这是 ArcGIS 的通用错误码,背后可能是路径太长、权限不足、数据被占用、坐标系不一致、或者内存不够。解决顺序:先把数据拷到短路径如D:\work,关掉其他打开该数据的程序,检查坐标系是否统一,再重跑。如果还不行,看「地理处理 → 结果」里的详细消息,那里才有真正原因。
5.2 现象:shp 属性表中文乱码
原因:shp 的 .dbf 默认编码是系统区域设置,中文 Windows 下通常是 GBK,但有些数据是 UTF-8。解决:用「转换工具 → 表转表」导出成 gdb 表,或者在 Catalog 里右键属性改编码。更稳妥的做法是全程用文件地理数据库,不用 shp。
5.3 现象:填洼报「当前许可不支持影像服务器」
原因:热词里这个报错通常是因为你用了 ArcGIS 基础版,水文分析工具需要 Advanced 许可。解决:检查「帮助 → 关于 ArcGIS」里的许可级别,或者换用 QGIS 的填洼工具做预处理,再拿回 ArcGIS 做后续。
5.4 现象:模型构建器里变量设置找不到环境工作空间
原因:模型构建器的环境设置和 ArcMap 主界面的环境设置是两套。解决:在模型构建器里右键空白处 → 模型属性 → 环境,在那里设工作空间。或者在模型里插入「工作空间」变量,手动指到你的 gdb。
5.5 现象:复制粘贴图层失败
原因:热词「arcgis为什么不能复制粘贴」通常是因为源图层和目标数据框坐标系不同,或者你试图把图层粘到不支持的数据类型里。解决:用「导出数据」代替复制粘贴,或者先统一数据框坐标系。
6. 进阶:用模型构建器和 arcpy 把重复实验批量化
教材实验做一遍是学习,做十遍就是浪费时间。真正让这套数据产生价值的,是把重复步骤固化成模型或脚本。我一般会先在一个实验上手动跑通,确认参数和顺序,然后用模型构建器把「投影 → 裁剪 → 字段计算 → 导出」串起来。模型构建器里最关键的是「前提条件」和「迭代器」,前者控制执行顺序,后者批量处理文件夹里的所有 shp。
# 批量处理:对每个 shp 做投影 + 裁剪 + 面积计算 import arcpy, os arcpy.env.workspace = r"D:\arcgis_lab_work\data" out_ws = r"D:\arcgis_lab_work\out" clip_feat = r"D:\arcgis_lab_work\data\boundary.shp" sr = arcpy.SpatialReference(4547) for shp in arcpy.ListFeatureClasses("*.shp"): name = os.path.splitext(shp)[0] proj = os.path.join(out_ws, name + "_proj.shp") clip = os.path.join(out_ws, name + "_clip.shp") arcpy.Project_management(shp, proj, sr) arcpy.Clip_analysis(proj, clip_feat, clip) arcpy.AddField_management(clip, "AREA_M2", "DOUBLE") arcpy.CalculateField_management(clip, "AREA_M2", "!shape.area!", "PYTHON_9.3") print("finished:", name)逻辑说明:先投影保证面积单位是米,再裁剪,再加字段算面积。参数上!shape.area!是 ArcGIS 内置几何属性,只在投影坐标系下才准确。PYTHON_9.3是 ArcGIS 10.x 的表达式解析器标识,写错会报语法错误。跑完检查输出目录,确认每个 shp 都有对应结果,再抽查面积值是否合理。
验证方法:拿一个已知面积的边界做对照,比如一个规则矩形,手动算面积和脚本算面积对比,误差应在千分之一以内。如果差很多,检查投影带号是否选对。我自己的习惯是:每跑完一批,先看日志有没有 warning,再随机抽三个图层叠加原数据看是否重合。这套数据本身不难,难的是环境对齐和参数一致。把这两件事做成脚本,后面换数据也能复用。希望帮到你。
本文还有配套的精品资源,点击获取