ArcPy高级开发教程—要素操作

2024-04-26 23:48

本文主要是介绍ArcPy高级开发教程—要素操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天,介绍使用ArcPy对矢量数据的要素feature进行操作方法。

目录

1. 空间分析相关

建立缓冲区

计算要素面积和周长

按属性选择

2. 要素遍历

3. 导出每个要素

4. 生成shpfile文件


1. 空间分析相关

  • 建立缓冲区

# _*_ coding: UTF-8 _*_
import arcpy, os
def buildBufffer(shpPath,workspace):buffer_name = os.path.join(workspace, 'buffer.shp')distance = '200 meters'if not os.path.exists(buffer_name):arcpy.Buffer_analysis(shpPath, buffer_name, distance, "FULL", "ROUND", "NONE")return buffer_name

上述函数能够在workspace目录下生成名为buffer的缓冲区文件。shpPath是shpfile的路径,缓冲半径为200米,在哪一侧缓冲、末端类型和是否融合都可以在Buffer_analysis函数中更改。

  • 计算要素面积和周长

def caculateAreaLength(inputShp):# 计算面积arcpy.AddGeometryAttributes_management(inputShp,['AREA_GEODESIC'], '', 'SQUARE_METERS', '')# 计算周长arcpy.AddGeometryAttributes_management(inputShp,['PERIMETER_LENGTH_GEODESIC'], 'METERS','', '')

上述函数为输入的shp的元素自动计算面积和周长,注意输入的shpfile必须为投影坐标系,如果原始shpfile为地理坐标系(例如WGS84),那么可以在AddGeometryAttributes_management函数前添加下面代码,帮助输出更改为投影坐标。

arcpy.env.outputCoordinateSystem=arcpy.SpatialReference('WGS 1984 UTM Zone 49N')

此外,计算图斑面积和周长,据笔者所知,还有以下方法:

# 通过字段计算器
arcpy.CalculateField_management(shpPath, 'area', "!shape.geodesicArea@SQUAREMETERS!", 'PYTHON_9.3')# 通过空间统计工具
arcpy.CalculateAreas_stats(input,output)
  • 按属性选择

这是一个十分常用的功能,比如我已经计算出了每个图斑的面积,现在我要删除面积小于100的,保留面积大于等于100的图斑,参考代码如下:

def SelectArea(inputShp):input_lyr = "lyr1"arcpy.MakeFeatureLayer_management(inputShp, input_lyr)arcpy.SelectLayerByAttribute_management(input_lyr, "NEW_SELECTION", '"AREA_GEO" < 100')if int(arcpy.GetCount_management(input_lyr).getOutput(0)) > 0:arcpy.DeleteFeatures_management(input_lyr)arcpy.Delete_management(input_lyr)

注意,这个操作是在原始shp上进行的,会直接删除不符合条件的要素。SelectLayerByAttribute_management函数中AREA_GEO就是原始shp中代表面积的字段。这个操作就类似于你在ArcGIS里面按属性选择,说完这个,好奇宝宝会问,那么按位置选择如何实现,简要代码如下

arcpy.SelectLayerByLocation_management(layer1, 'intersect',layer2)

这句代码的作用就是选择layer1中与layer2相交的要素,此外,我们还可以统计选择的数量,例如在上句代码后加入

matchcount = int(arcpy.GetCount_management(layer1)[0])

这里的matchcount就是layer1中被选中的要素个数

最后,如果你要对按属性选择或者按位置选择后的结果导出,命令如下

arcpy.CopyFeatures_management(layer1,outputshp)

先选择,选择后就可以导出结果了。

2. 要素遍历

遍历每一个要素,用到的主要是SearchCursor和UpdateCursor,顾名思义,SearchCursor主要用于你要查询某个要素的属性值,UpdateCursor用于更新某要素的属性值。

fields = ['FID', 'field1','field2']
with arcpy.da.SearchCursor(inputShp, fields) as cursor:for r in cursor:id = r[0]

