Arcpy技术问题:如何将列表数据批量追加至边界要素
批量追加多行数据到ArcGIS边界要素的解决方法
问题描述
我编写了计算年度数据平均值的代码,生成了如下嵌套列表:
[['1988', 0.09680851063829785, 1.2444680851063827], ['1989', 0.2046808510638298, 1.0231914893617025]]
我希望将该数据追加至已有的边界要素中,但目前仅能添加第一行数据,现寻求实现批量追加多行数据的解决方法,当前使用的Arcpy代码如下:
# Add necessary fields if they don't already exist if not arcpy.ListFields(outlayer, "YEAR"): arcpy.AddField_management(outlayer, "YEAR", "SHORT") if not arcpy.ListFields(outlayer, "NITRATE"): arcpy.AddField_management(outlayer, "NITRATE", "FLOAT") if not arcpy.ListFields(outlayer, "AMMONIA"): arcpy.AddField_management(outlayer, "AMMONIA", "FLOAT") print(f"Processing boundary data for '{outlayer}'...") # Update the feature layer with data from ndata with arcpy.da.UpdateCursor(outlayer, ['YEAR', 'NITRATE', 'AMMONIA']) as cursor: for row, yearly_avg in zip(cursor, ndata): year_value = yearly_avg[0] no3_value = yearly_avg[1] nh4_value = yearly_avg[2] # Update cursor row with new values row[0] = year_value row[1] = no3_value row[2] = nh4_value # Update the row in the feature layer cursor.updateRow(row)
问题原因
你当前使用的UpdateCursor是用来更新现有要素行的工具,并非追加新行。zip(cursor, ndata)会把现有要素的每一行和ndata的每一行一一对应更新,如果现有要素只有1行,那只会处理这1行,剩下的ndata数据不会被添加。
解决方法:用InsertCursor批量插入新行
要实现批量追加多行数据,应该使用arcpy.da.InsertCursor,它专门用于向要素类中插入新记录。修改后的代码如下:
# 添加必要字段(如果不存在) if not arcpy.ListFields(outlayer, "YEAR"): arcpy.AddField_management(outlayer, "YEAR", "SHORT") if not arcpy.ListFields(outlayer, "NITRATE"): arcpy.AddField_management(outlayer, "NITRATE", "FLOAT") if not arcpy.ListFields(outlayer, "AMMONIA"): arcpy.AddField_management(outlayer, "AMMONIA", "FLOAT") print(f"正在处理边界数据:'{outlayer}'...") # 用InsertCursor批量插入新行 with arcpy.da.InsertCursor(outlayer, ['YEAR', 'NITRATE', 'AMMONIA']) as cursor: for yearly_avg in ndata: # 将字符串年份转为整数,匹配字段的SHORT类型 year_value = int(yearly_avg[0]) no3_value = yearly_avg[1] nh4_value = yearly_avg[2] # 插入新记录 cursor.insertRow([year_value, no3_value, nh4_value]) print(f"成功向'{outlayer}'添加{len(ndata)}条记录")
关键说明
InsertCursor不需要对应现有行,直接遍历ndata的每一项,调用insertRow()即可插入新记录。- 原数据中的年份是字符串类型,必须转换成
int类型才能匹配字段定义的SHORT类型,避免类型错误。 - 如果需要同时完成「更新现有行+追加新行」的操作,可以先通过
UpdateCursor检查现有要素中是否存在对应年份的行,存在则更新,不存在则用InsertCursor插入。
内容的提问来源于stack exchange,提问作者Ashlee
相关产品推荐
相关产品推荐

