Arcpy学习笔记(四)处理几何图形

第四章 处理几何图形

1.处理几何对象
要素类中的每一个要素都包含一组用来定义点、线和多边形的折点。这些折点通过几何对象(如Point、Polyline、PointGeometry和MultiPoint)来访问,并以点对象数组的形式返回。
如果仅需要该几何对象的某几个属性,可以通过定义一个“几何短语”来获取几何对象的属性。如SHAPE@XY会返回一组表示要素几何中心的x、y坐标值;SHAPE@LENGTH会以双精度类型返回要素的长度;SHAPE@会返回整个几何对象。
ps:这里的SHAPE@意为几何令牌(详情可见官网:https://pro.arcgis.com/zh-cn/pro-app/arcpy/get-started/reading-geometries.htm)
在这里插入图片描述
下面的代码用于计算一个线要素类中所有线要素的总长度

import arcpy
fc="D:/PythonforArcGIS/study/shapefile/roadrail/roa_4m.shp"
cursor=arcpy.da.SearchCursor(fc,["SHAPE@LENGTH"])
length=0
for row in cursor:
    length+=row[0]
print length

运行结果
在这里插入图片描述
与Arcmap中的汇总结果一致
在这里插入图片描述
2.读取几何
要素类中的每一个要素都包含一组用来定义点、线和多边形的折点。在点要素类中,一个点要素代表一个折点。
(可以理解为线要素是由多个折点连线组成,面要素是多个折点连线形成的闭合多边形组成)
可以通过搜索游标访问上述折点。访问点要素时会返回一个点对象;访问其他类型要素(线、多边形、多点)时,将返回一个点对象数组。如果要素包含多个部分,则返回一个包含多个点对象数组的数组(也就是一个更高维的数组)。
下面的例子将使用游标搜索一个点要素的每个点的坐标

import arcpy
fc="D:/PythonforArcGIS/study/shapefile/roadrail/point.shp"
cursor=arcpy.da.SearchCursor(fc,["SHAPE@XY"])
for row in cursor:
    x,y=row[0]
    print ("{0},{1}".format(x,y))

返回结果为
仅为部分
在最后的输出代码那里用到了format 格式化函数,可结合下图的实例(https://www.runoob.com/python/att-string-format.html)进行理解,也可自行百度。
在这里插入图片描述
点要素类相对简单,因为每个要素只有一个点对象。对于其他类型的要素类,如线、多边形,访问其中每个要素都会返回一个点对象数组。因此,一次循环时不够的,需要两次。
第一个for用来遍历shp中的行对象。(比如一个面状的shp中往往包含多个多边形,所以第一个for就是来先循环这些大的)第二个for来遍历每一个线或多边形中的折点。

下面这个例子就是用到这个思路来获取线要素的折点坐标。第一个循环用于遍历shp中的行对象。在每一行中,需要输出OID(对象标识符)字段,用于指明每一个点对象数组的起始位置和结束为止。可以用到getPart来获取几何图形第一部分的点对象数组。

import arcpy
fc="D:/PythonforArcGIS/study/shapefile/roadrail/roa_4m.shp"
cursor=arcpy.da.SearchCursor(fc,["OID@","SHAPE@"])
for row in cursor:
    print ("Feature{0}:".format(row[0]))
    for point in row[1].getPart(0):
        print ("{0},{1}".format(point.X,point.Y))

输出结果如下
在这里插入图片描述
在这里插入图片描述
可以看到一共有150个要素,这与在Arcmap中属性表看到的一样
在这里插入图片描述
该脚本中,getPart方法使用的索引值为0。这时getPart只返回几何对象的第一部分。对于一般的(单部分)要素类,第一部分也是它仅有的部分。若没有索引值,getPart将返回一个包含所有点对象数组的数组。

3.处理多部分要素
要素类中的要素可以分为多个部分,我们将其称为多部分要素。即,由多个部分组成,但只共享一组属性的要素。
可以使用Describe函数中的shapeType属性来确定一个要素类是否为多部分要素。shapeType的有效返回值是Point、Polyline、Polygon、Multipoint和Multipatch,其中Multipatch表示三维数据。几何对象的isMultipart属性可以用来确定某个要素是否为多部分的。partCount属性将返回组成某个要素所有部分的数目。
下面代码说明了如何访问多部分的线要素和多边形要素类:

import arcpy
fc="D:/PythonforArcGIS/study/shapefile/roadrail/hk.shp"
cursor=arcpy.da.SearchCursor(fc,["OID@","SHAPE@"])
for row in cursor:
    print ("Feature {0}:".format(row[0]))
    partnum=0
    for part in row[1]:
        print ("Part{0}:".format(partnum))
        for point in part:
            print ("{0},{1}".format(point.X,point.Y))
        partnum+=1

因缺少多部分要素的shp文件,该代码仅供示意。
该脚本中有3次循环,第1次循环是遍历shp中要素的个数(即显示在属性表中的个数),第2个循环是在判断显示在属性表中的一行要素是否由多部分要素组成,第3个循环就是分别打印出点坐标。

4.处理有孔洞的多边形
如果一个多边形包含孔洞,说明这个多边形包含很多环:以一个外环和若干个内环。环是定义在二维平面上的闭合路径。顺时针定义的是一个外部环,逆时针定义的是一个内部环。
对于一个有孔洞的多边形,先返回外环,其次返回所有内环。环与环之间用空的点对象分开。
这个的脚本和之前读取多部分要素的脚本很相似。只需要将第3个for循环替换为下面的代码即可:

        for point in part:
            if point:
                print ("{0},{1}".format(point.X,point.Y))
            else :
                print "Interior Ring"
        partnum+=1

这段代码的意思是,如果part没有孔洞,则不会有空的点对象进行分隔,这时直接输出点坐标即可,如有孔洞,则会先读到一个空值,输出interior Ring,然后下一个就是内环的点坐标。
输出结果如图:
在这里插入图片描述
在这里插入图片描述
5.使用游标设置空间参考
空间参考并非必选项,若要素类中没有设置空间参考,其空间参考的值为unknown。此时,可以使用Define Projection工具来定义该要素类的空间参考。
可以在搜索游标上设置空间参考。如果搜索游标的空间参考与要素类的空间参考不一致,那么搜索游标会将要素类的空间参考哦啊转换为游标的空间参考。
下面的例子是以十进制的形式输出一个采用了国家平面坐标系的点要素类的x,y坐标。SearchCursor函数是用来在国家平面坐标系上创建一个只读游标,但这个游标的空间参考要设置为以十进制表示的地理坐标系。代码如下:

import arcpy
fc="D:/PythonforArcGIS/study/shapefile/roadrail/roa_4m.shp"
prj="D:/PythonforArcGIS/study/NAD1983.prj"
spatialref=arcpy.SpatialReference(prj)
cursor=arcpy.da.SearchCursor(fc,["SHAPE@XY"],"",spatialref)
#使用open函数创建一个输出文件。通过读写模式打开,然后可以写入新代码行
output=open("result.txt","w")
#遍历行,为每行创建一个几何对象,使用write方法把x,y坐标写入输出文件中
for row in cursor:
    point=row[0]
    output.write(str(point[0])+" "+str(point[1])+"\n")
    print point
output.close()

修改后的坐标信息被储存到了result.txt的文件中
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/c6983127/article/details/108023290