arcgis的arcpy写入几何怎么创建一个空心面要素并读取几何和属性信息

转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/83861447

 

路漫漫其修远兮,经过不懈的摸索,终于找到了一个解决办法。

做这个肯定要参考官方文档,下面附上两个链接,是arcpy的读取几何和写入几何。

http://pro.arcgis.com/zh-cn/pro-app/arcpy/get-started/reading-geometries.htm

http://pro.arcgis.com/zh-cn/pro-app/arcpy/get-started/writing-geometries.htm

本机是arcgis 10.2的,但是代码可以直接使用。

import arcpy
import os

fc=r"C:\Users\admin\Desktop\test.gdb\d134"  #这是在已有gdb路径内新建一个要素类
coords_list = [[1, 123.1, 32.1], 
               [1, 123.5, 32.1],
               [1, 123.5, 32.5],
               [1, 123.1, 32.5],
               [1, 123.1, 32.1],
               [1, 123.2, 32.2],
               [1, 123.3, 32.3],
               [1, 123.2, 32.3],
               [1, 123.2, 32.2]]
cur=None

try:
    arcpy.CreateFeatureclass_management(os.path.dirname(fc),os.path.basename(fc),"POLYGON")
    cur=arcpy.da.InsertCursor(fc,["shape@"])
    array=arcpy.Array()
    ID=-1
    for coords in coords_list:
        if ID ==-1:
            ID=coords[0]
        if ID!=coords[0]:
            cur.insertRow([arcpy.Polygon(array)])
            array.removeAll()
        array.add(arcpy.Point(coords[1],coords[2],ID=coords[0]))
        ID=coords[0]
    cur.insertRow([arcpy.Polygon(array)])
except Exception as e:
    print(e)
finally:
    if cur:
        del cur

运行结果如下:

由此可见,只要我们把点的序列做好即可。

(下述仅针对较为简单的空心面,若多个或点序较为复杂则根据此方案可能得到预料之外的结果。复杂的几何可移步:https://blog.csdn.net/dugushangliang/article/details/100572453

上文的读取几何网页里说:环是一个用于定义二维区域的闭合路径。有效的环是由有效路径组成的,因而环的起点和终点具有相同的 x,y 坐标。顺时针环是外部环,逆时针环则定义内部环。

点的顺序怎么做?

先做出这个空心面的外环的点,要有始有终,比如我这个图形的外环是四个端点,那么就给出五个点,即这个外环的第一个点和最后一个点的数组是完全相同的。紧接着就给出内环的点序列。如果是多个点序列,则除了最后一个序列,其他的也是要和外环一样有始有终。至于最后一个要不要有始有终呢?经我试验,在某些情况下最后一个的缺省可以达到我们的要求,但有时候不会。请看下图:

稳妥起见还是有始有终,以免操作不当,没意识到逻辑不对,就不到我们想要的了。

什么是有始有终?

比如上图,根据esri的推荐,外环顺时针内环逆时针,点序列需要是:1,2,3,4,1,5,7,6,5

 

怎么读取呢?

with arcpy.da.SearchCursor(fc,['SHAPE@']) as cursor:
    for row in cursor:
        for pnt in row[0]:
            for pi in pnt:
                if pi:
                    print("{}, {}".format(pi.X, pi.Y))
                else:
                    print("Interior Ring:")

我们可以看到,读取的经纬度和我们输入的经纬度有些差别,这个打点是有容差的。另一个,不管我们是怎么输入的点序列,输出的时候,外环的点序是顺时针的,内环的点序是逆时针的。

2019年6月21日增补:

with arcpy.da.SearchCursor(fc,['SHAPE@','OID@','selfField']) as cursor:
    for row in cursor:
        #下面输出属性
        print row[1],row[2]
        #下面输出几何信息
        for pnt in row[0]:
            for pi in pnt:
                if pi:
                    print("{}, {}".format(pi.X, pi.Y))
                else:
                    print("Interior Ring:")

2019年9月5日增补:

把第一篇代码中的coords_list换成下面的,再执行。

coords_list = [[1, 123.1, 32.1], 
               [1, 123.5, 32.1],
               [1, 123.5, 32.5],
               [1, 123.1, 32.5],
               [1, 123.1, 32.1],
               [1, 123.2, 32.2],
               [1, 123.3, 32.3],
               [1, 123.2, 32.3],
               [1, 123.2, 32.2],
               [1, 123.4, 32.4],
               [1, 123.3, 32.4],
               [1, 123.4, 32.3],
               [1, 123.4, 32.4]]

得图如下,上面这个列表中的点序是:1/2/3/4/1/5/7/6/5/9/10/8/9,依照本例推荐的操作(即:闭环,有始有终),未发现评论区所说多个空心出现问题的现象。

2019年9月6日:

根据评论区所说的点序列:

coords_list = [
	[1, 123.1, 32.1],
	[1, 123.5, 32.1],
	[1, 123.5, 32.5],
	[1, 123.1, 32.5],
	[1, 123.1, 32.1],
	[1, 123.2, 32.2],
	[1, 123.3, 32.3],
	[1, 123.2, 32.3],
	[1, 123.2, 32.2],
	[1, 123.4, 32.4],
	[1, 123.3, 32.4],
	[1, 123.4, 32.3],
	[1, 123.4, 32.4],
	[1, 123.30, 32.13],
	[1, 123.44, 32.12],
	[1, 123.38, 32.23],
	[1, 123.30, 32.13]
]

执行结果如下:

这也成了多部件要素了。

所以对于复杂的几何,需要有另外的操作,请移步https://blog.csdn.net/dugushangliang/article/details/100572453

 

独孤尚良dugushangliang——著

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值