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

相关文章

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

Tomcat的下载安装与使用教程

《Tomcat的下载安装与使用教程》本文介绍了Tomcat的下载、安装和使用方法,包括在本机和云服务器上部署Tomcat的过程,以及解决启动失败问题的方法... 目录Tomcat的下载安装与使用Tomcat的下载与安装Tomcat在本机运行使用Tomcat在php云服务器上的使用总结Tomcat的下载安装与

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

IDEA接入Deepseek的图文教程

《IDEA接入Deepseek的图文教程》在本篇文章中,我们将详细介绍如何在JetBrainsIDEA中使用Continue插件接入DeepSeek,让你的AI编程助手更智能,提高开发效率,感兴趣的小... 目录一、前置准备二、安装 Continue 插件三、配置 Continue 连接 DeepSeek四

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar