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

相关文章

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用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 压缩文