多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

ArcGIS10实验数据实战指南:环境对齐、坐标系统一与批量处理

ArcGIS10实验数据实战指南:环境对齐、坐标系统一与批量处理 简介这份资源是《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 rD:\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 rD:\arcgis_lab_work\data out_folder rD:\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 rD:\arcgis_lab_work\data\dem.tif shp rD:\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_featuresrD:\arcgis_lab_work\data\roads.shp, clip_featuresrD:\arcgis_lab_work\data\boundary.shp, out_feature_classrD:\arcgis_lab_work\out\roads_clip.shp ) # 栅格裁剪用同一边界裁 DEM arcpy.Clip_management( in_rasterrD:\arcgis_lab_work\data\dem.tif, rectangle, # 留空表示用要素范围 out_rasterrD:\arcgis_lab_work\out\dem_clip.tif, in_template_datasetrD:\arcgis_lab_work\data\boundary.shp, nodata_value0, clipping_geometryClippingGeometry )逻辑说明Clip_analysis是矢量专用输出仍是矢量Clip_management是栅格专用clipping_geometryClippingGeometry就是「使用输入要素裁剪几何」的代码写法。参数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 rD:\arcgis_lab_work\data out_ws rD:\arcgis_lab_work\out clip_feat rD:\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再随机抽三个图层叠加原数据看是否重合。这套数据本身不难难的是环境对齐和参数一致。把这两件事做成脚本后面换数据也能复用。希望帮到你。本文还有配套的精品资源点击获取
返回列表