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

运行结果如下:

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

上文的读取几何网页里说:环是一个用于定义二维区域的闭合路径。有效的环是由有效路径组成的,因而环的起点和终点具有相同的 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:")

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

 

独孤尚良dugushangliang——著

转载自:https://blog.csdn.net/dugushangliang/article/details/83861447

You may also like...