'Array' object has no attribute 'touches'
时间: 2023-07-23 15:10:42 浏览: 83
抱歉,我之前的代码有一个错误。在使用 `touches` 方法时,需要使用点几何对象来调用,而不是数组对象。以下是修正后的代码:
```python
import arcpy
# 设置工作空间
arcpy.env.workspace = r"D:\数据备份"
# 输入的线图层和点图层路径
line_shp = r"D:\数据备份\线.shp"
point_shp = r"D:\数据备份\点.shp"
# 创建一个内存中的副本用于编辑
line_copy = arcpy.CopyFeatures_management(line_shp, "in_memory\line_copy")
# 进行空间查询,找到线和点不重合的节点
arcpy.MakeFeatureLayer_management(line_copy, "line_lyr")
arcpy.MakeFeatureLayer_management(point_shp, "point_lyr")
arcpy.SelectLayerByLocation_management("line_lyr", "INTERSECT", "point_lyr", "", "NEW_SELECTION")
arcpy.SelectLayerByLocation_management("line_lyr", "WITHIN_A_DISTANCE", "point_lyr", "0.1 Meters", "SWITCH_SELECTION")
# 删除不重合的节点,但保留线的端点
with arcpy.da.UpdateCursor("line_lyr", ["SHAPE@"]) as cursor:
for row in cursor:
line_geom = row[0]
new_points = []
for pnt in line_geom.getPart(0):
if pnt.touches(point_shp) or pnt.firstPoint or pnt.lastPoint:
new_points.append(pnt)
new_line = arcpy.Polyline(arcpy.Array(new_points))
row[0] = new_line
cursor.updateRow(row)
# 保存修改后的线图层为"线2.shp"
arcpy.CopyFeatures_management("line_lyr", r"D:\数据备份\线2.shp")
# 删除临时图层
arcpy.Delete_management("in_memory")
print("处理完成!")
```
在这段修正后的代码中,我们使用 `line_geom.getPart(0)` 来获取线的几何对象中的点,并使用 `touches` 方法来判断点是否与点图层中的点相交。同时,我们保留线的第一个点和最后一个点。最后,将修改后的线图层保存为"线2.shp"。
请注意,以上代码假设您已经安装了ArcGIS软件,并且已经配置了ArcPy的环境。另外,确保输入的线图层和点图层文件存在,并且路径正确。
这段代码会在指定的路径下处理线图层和点图层,删除与点图层中的点不重合的节点,并保存修改后的线图层为"线2.shp"。同时保留线的端点。
阅读全文