arcgis的arcpy写入几何怎么创建一个空心面要素并读取几何和属性信息,根本不够管
这个我是没找到这个问题的答案,经过不懈的摸索,终于找到了一个解决办法。
做这个肯定要参考官方文档,下面附上两个链接,是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:")
我们可以看到,读取的经纬度和我们输入的经纬度有些差别,这个打点是有容差的。另一个,不管我们是怎么输入的点序列,输出的时候,外环的点序是顺时针的,内环的点序是逆时针的。
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:")
独孤尚良dugushangliang——著
---------------------
作者:独孤尚良dugushangliang