Arcpy开发基础知识点总结
前言
作为一个GIS开放人员,不会ArcGIS,真的不是一件好事。还记得谁说过,能学会ArcGIS中20%的知识,你就是一个大牛了。可见ArcGIS包含的内容之丰富,工具之广泛,原理之深入,是其他GIS软件都没法比拟的,也正是如此,ArcGIS才能常年占据地理信息系统市场的半壁江山,甚至可以说是80%的市场。因为项目需要,也是为了拓展自己的知识面,现在开始学习用Arcpy。“ArcPy 是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。该包提供了丰富纯正的 Python 体验,具有代码完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。使用 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言。它是一种支持动态输入的解释型语言,适用于交互操作以及一次性程序(即脚本)快速原型制作,同时具有编写大型应用程序的强大功能。用 ArcPy 编写的 ArcGIS 应用程序的优势在于,可以使用由多个不同领域的 GIS 专业人员和程序员组成的众多 Python 小群体开发的附加模块。”
ArcPy3.0
启动方式(显示的所有路径假定按计算机(所有用户)安装 ArcGIS Pro。 如果已为当前用户安装 ArcGIS Pro,请将 %LOCALAPPDATA% 替换为 %PROGRAMFILES%。):
(1) 要从命令提示符运行 Python 脚本(可在 .py 文件后添加参数),请键入以下内容:
1 | "C:\Program Files\ArcGIS\Pro\bin\Python\Scripts\propy" myscript.py |
或者是将 “C:\Program Files\ArcGIS\Pro\bin\Python\Scripts” 加入Path环境变量,这样就可以直接从命令行中,使用 propy 命令来启用 ArcPy 了。
(2) 从批处理文件启动
要从 .bat 文件运行 Python 脚本,请在 propy 上使用 call:
1 | @echo Run my Python script |
(3) 作为计划任务启动
如果作为计划任务运行 Python 脚本,程序或脚本应为 C:\PROGRA~1\ArcGIS\Pro\bin\Python\Scripts\propy,并且参数应包含 Python 脚本的完整路径。
Conda
ArcGIS Pro 提供大量 Python 软件包的访问权限。 为了支持 Python 包,ArcGIS Pro 包含一个包管理系统,名为 conda。 ArcGIS Pro 将 conda 与包管理器页面相集成。 也可以从命令提示符访问 conda。启动 ArcGIS Pro Python 3 conda 环境:
1 | "%PROGRAMFILES%\ArcGIS\Pro\bin\Python\Scripts\proenv" |
可从命令提示符使用 conda 命令访问 conda 功能。 活动 Python 环境通过在当前目录之前的提示符中以括号括起指示。 使用 Python 命令提示符快捷方式可打开使用 ArcGIS Pro 的活动 conda 环境初始化的命令提示符窗口。
1.包管理器
问题
(1) The current user does not have write permissions to the target environment
1.Arcpy调用地理处理工具
脚本中所有可用的地理处理工具都被定义为arcpy对象的动态函数(dynamic function)。脚本中执行的每一个工具都必须遵循特定的语法规则,首先需要定义工具名称,之后紧跟一个下划线(_)和工具箱的别名。在我们的示例中,Buffer工具位于Analysis Tools工具箱中,该工具箱的别名为analysis。使用别名是因为可能有多个工具的名称相同。使用<toolname>_<toolbox_alias>的语句规则实现对每个工具的唯一引用。
2.自动生成线段编号
1 | #!/usr/bin/python |
1.利用arcpy实现自动编号 (主要就是参考的这里的代码)
2.【Arcpy】shp的读取与创建
3.da.UpdateCursor
4.UpdateCursor (da.UpdateCursor和UpdateCursor是不一样的)
5.python自动给数字前面补0的方法
3.字段自动编号
在字段计算器中,选择Python脚本,选择“Show codeblock 显示代码块”,代码块的内容如下:
1 | rec=0 |
在下面的等于框中写上 autoIncrement(), 调用该函数
(2) 自动补零
除了编号之外,还需要进行自动补零,然后加上前缀,可以使用VB代码如下,这里就是将字段编号为:“前缀0001”、“前缀0002”、“前缀0003”…..
1 | "前缀" & left("0000",4-len( [FID]+1)) & ([FID] +1) |
使用python语言就是
1 | '前缀' + (str(autoIncrement())).zfill(5) |
1.Arcgis如何给新添的字段自动编号 (这里使用python实现了自动编号)
2.ArcGIS中小数前补全0
3.解析ArcGis的字段计算器(三)——文本型字段计算,编号那些事儿 (使用vb代码比较简单)
4.浮点数精度问题
使用arcgis字段计算器的时候,想要将获取到的地理坐标面积,进行四舍五入并保留两位小数存入MJ属性中,借助于python的round函数,可以进行四舍五入计算,但是总是会出现问题,就是 125396883.690809 进行四舍五入之后,只剩下了 12539600,就算是乘以100,最后还是零而不是883,使用了多种方法都不行。这个 MJ 属性,是浮点型数据,相对应的mj0之所以有两位小数,是因为它是文本型字段,这样就比较清晰了,是因为浮点型精度问题。
【解决方法】
浮点型数字有效位数只有7位,需要换成双精度的数据。因为是位的有效位,所以就可以看出为什么后面的883等数字。
1.计算字段示例 使用pythong脚本的介绍
2.为何float有效位数只有7位? 因为单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位
3.为何float有效位数为7位?
5.将GDB转为geojson
esri的json和标准的geojson还是有区别的。我尝试了很多的方法,做了很多的工作,真是浪费了很多的时间。其实关键的就是 FeaturesToJSON 方法,传入一个geojson参数。还有ChatGPT提供的 arcpy.FeaturesToJSON_conversion 这个方法,其实并不是非常的正确,这个转为json,还需要自己去解析。
1 | import arcpy |
根据ChatGPT的说法,arcpy.FeaturesToJSON_conversion 和 arcpy.conversion.FeaturesToJSON 都是用来将 ArcGIS 地理数据转换为 JSON 或 GeoJSON 格式的函数,主要区别在于前者是一个函数,而后者是一个工具。
1.arcmap批量导出shp和geojson数据(包含自定义文件名)
2.python json loads遇到中文的情况分析。 json.loads(dataJsonStr, encoding=”GB2312”)
3.Features To JSON (Conversion) Converts features to Esri JSON or GeoJSON format. The fields, geometry, and spatial reference of features will be converted to their corresponding JSON representation and written to a file with a .json or .geojson extension.
4.Outputting geoJSON with arcpy.FeaturesToJSON_conversion tool of ArcGIS Pro?
5.ArcPy 函数概述
6.通过 Python 使用工具
6.将geojson转为shape
代码其实很简单,就是需要一个正确的geojson格式的文件,才可以。
1 | import arcpy |
问题
(1) Polygons and MultiPolygons should follow the right-hand rule
在geojson验证网站 上,验证一段geojson代码,出现了上面的问题:Polygons and MultiPolygons should follow the right-hand rule。
1 | { |
【解决方案】
这个问题解决方法,就是换了一个网站进行geojson的验证,使用geojson 进行验证就好了,这个网站不挑是不是右手坐标系。
1.Solution: Polygons and MultiPolygons should follow the right-hand rule
2.mapstertech/mapster-right-hand-rule-fixer
3.Polygons and MultiPolygons should follow the right-hand rule My old GeoJSON worked with Google Maps, Leaflet, OpenLayers, Mapbox, Bing Maps, etc. however failed geojsonlint.com validate.I have to use another website to validate: http://geojson.io。这里也提供了python解决方案:This can be fixed very easily in Python using geojson-rewind.
4.如何检测Geojson,Geojson下载
5.Polygons and MultiPolygons should follow the right-hand rule
6.GeoJSON三分钟入门教程 这里也有对各个类型的图形进行了说明和示例。
(2) arcgisscripting.ExecuteError: ERROR 999999: Something unexpected caused the tool to fail
这个问题主要出在坐标不正确的情况下,比如面的坐标系不同。
【解决方案】
按照标准的geojson进行生成,面的第一个点和最后一个点要重叠。
1.GeoJSON格式规范说明
2.geojson 格式说明(格式详解) 这里有不同的类型的示例
3.Error: ERROR 999999 Something unexpected caused the tool to fail This error is displayed when the existing enterprise geodatabase connection in the ArcGIS Pro project has the versioning type set to Traditional instead of Branch in the Geodatabase Connection Properties window.