You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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])

关键改进说明

  1. 使用arcpy.da.InsertCursor:ArcPy官方推荐的高效游标,无需手动创建行对象,直接传递要素几何即可完成插入。
  2. 优化文件读取:先过滤空行再批量处理,避免行跳过问题,逻辑更稳定。
  3. 明确空间参考:创建Polyline时指定空间参考,确保几何对象的空间属性正确。
  4. 清理冗余代码:移除未使用的变量,简化代码逻辑。

内容的提问来源于stack exchange,提问作者asmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:25:22