上面代码中通过一个列表fields传入你要查询的字段,inputShp是输入的shp,通过游标cursor进行遍历,遍历的结果仍然以列表的形式返回,返回结果的顺序与fields中查询字段的顺序是一致的。

下面举个复杂点的例子,inputShp包含FID, AREA和Tag三个字段,AREA存储了每个要素的面积,现在我要把AREA>100的要素的Tag的值设为1,代码如下:

id_list = []
fields = ['FID','AREA']
with arcpy.da.SearchCursor(inputShp, fields) as cursor:for r in cursor:if int(r[1]) > 100:   id_list.append(r[0])
fields = ['FID', 'Tag']
with arcpy.da.UpdateCursor(inputShp, fields) as cursor:for r in cursor:if r[0] in id_list:r[1] = 1cursor.updateRow(r)

另外,一个很有用且相对复杂的,是ArcPy提供了一个叫做令牌'SHAPE@'的东西,帮助在遍历要素时直接获取要素的几何属性、空间参考等信息,使用时直接放在fields中就行。示例代码如下

# 面要素,获取每个要素的几何范围
with arcpy.da.UpdateCursor(inputShp, ['SHAPE@']) as cursor:for row in cursor:extent = row[0].extent
​
# 点要素,获取每个要素的XY坐标
with arcpy.da.SearchCursor(inputShp, ["SHAPE@XY"]) as cursor:for row in cursor:x, y = row[0]

'SHAPE@'获取得到的是Geometry几何对象,"SHAPE@XY"得到的是要素的质心坐标,除了这两个,还有一些令牌可以直接使用,如下图:

3. 导出每个要素

这是一个经常有很多人问的问题,如何把一个shpfile按照ID把每个要素分别导出成shp,了解了要素遍历,这个就很简单了

  • 方式1:

for row in arcpy.da.SearchCursor(inputShp,["FID"]):tempShpName=str(row[0])+'.shp'where_clause = '{fieldName}={data}' \.format(fieldName='FID', data=row[0])arcpy.Select_analysis(inputShp, tempShpName, where_clause)
  • 方式2

with arcpy.da.SearchCursor(shp, ["SHAPE@","FID"]) as cursor:for row in cursor:out_name = str(row[1]) + '.shp'  arcpy.FeatureClassToFeatureClass_conversion(row[0], out_path, out_name)

4. 生成shpfile文件

经常我们会从txt或者excel等文件中读取点坐标,生成矢量文件。这里给定两个坐标点(x1,y1),(x2,y2)

  • 生成包含这两个点的点shp文件:

pointGeoList = []
spatial_reference = arcpy.SpatialReference(4326)
pointList=[arcpy.Point(x1, y1),arcpy.Point(x2, y2)]
for pt in pointList:point_geo = arcpy.PointGeometry(pt, spatial_reference)pointGeoList.append(point_geo)
arcpy.CopyFeatures_management(pointGeoList, 'points.shp')

上述代码将两个点保存在points.shp中,且空间参考为WGS84

  • 生成面文件

如果我们想以上面的两个点作为矩形的左上角和右下角坐标,生成一个面矢量,则

polygonList = []
spatial_reference = arcpy.SpatialReference(4326)
pointArray = []
point1 = arcpy.Point(x1, y1)
pointArray.append(point1)
point2 = arcpy.Point(x2, y1)
pointArray.append(point2)
point3 = arcpy.Point(x2, y2)
pointArray.append(point3)
point4 = arcpy.Point(x1, y2)
pointArray.append(point4)
polygonList.append(arcpy.Polygon(arcpy.Array([pointArray]), spatial_reference))
arcpy.CopyFeatures_management(polygonList, 'polygon.shp')

创建面的关键就是面也是由点组成的,将一个面中的点按顺序存放在list中,组成一个Polygon,再将多个Polygon放在list中组成包含多个面的矢量。

更多信息可以参考ArcPy的官方文档

原创不易,如果有问题我没有在博客上及时回复,可以关注公众号 TechGIS 交流

这篇关于ArcPy高级开发教程—要素操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939001

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因