使用Python循环从点创建Polyline要素:无报错但未生成要素
问题分析与解决方案
你的代码未生成Polyline要素,核心存在几个关键问题,以下是问题拆解和修正方案:
主要问题点
- 游标使用错误:旧版
InsertCursor仅创建一个feat对象循环复用,无法正确写入多条要素;推荐使用更高效的arcpy.da.InsertCursor。 - 文件读取逻辑缺陷:
for line in f结合next(f)会跳过部分行,导致坐标对处理不完整,奇数行时触发异常但未做有效处理。 - 冗余代码干扰:
featureList变量未实际参与要素创建,属于无效代码。
修正后的代码(按连续两点生成单条线段)
import arcpy arcpy.env.overwriteOutput = 1 outFolder = r'C:\Temp' fc = 'PolylineCSV.shp' spatRef = arcpy.SpatialReference(4326) # 创建Polyline要素类 arcpy.CreateFeatureclass_management(out_path=outFolder, out_name=fc, geometry_type='POLYLINE', spatial_reference=spatRef) # 使用数据访问模块游标(效率更高、语法更简洁) with arcpy.da.InsertCursor(fc, ['SHAPE@']) as cursor: coordinateList = r"C:\Temp\LatLongs.txt" with open(coordinateList) as f: # 读取所有非空行 valid_lines = [line.strip() for line in f if line.strip()] # 每两行一组生成一条Polyline for i in range(0, len(valid_lines)-1, 2): # 解析当前行坐标 curr_split = valid_lines[i].split(',') x1 = float(curr_split[2]) y1 = float(curr_split[1]) # 解析下一行坐标 next_split = valid_lines[i+1].split(',') x2 = float(next_split[2]) y2 = float(next_split[1]) # 创建点数组与Polyline point_array = arcpy.Array() point_array.add(arcpy.Point(x1, y1)) point_array.add(arcpy.Point(x2, y2)) polyline = arcpy.Polyline(point_array, spatRef) # 插入要素 cursor.insertRow([polyline])
可选:按唯一标识符分组生成Polyline
如果你的需求是同一ID的所有点组成一条线,使用以下代码:
import arcpy from collections import defaultdict arcpy.env.overwriteOutput = 1 outFolder = r'C:\Temp' fc = 'PolylineCSV.shp' spatRef = arcpy.SpatialReference(4326) arcpy.CreateFeatureclass_management(out_path=outFolder, out_name=fc, geometry_type='POLYLINE', spatial_reference=spatRef) # 按ID分组存储点坐标 id_point_map = defaultdict(list) coordinateList = r"C:\Temp\LatLongs.txt" with open(coordinateList) as f: for line in f: line = line.strip() if not line: continue split_line = line.split(',') point_id = split_line[0] x = float(split_line[2]) y = float(split_line[1]) id_point_map[point_id].append(arcpy.Point(x, y)) # 插入分组后的Polyline要素 with arcpy.da.InsertCursor(fc, ['SHAPE@']) as cursor: for points in id_point_map.values(): if len(points) >= 2: # 至少两个点才能组成线 point_array = arcpy.Array(points) polyline = arcpy.Polyline(point_array, spatRef) cursor.insertRow([polyline])
关键改进说明
- 使用
arcpy.da.InsertCursor:ArcPy官方推荐的高效游标,无需手动创建行对象,直接传递要素几何即可完成插入。 - 优化文件读取:先过滤空行再批量处理,避免行跳过问题,逻辑更稳定。
- 明确空间参考:创建Polyline时指定空间参考,确保几何对象的空间属性正确。
- 清理冗余代码:移除未使用的变量,简化代码逻辑。
内容的提问来源于stack exchange,提问作者asmi
相关产品推荐
相关产品推荐

