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

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实