应用场景:管线等线数据的Z值设置,不像面或点要素,一个点要素有N的节点,Z值可能都不同。比如一根管线可能有beginHeight和endHeight,所以其实如果需要准确设置,是需要获取到线的所有节点,然后设置对应的Z值的。
另外,如果已经获取到的线要素是没有Z值的,是在ArcMap创建的,并且没有开启Z值,那就可以先使用工具,先把Z值启用出来。
解决方法
通过写ArcPy脚本解决。
参考资料
- 官网读取几何等:
https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/get-started/reading-geometries.htm - 更改点的坐标:https://blog.csdn.net/A873054267/article/details/85234304
- 更改线的坐标:
https://www.cnblogs.com/beautifulplanet/p/4317724.html - 面要素更新Z参考:
https://gis.stackexchange.com/questions/135916/how-to-update-the-z-value-using-an-updatecursor
代码
以下示例为给一条线要素的每个点Z值都增加20米:
import arcpy
infc = "C:\\Users\\Priva\\Documents\\ArcGIS\\Projects\\MyProject26\\MyProject26.gdb\\testline"
cur= arcpy.UpdateCursor(infc)
SR= arcpy.Describe(infc).spatialReference
#循环每一行的每一个线要素
for row in cur:
new_point = arcpy.Point()
new_array = arcpy.Array()
#获取线的几何对象geometry对象
line_geom=row.getValue('shape')
print(line_geom)
#获取到线要素中的每一个点
array = line_geom.getPart(0)
print(array)
#逐点处理,Z值+20
for x in range(0,array.count):
old_point = array[x]
newZ = old_point.Z+20
new_point = arcpy.Point(old_point.X,old_point.Y,newZ)
new_array.add(new_point)
#利用新的坐标点array创建新的线geometry对象
new_line = arcpy.Polyline(new_array,SR)
new_array.removeAll()
print(1111)
#更新每一行的线要素
row.setValue("SHAPE",new_line)
cur.updateRow(row)
new_line = None
del row,cur