ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ArcPy基础入门:从环境配置到批量地理处理实战

ArcPy基础入门:从环境配置到批量地理处理实战 简介面向ArcGIS Python初学者的ArcPy基础入门教程以PDF电子书形式呈现系统讲解如何通过Python调用ArcGIS Desktop的各类功能帮助零基础读者快速建立从环境配置到自动处理地理数据的完整路径。资源内含1个PDF文件压缩包整体约7.76MB轻量便携适合作为案头手册随查随用。目前已有468人学习下载。内容从导入ArcPy、访问工具、调用地理处理服务与函数类一直讲到环境设置、错误处理、数据路径、工具箱和许可扩展模块并覆盖创建数据列表、多值输入、字段映射及脚本定时运行等实操主题。读者可依托本教程掌握用Python驱动ArcGIS完成数据整理、空间分析与结果验证的常用方法为后续开发复杂地理处理脚本打下扎实基础。1. 想系统学一遍ArcPy基础不必先啃完整本Python语法书一次要处理几百个shapefile手工打开属性表改字段值谁都受不了ArcPy就是ArcGIS提供给Python的接口库它把数据管理、地理处理、地图出图封装成函数和类让重复操作变成几十行脚本。对刚入门的人来说只需要知道“用Python控制ArcGIS的工具和环境”就能解决很大一部分日常工作。下面我按环境、游标、工具、批量处理的顺序把针对ArcGIS Python基础入门的路径讲一遍环境怎么配、代码怎么调、常见坑在哪都会写到。2. ArcPy环境两件事Python解释器与授权怎么配ArcPy不是一个单独的编程语言它是Python的标准模块所以第一件事是让Python解释器能找到ArcGIS的安装。本机装的是ArcGIS Pro还是ArcMapPython版本和使用方式完全不同先把这层理顺后面脚本才不会报导入失败。2.1 你是ArcMap还是ArcGIS ProPython版本差异先看清楚ArcMap 10.x自带的Python是2.7从ArcGIS Pro 2.x开始Python升级到3.xArcGIS Pro 3.0左右是3.93.1/3.2仍在3.x序列。ArcPy的调用语法在Pro里更贴近现代Pythonraster处理效率也更高。判断方式很简单打开ArcGIS自带的Python窗口输入import sys print(sys.version)看打印出来的主版本号。如果是“2.7.18”那就是ArcMap环境学习时要避开Python3独有的语法比如f-string在ArcMap中就用不了得用format()。如果是“3.9.xx”或者更高可以放心使用f-string和pathlib。对比项ArcMap 10.xArcGIS Pro 2.x/3.xPython版本2.73.x常用启动方式Python窗口 / 外部python.exePython命令行 / 内置Notebook推荐编辑器任意注意2.7语法VS Code / PyCharm数据兼容文件地理数据库、shapefile文件地理数据库 要素服务还有一个隐藏问题ArcPy的完整功能依赖ArcGIS授权。无论ArcMap还是Pro都需要正常的许可。用试用版或教育版时很多工具也能调用但高级分析模块受限。启动时如果报“ERROR 999999: Invalid license”可以先检查授权等级老版本ArcGIS 10.2的Python2.7在高版本Windows上偶尔无法启动那多半是系统兼容性问题不是代码问题。2.2 配置Python环境的三种常见做法常见做法有三种直接使用ArcGIS自带的Python这是最简单可靠的路径第二种是在ArcGIS Pro里用conda建独立环境第三种是外部Python解释器比如VS Code里配置Python环境再指向ArcGIS的包。用ArcGIS自带Python最大的好处是不用操心“arcpy包找不到”。ArcMap下安装完ArcGIS后Python就在安装目录下的python.exeArcGIS Pro则提供“Python”命令行可以在开始菜单里找到。运行脚本时用这个解释器执行就行C:\Python27\ArcGIS10.8\python.exe your_script.py如果你用的是VS Code或PyCharm直接在解释器路径里填上这个python.exe插件就能识别到arcpy。ArcGIS Pro的conda环境还可以复制出一个专用环境conda create --name arcpy_env --clone arcgispro-py3 conda activate arcpy_envclone的好处是所有带有arcpy、arcpy.mp、arcpy.na等模块的初始环境一并复制过来后续安装pandas、numpy也不会污染ArcGIS的原始环境。外部编辑器里只要选了解释器代码补全和调试都能正常工作。2.3 验证环境跑通第一行ArcPy代码环境配完后用最简短的代码验证导入是否成功。新建文件first.py内容import arcpy arcpy.env.workspace rC:\GIS_Data print(arcpy.env.workspace)第一行导入arcpy第二行设置工作空间后续所有相对路径都会在这个根目录下解析第三行打印确认。如果控制台没有输出“C:\GIS_Data”而是抛出ImportError说明解释器环境不对回到上一节检查。能跑通这一行ArcPy环境就算就绪。接下来所有的游标和历史处理工具都能在这个环境下正常工作了。3. 用ArcPy游标和工具把矢量数据读进内存环境没问题后最常见需求就是读写要素类和表格。ArcPy提供了一套名为“游标”的对象顺序读取每一行还能在循环里修改、新增。这一章先讲工具调用的套路再讲游标用法。3.1 调用工具arcpy.XXX_management()与工具箱的对照ArcGIS的分析工具在ArcPy里都有对应函数。函数的命名规律通常是“工具名_工具箱别名”例如“裁剪”在工具箱里叫Clip在ArcPy里就是arcpy.Clip_analysis()“添加字段”是AddField在ArcPy里是arcpy.AddField_management()。后面这个后缀来自工具箱名不用硬背多写几次就熟了。调用工具的一般形式是import arcpy arcpy.env.workspace rC:\GIS_Data arcpy.Clip_analysis( in_featuresparcels.shp, clip_featurescity_bounds.shp, out_feature_classparcels_clip.shp )这里的三个参数分别对应工具界面的输入要素、裁剪要素和输出要素。所有地理处理工具的第一个参数通常是输入最后一个通常是输出中间参数按工具界面顺序给。参数用字符串填路径可以是相对工作空间的路径。遇到不记得参数顺序时可以用内置帮助arcpy.Clip_analysis.__doc__会输出工具帮助文本比去文档站搜索快。还有一个好习惯把参数写成“参数名值”的键值对脚本可读性好也不容易漏参数。3.2 游标逐行Read、Write、Insert游标要处理的是数据表的行。ArcPy提供三种SearchCursor读、UpdateCursor改/删、InsertCursor插入。都要指定要素类和字段列表返回一个可迭代对象。用游标读取所有地块的面积字段示例import arcpy fc rC:\GIS_Data\parcels.shp with arcpy.da.SearchCursor(fc, [FID, SHAPEAREA, LANDUSE]) as cursor: for fid, area, landuse in cursor: if area 10000: print(f{fid}: {area}, {landuse})字段列表里放的“SHAPEAREA”是一种特殊字段token返回值是要素面积不占属性表字段。类似的有SHAPE几何对象、SHAPEXY点坐标、SHAPELENGTH长度等。需要获取每个要素几何中心点的时候用SHAPEXYwith arcpy.da.SearchCursor(fc, [SHAPEXY, NAME]) as cursor: for xy, name in cursor: print(name, xy[0], xy[1])这条代码会输出每个要素的名称与经纬度或投影坐标取决于要素类的坐标系统。返回的xy是包含两个浮点数的元组。如果用UpdateCursor循环体里给当前行字段赋值就行with arcpy.da.UpdateCursor(fc, [status, area]) as cursor: for status, area in cursor: if area 5000: cursor.updateRow([status _big, area])这里把行中面积大于5000的记录状态拼上“_big”然后调用updateRow把修改后的行写回。要注意UpdateCursor的行默认是锁定状态不要在循环里再做其他写操作否则可能出现锁冲突。游标类型操作适用场景SearchCursor读遍历属性值、汇总统计UpdateCursor改/删批量修改字段、清洗数据InsertCursor写新建要素、追加记录3.3 用Describe和List摸清数据家底在使用工具前经常需要先确认数据存在或者遍历工作空间里的所有要素类。arcpy.ListFeatureClasses()返回当前工作空间中所有要素类名称列表arcpy.Describe()可以拿到数据集的属性表格例如空间参考、数据类型、字段列表arcpy.env.workspace rC:\GIS_Data for fc in arcpy.ListFeatureClasses(): desc arcpy.Describe(fc) print(fc, desc.shapeType, desc.spatialReference.name)这段代码遍历所有要素类打印类型是点、线还是面以及坐标系名称。当脚本面对批量数据时这两个函数是标配。注意da游标如arcpy.da.SearchCursor性能远好于旧版arcpy.SearchCursor基础初学者直接使用da前缀即可后面看到的ArcPy代码也基本都是da写法。4. 批量裁剪、修复几何与检查压盖线直接能抄的脚本环境、工具、游标都熟悉后真正的工作通常是一组重复操作。这一章准备三个实战脚本都用了最基础的ArcPy语法适合直接改成自己的数据路径。4.1 批量裁剪影像按行政区边界批量输出需求一个目录下有多张遥感影像另一个目录是行政区划面需要按照区划裁剪出多个小影像。手工在ArcGIS里点十几次脚本一遍跑完。import arcpy import os arcpy.env.workspace rD:\images out_dir rD:\clipped clip_shp rD:\boundary\city.shp for raster in arcpy.ListRasters(): out_name os.path.splitext(raster)[0] _clip.tif out_path os.path.join(out_dir, out_name) arcpy.Clip_management( in_rasterraster, rectangle, out_rasterout_path, in_template_datasetclip_shp, nodata_value0, clipping_geometryClippingGeometry )这里用ListRasters遍历工作空间中的栅格然后对每个栅格调用Clip_management。参数中rectangle留空用in_template_dataset指定裁剪边界clipping_geometry选择“ClippingGeometry”才会按边界形状裁剪而不是边界外接矩形。nodata_value0是把裁剪后无数据区域填充为0对后续分析更友好。参数说明示例in_raster需要裁剪的栅格路径D:\images\img.tifrectangle裁剪范围可留空in_template_dataset矢量边界或范围面city.shpclipping_geometry是否按边界几何裁剪ClippingGeometry4.2 修复几何把无效形状变成有效形状从外部交换过来的数据经常出现自相交、逆时针环等无效几何。这类数据直接做空间查询会报错误999999。ArcPy有现成的“修复几何”工具。脚本可以遍历所有要素类然后调用arcpy.env.workspace rD:\data for fc in arcpy.ListFeatureClasses(): arcpy.RepairGeometry_management(fc, DELETE_NULL)第二个参数DELETE_NULL表示删除为空几何的对象保留属性记录。这个工具的机制是先分析shape字段中每个要素的几何是否有效无效的根据规则重建。注意在使用RepairGeometry之前可以用arcpy.IsValidTable工具检查哪些要素有问题但IsValidTable在部分版本中才有如果用不了就放一个try-except包住空间操作先跳过再修复。4.3 检查压盖线并输出重叠部分在制图或规划场景中经常不能有压盖线。用ArcPy做检查的思路是遍历线要素类两两求交找出相交并输出为新要素。数据量不大时用搜索游标嵌套循环即可import arcpy fc rC:\lines.shp out rC:\overlaps.shp arcpy.CreateFeatureclass_management( out_pathrC:\, out_nameoverlaps.shp, geometry_typePolyline, spatial_referencearcpy.Describe(fc).spatialReference ) with arcpy.da.SearchCursor(fc, [SHAPE, FID]) as cur1: for geom1, fid1 in cur1: with arcpy.da.SearchCursor(fc, [SHAPE, FID]) as cur2: for geom2, fid2 in cur2: if fid1 fid2: continue if geom1.overlaps(geom2): inter geom1.intersect(geom2, 0) if inter is not None: with arcpy.da.InsertCursor(out, [SHAPE]) as ic: ic.insertRow([inter])这段代码是两两比较简单但要小心如果线有N个要素复杂度是O(N^2)几千要素以内没问题几万就要用空间索引或Topology检查。intersect的第二个参数0表示返回相同维度几何线线相交得到线1则返回点。这里仅做演示当大量数据时请优先使用ArcGIS拓扑工具。压盖线检查的延伸如果需要画线可以用arcpy.Polyline构造线对象再插入到要素类常见的“画线步骤”就是构造点数组然后Polylinepoints arcpy.Array([arcpy.Point(0, 0), arcpy.Point(10, 10)]) line arcpy.Polyline(points)这样构造的线可以像上面一样用InsertCursor写到要素类里。把这些组合起来就能完成“自动检查压盖线并生成提示线”的小工具。5. 让ArcPy脚本跑得更稳错误处理与性能优化脚本一旦进入“给别人用”或者是跑夜班批量任务就不能裸奔。至少三个点捕获异常释放锁检查环境相关设置。5.1 用GetMessages捕获工具执行信息当某个工具失败arcpy消息里会有代码。常见做法import arcpy, traceback try: arcpy.Buffer_analysis(rC:\line.shp, rC:\buff.shp, 10 Meters) except arcpy.ExecuteError: print(arcpy.GetMessages(2)) # 错误消息 traceback.print_exc()如果工具不抛出异常但产生warning可以用arcpy.GetMessages(1)查看。循环里最好把当前处理的文件路径也打印出来方便定位中断点。5.2 环境设置里的三个性能开关arcpy.env.outputCoordinateSystem统一输出坐标系避免后续每一步都有动态投影。arcpy.env.overwriteOutput设为True可以让重复运行直接覆盖同名文件不必每次删旧文件。arcpy.env.parallelProcessingFactor开启多核不影响所有工具但栅格相关工具可设成“100%”。环境设置取值作用overwriteOutputTrue/False是否允许覆盖已存在文件outputCoordinateSystem坐标系对象输出统一坐标系parallelProcessingFactor50%/100%控制并行处理因子5.3 预检输入与分段处理错误预防上有一个简单动作凡是修改数据前先预检一次输入路径是否存在if not arcpy.Exists(fc): raise Exception(f输入要素类不存在: {fc})处理超大型要素类反复用游标读取大量行会吃内存。如果只是分段处理可以用arcpy.chunk但基础入门阶段记住一点就好尽量不要在循环里反复Describe和List把不变化的属性提前取出来。在脚本写完跑通一次后建议你在ArcGIS的Map中加载输出结果用“Select By Location”随机抽查几个要素确认坐标和字段符合预期。这个验证动作比重跑一遍脚本更能发现数据问题。本文还有配套的精品资源点击获取
返回列表