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

相关文章

从基础到高级详解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# 代码三、分辨率设置 - 清晰度的决定因

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10