简单介绍介绍如何使用ArcPy读取几何要素的坐标,后续会介绍如何生成一个shp文件。
掌握arcgis软件及其开发技巧对于任何一个giser都是必备的基本功,说来简单,没有大量的实践和练习一切都是扯淡。虽然已经有很多学者在倡导去arcgis化,但有机会还是要认真练习的,毕竟它的很多技术和理念一直引领者gis界的潮流。
即便很熟悉软件的操作,你还是会发现,实际做事的时候,自己面对的工作总有一些特殊需求或者大量重复的工作(就跟考试似的,会的都不考,考的都是没看的),仅凭arcgis软件有很大的困难,怎么办?用脚本,用程序吧!千万别疯狂点鼠标进行重复软件操作,颈椎和腰间盘把持不住啊。有时候鼠标狂点一天,其实几行代码就搞定了,倒杯茶,翘着腿,等它自动处理不香么。
前面几篇文章也介绍了ArcPy的基本操作,ArcPy 是一个 Python包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。为什么要用ArcPy 呢?因为它是基于python的,简单易学,真的是简单易学。当然,指入门简单,复杂起来真让人流泪。
导读
先宏观介绍一下,ArcPy 包括:数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块(arcpy.sa) 和ArcGIS Network Analyst 扩展模块(arcpy.na),不同的模块可以帮助我们处理不同的任务。
接下里的几篇会分别分享矢量栅格的输入输出,使用内置功能,批量制图等,最后在分享几个有趣的小实践。
闲话少说,进入今天的主题。本篇主要介绍如何使用ArcPy读取几何数据,获取属性列表。
有些项目需要获取shp数据中Polygon、Polyline、PointGeometry 、 MultiPoint(面,线,点,多点)的几何坐标,可能是用于计算等操作,那么我们怎么去获取呢?
借助ArcPy中数据访问模块 (arcpy.da)提供的SearchCursor 函数,可以在要素类或表上建立只读游标,通过遍历 Row 对象并提取字段值。
点要素(PointGeometry 要素)坐标的获取
第一步:导入arcpy模块
一般用到什么模块就导入什么模块,这个一种约定的代码规范。但是实在偷懒导入全部的模块也不是不行,比如直接写 import arcpy也可以。
import arcpy.da
第二步:添加文件地址
比如本人用的是point.shp
datadir = r'E:\data\test' #文件根目录 pointFile = datadir + os.sep + 'point.shp'#点shp文件名
第三步:使用with语句创建一个游标
with arcpy.da.SearchCursor(fc,["SHAPE@XY"]) as cursor:
其实大家到知道,既然打开了文件就得把它关闭掉,把资源释放掉。但是很多时候大家很容易忘记关闭文件,或者程序执行异常导致文件没有关闭。这时候with语句的强大之处就体现了,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后关闭已经打开的文件句柄,将资源会保证被释放掉。(具体怎么用大家可以自行百度学习一下)
第四步:循环搜索游标(SearchCursor),并打印对应的X,Y坐标值
for row in cursor:
print("这是第" + str(flag) + "个点要素")
flag += 1
# 打印每个点要素的x,y坐标
x, y = row[0]
print("{}, {}".format(x, y))
执行结果如下图所示:
完整程序如下所示:
import os
import arcpy
import time
def readPoint(fc):
print("读取点几何开始运行")
flag = 1
#for row in arcpy.da.SearchCursor(fc, ["SHAPE@XY"]):
with arcpy.da.SearchCursor(fc,["SHAPE@XY"]) as cursor:
for row in cursor:
print("这是第" + str(flag) + "个点要素")
flag += 1
# 打印每个点要素的x,y坐标
x, y = row[0]
print("{}, {}".format(x, y))
if __name__ == '__main__':
print("程序开始运行")
s_time=time.time()
datadir = r'E:\data\test' #文件根目录
pointFile = datadir + os.sep + 'point.shp'#点shp文件名
readPoint(pointFile)#读取点几何数据
e_time=time.time()
print("程序共耗时: %.2f s!" % (e_time - s_time))
折线或面几何坐标的获取
第一步:导入arcpy模块
import arcpy.da
第二步:添加文件地址
datadir = r'E:\data\test' #文件根目录
polylineFile = datadir + os.sep + 'line.shp'#折线几何shp文件
polygonFile = datadir + os.sep + 'polygon.shp'#面几何shp文件
第三步:使用with语句创建一个游标
with arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]) as cursor:
注意:
这里解释一下SearchCursor游标里面的参数。
SearchCursor参数 SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})
参数的解释:
(arcpy中SearchCursor()函数参数的含义,来源ArcGIS官网)
比如,本例子中,fc就是文件地址,对应于dataset;["OID@", "SHAPE@"]就是设置的返回条件,第一个OID指的是典型面的ID值,即下图中的FID,第二个SHAPE@是几何令牌。
几何令牌可用于访问特定几何信息,通常访问完整几何更加耗时,所以指定返回项目更加关心的内容。下面 是常用的几何令牌。
(几何令牌,来源ArcGIS官网)
第四步:循环搜索游标(SearchCursor),并打印对应的X,Y坐标值
for row in cursor:
# 打印当前要素的ID(即属性列表的记录个数,比如一个面要素由十个多边形组成)
print("Feature {}:".format(row[0]))
partnum = 0
# 分解每个要素的部分(比如环,有内部和外部之分)
for part in row[1]:
#打印部分点的编号
print("Part {}:".format(partnum))
#分别打印每个点
for pnt in part:
if pnt:
# 打印当前点的经纬度
print("{}, {}".format(pnt.X, pnt.Y))
else:
# 如果pnt为空,则表示一个内部环
print("Interior Ring:")
partnum += 1
可以看到,这个有三层循环,主要是因为线和面是存储的结构是三维的(要素-->要素的部分->坐标)。比如下图这个 面.shp:第一维度,它由三个要素组成(粉色三角属于一个要素,multiPolygon);第二维度,再看正方形的环,它由两个部分组成,内环和外环;第三维度,每个部分的坐标点。
要是我们运行程序读取上面图形的shp,则可以得到下面的数据:
(执行结果,数据来源ArcGIS官网)
完整程序如下所示:
import arcpy
import time
def readPolygonAndPolyline(fc):
print("读取面或者线几何开始运行")
#for row in arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]):
with arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]) as cursor:
for row in cursor:
# 打印当前要素的ID(即属性列表的记录个数,比如一个面要素由十个多边形组成)
print("Feature {}:".format(row[0]))
partnum = 0
# 分解每个要素的部分(比如环,有内部和外部之分)
for part in row[1]:
#打印部分点的编号
print("Part {}:".format(partnum))
#分别打印每个点
for pnt in part:
if pnt:
# 打印当前点的经纬度
print("{}, {}".format(pnt.X, pnt.Y))
else:
# 如果pnt为空,则表示一个内部环
print("Interior Ring:")
partnum += 1
if __name__ == '__main__':
print("程序开始运行")
s_time=time.time()
datadir = r'E:\data\test' #文件根目录
polylineFile = datadir + os.sep + 'line.shp'#折线几何shp文件
polygonFile = datadir + os.sep + 'polygon.shp'#面几何shp文件
readPolygonAndPolyline(polylineFile)#读取面几何数据
readPolygonAndPolyline(polygonFile)#读取面几何数据
e_time=time.time()
print("程序共耗时: %.2f s!" % (e_time - s_time))
完整程序可在Git中查看:
https://github.com/Linglihua/-GIS/blob/master/readShpCoordinates
至此,已经基本了解如何读取几何要素的坐标值,可以为进一步的项目做铺垫,当然仅仅有几何坐标完全是不够的。程序用得到如SearchCursor()这样的游标,后面也会单独详细的介绍一个什么是游标,有哪些用处,比如获取属性列表,创建一个几何要素,修改属性列表,输出shp文件等,为完成项目做好技术上的准备。
一起学技术,玩GIS吧
长按识别二维码关注我们