arcpy.env.overwriteOutput = True

探讨如何使用 ArcPy 的环境设置中的 overwriteOutput 参数来覆盖已存在的输出文件,简化地理信息系统 (GIS) 数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


arcpy.env.overwriteOutput = True:输出文件夹里面已经有内容的,就覆盖掉。

 

import arcpy import os def batch_kml_to_shp(input_folder, output_folder, keep_intermediate=False): """ 批量将 KML 文件转换为 SHP 格式 :param input_folder: 包含 KML 文件的输入文件夹 :param output_folder: 输出 SHP 文件的目录 :param keep_intermediate: 是否保留中间文件 (默认 False) """ try: # 设置工作环境 arcpy.env.overwriteOutput = True # 创建临时地理数据库存放中间结果 temp_gdb = arcpy.CreateFileGDB_management( out_folder_path=output_folder, out_name="TempKMLConversion.gdb" )[0] # 遍历所有 KML 文件 kml_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.kml')] for kml_file in kml_files: try: kml_path = os.path.join(input_folder, kml_file) base_name = os.path.splitext(kml_file)[0] # 步骤 1: 将 KML 转换为图层文件 (临时地理数据库) arcpy.AddMessage(f"正在处理: {kml_file}") output_layer = os.path.join(temp_gdb, base_name) arcpy.KMLToLayer_conversion( kml_path, output_layer, "NO_GROUNDOVERLAY" ) # 步骤 2: 从地理数据库提取要素类 feature_classes = arcpy.ListFeatureClasses(f"{base_name}*", "ALL", output_layer) for fc in feature_classes: # 跳过注记和栅格图层 if "Placemarks" not in fc: continue # 步骤 3: 转换为 Shapefile shp_name = f"{base_name}_{fc.split('_')[-1]}.shp" shp_path = os.path.join(output_folder, shp_name) arcpy.FeatureClassToFeatureClass_conversion( os.path.join(output_layer, fc), output_folder, shp_name ) arcpy.AddMessage(f"已创建: {shp_name}") except Exception as e: arcpy.AddWarning(f"处理 {kml_file} 时出错: {str(e)}") # 清理中间文件 if not keep_intermediate: arcpy.Delete_management(temp_gdb) arcpy.AddMessage("已清理临时文件") except arcpy.ExecuteError: arcpy.AddError(arcpy.GetMessages(2)) except Exception as e: arcpy.AddError(f"脚本执行错误: {str(e)}") if __name__ == "__main__": # 脚本工具参数 input_folder = arcpy.GetParameterAsText(0) output_folder = arcpy.GetParameterAsText(1) keep_intermediate = arcpy.GetParameter(2) # 布尔型参数 batch_kml_to_shp(input_folder, output_folder, keep_intermediate)修复运行成果没有成果
06-15
import arcpy import os def batch_kml_to_shp(input_folder, output_folder, keep_intermediate=False): # 环境检查 arcpy.AddMessage("=== 环境验证 ===") arcpy.AddMessage(f"ArcGIS Pro版本: {arcpy.GetInstallInfo()['Version']}") # 路径验证 if not arcpy.Exists(input_folder): arcpy.AddError("错误: 输入文件夹不存在") return if not os.access(output_folder, os.W_OK): arcpy.AddError("错误: 输出文件夹不可写") return # 许可检查 if arcpy.CheckExtension("kml") != "Available": arcpy.AddError("错误: 缺少KML转换扩展许可") return else: arcpy.CheckOutExtension("kml") try: arcpy.env.overwriteOutput = True arcpy.AddMessage("环境设置完成") # 创建临时GDB temp_gdb_path = os.path.join(output_folder, "TempKMLConversion.gdb") if arcpy.Exists(temp_gdb_path): arcpy.Delete_management(temp_gdb_path) temp_gdb = arcpy.CreateFileGDB_management(output_folder, "TempKMLConversion.gdb")[0] arcpy.AddMessage(f"临时GDB创建于: {temp_gdb}") # 获取KML文件列表 kml_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.kml')] if not kml_files: arcpy.AddError("错误: 未找到KML文件") return arcpy.AddMessage(f"找到{len(kml_files)}个KML文件") for kml_file in kml_files: try: kml_path = os.path.join(input_folder, kml_file) base_name = os.path.splitext(kml_file)[0] # KML转换 output_layer = os.path.join(temp_gdb, base_name) arcpy.AddMessage(f"正在转换: {kml_file} → {output_layer}") arcpy.KMLToLayer_conversion(kml_path, output_layer, "NO_GROUNDOVERLAY") # 定位Placemarks要素类 arcpy.AddMessage("定位转换结果...") feature_classes = arcpy.ListFeatureClasses("*", "ALL", output_layer) placemarks = [fc for fc in feature_classes if "Placemarks" in fc] if not placemarks: arcpy.AddWarning(f"警告: {output_layer}中未找到Placemarks要素类") continue # 输出SHP for fc in placemarks: shp_name = f"{base_name}_{fc.split('_')[-1]}.shp" shp_path = os.path.join(output_folder, shp_name) arcpy.AddMessage(f"生成: {shp_name}") arcpy.FeatureClassToFeatureClass_conversion( os.path.join(output_layer, fc), output_folder, shp_name ) except arcpy.ExecuteError: arcpy.AddWarning(f"处理失败: {kml_file}\n{arcpy.GetMessages(2)}") except Exception as e: arcpy.AddWarning(f"未知错误: {kml_file}\n{str(e)}") finally: # 清理和许可归还 if not keep_intermediate and arcpy.Exists(temp_gdb_path): arcpy.Delete_management(temp_gdb_path) arcpy.AddMessage("临时文件已清理") arcpy.CheckInExtension("kml") arcpy.AddMessage("处理完成") if __name__ == "__main__": input_folder = arcpy.GetParameterAsText(0) output_folder = arcpy.GetParameterAsText(1) keep_intermediate = arcpy.GetParameter(2) batch_kml_to_shp(input_folder, output_folder, keep_intermediate)运行显示无kml许可但是用软件自带的kml转shp可以运行成功
06-15
# -*- coding: utf-8 -*- import arcpy import numpy as np from arcpy.sa import * # 启用Spatial Analyst许可 arcpy.CheckOutExtension("Spatial") # 设置环境 arcpy.env.workspace = r"D:\YourFolder" # 替换为你的实际路径 arcpy.env.overwriteOutput = True # 输入数据(检查是否存在) if not arcpy.Exists("light_pro.tif") or not arcpy.Exists("veg_stack.tif"): arcpy.AddError("输入栅格不存在!请检查文件名") else: light_raster = Raster("light_pro.tif") veg_raster = Raster("veg_stack.tif") # ===== 1. 计算相关系数栅格 ===== # 方法:使用局部统计(3x3窗口) try: arcpy.AddMessage("正在计算相关系数栅格...") out_corr = Correlate(light_raster, veg_raster, "Rectangle 3 3 CELL") # 修改为矩形窗口 out_corr.save("Correlation_1_2.tif") # ===== 2. 分类协同/权衡关系 ===== arcpy.AddMessage("正在进行分类...") corr_raster = Raster("Correlation_1_2.tif") out_class = Con( Abs(corr_raster) > 0.5, Con(corr_raster > 0, 1, 2), # 1=协同, 2=权衡 3 # 3=无显著相关 ) out_class.save("Final_Classification.tif") # ===== 3. 自动符号化 ===== mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd)[0] # 添加结果图层 result_layer = arcpy.mapping.Layer("Final_Classification.tif") arcpy.mapping.AddLayer(df, result_layer, "TOP") # 设置分类颜色 sym = result_layer.symbology sym.renderer = "Classified" sym.classificationField = "Value" sym.classBreakValues = [1, 2, 3] sym.classBreakLabels = ["协同", "权衡", "无显著相关"] # 使用预设色带(ArcMap 10.8自带) color_ramp = arcpy.mapping.ListColorRamps(mxd, "Yellow-Green-Light to Dark")[0] # 修改为存在的色带名 sym.colorRamp = color_ramp result_layer.symbology = sym # 刷新视图 arcpy.RefreshActiveView() arcpy.RefreshTOC() mxd.save() arcpy.AddMessage("处理成功!结果已保存为 Final_Classification.tif") except Exception as e: arcpy.AddError(f"处理失败: {str(e)}") # 释放许可 arcpy.CheckInExtension("Spatial")第65行有问题
06-28
# -*- coding: utf-8 -*- import arcpy import sys reload(sys) # Python 2.7 需要重载sys sys.setdefaultencoding("utf-8") # 解决中文路径问题[^3][^4] def intersect_layers(input_layers, output_feature_class): """ 执行多个图层的相交操作(适配ArcGIS 10.8) :param input_layers: 输入图层路径列表 :param output_feature_class: 输出要素类完整路径 """ # 1. 坐标系检查(关键步骤) first_ref = arcpy.Describe(input_layers[0]).spatialReference for i, layer in enumerate(input_layers[1:]): layer_ref = arcpy.Describe(layer).spatialReference if first_ref.name != layer_ref.name: arcpy.AddWarning("坐标系不匹配: {} ({}) vs {} ({})".format( input_layers[0], first_ref.name, layer, layer_ref.name )) # 自动投影到第一个图层的坐标系 projected = "in_memory/projected_{}".format(i) arcpy.Project_management(layer, projected, first_ref) input_layers[i+1] = projected # 替换为投影后的临时图层 # 2. 构建相交输入格式 in_features = [[layer, ""] for layer in input_layers] # 3. 执行相交分析 arcpy.Intersect_analysis( in_features=in_features, out_feature_class=output_feature_class, join_attributes="ALL", cluster_tolerance="", output_type="INPUT" ) return output_feature_class def add_layer_to_map(output_path): """将结果图层添加到当前地图""" aprx = arcpy.mp.ArcGISProject("CURRENT") active_map = aprx.activeMap active_map.addDataFromPath(output_path) arcpy.AddMessage(u"结果已添加到当前地图: {}".format(output_path)) if __name__ == "__main__": try: # ========== 环境初始化 ========== arcpy.env.overwriteOutput = True arcpy.AddMessage(u"工具初始化完成") # ========== 许可检查 ========== if arcpy.CheckExtension("3D") == "Available": arcpy.CheckOutExtension("3D") arcpy.AddMessage(u"3D Analyst 许可已启用") else: raise Exception(u"3D Analyst 许可不可用") # ========== 参数获取 ========== input_layers_str = arcpy.GetParameterAsText(0) # 多值输入参数 output_feature_class = arcpy.GetParameterAsText(1) # 输出路径 # 拆分多值参数(分号分隔) input_layers = [lyr.strip() for lyr in input_layers_str.split(";")] arcpy.AddMessage(u"输入图层数: {}".format(len(input_layers))) # ========== 输入验证 ========== if len(input_layers) < 2: raise ValueError(u"需要至少两个输入图层") for layer in input_layers: if not arcpy.Exists(layer): raise IOError(u"图层不存在: {}".format(layer)) # ========== 工作空间设置 ========== # 从输出路径提取工作空间[^3] workspace = os.path.dirname(output_feature_class) if not workspace: workspace = arcpy.env.workspace or "in_memory" arcpy.env.workspace = workspace.replace("\\", "/") # 路径标准化[^3] arcpy.AddMessage(u"工作空间: {}".format(arcpy.env.workspace)) # ========== 执行相交操作 ========== result = intersect_layers(input_layers, output_feature_class) # ========== 结果验证 ========== count = int(arcpy.GetCount_management(result).getOutput(0)) arcpy.AddMessage(u"输出要素数量: {}".format(count)) # ========== 添加到地图 ========== add_layer_to_map(result) arcpy.SetParameterAsText(2, result) # 设置输出参数 arcpy.AddMessage(u"相交操作成功完成!") except arcpy.ExecuteError: err = arcpy.GetMessages(2) arcpy.AddError(u"地理处理错误: {}".format(err.decode('utf-8'))) except Exception as e: arcpy.AddError(u"错误: {}".format(str(e).decode('utf-8'))) # 获取错误行号 exc_type, exc_obj, exc_tb = sys.exc_info() arcpy.AddError(u"错误行号: {}".format(exc_tb.tb_lineno)) finally: # ========== 清理资源 ========== arcpy.CheckInExtension("3D") arcpy.AddMessage(u"3D Analyst 许可已释放") arcpy.Delete_management("in_memory") # 清理临时数据 这个代码里的参数怎么设置
最新发布
07-09
import arcpy import os def intersect_layers(input_layers, output_feature_class): """ 执行多个图层的相交操作 :param input_layers: 输入图层列表 :param output_feature_class: 输出要素类路径 """ # 构建相交工具所需的输入格式 in_features = [[layer, ""] for layer in input_layers] # 执行相交分析 arcpy.Intersect_analysis( in_features=in_features, out_feature_class=output_feature_class, join_attributes="ALL", cluster_tolerance="", output_type="INPUT" ) return output_feature_class def add_layer_to_map(output_path): """将结果图层添加到当前地图""" aprx = arcpy.mp.ArcGISProject("CURRENT") active_map = aprx.activeMap active_map.addDataFromPath(output_path) arcpy.AddMessage("结果已添加到当前地图: {}".format(output_path)) if __name__ == "__main__": # 设置环境 arcpy.env.overwriteOutput = True try: # 获取输入参数 input_layers_str = arcpy.GetParameterAsText(0) # 多个输入图层(分号分隔) output_feature_class = arcpy.GetParameterAsText(1) # 输出要素类路径 # 拆分多值参数为图层列表(修正缩进) input_layers = input_layers_str.split(";") if input_layers_str else [] # 验证至少有两个输入图层 if len(input_layers) < 2: arcpy.AddError("需要至少两个输入图层进行相交操作!") raise ValueError("需要至少两个输入图层") # 验证所有输入图层存在 for layer in input_layers: if not arcpy.Exists(layer): arcpy.AddError(f"输入图层不存在: {layer}") raise FileNotFoundError(f"图层 {layer} 不存在") # 调用相交函数 result = intersect_layers(input_layers, output_feature_class) # 将结果添加到地图 add_layer_to_map(result) arcpy.AddMessage("相交操作成功完成!") arcpy.AddMessage(f"输入图层数: {len(input_layers)}") arcpy.AddMessage(f"输出结果: {result}") except arcpy.ExecuteError: arcpy.AddError("工具执行错误: " + arcpy.GetMessages(2)) except Exception as e: arcpy.AddError("发生错误: " + str(e)) 在此基础帮我看看我的代码=都缺少什么,我是用的是10.8版本
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值