ArcGIS10.5.1使用arcpy时自定义workspace变量路径不生效问题
问题:ArcPy ProjectRaster输出未写入指定工作空间
问题复现
使用如下ArcPy脚本执行DEM重投影时,工具可正常运行完成,但输出结果未存储到预先定义的工作空间路径,而是被保存到Windows当前用户目录下的temp临时文件夹:
import arcpy arcpy.env.overwriteOutput = True # Script arguments Input_dem = "E:\\OneDrive\\Academic\\PhD\\Philemon\\phase_3_(model)\\dem_raw\\Mago_raw.tif" Workspace = "E:\\OneDrive\\Academic\\PhD\\Philemon\\phase_3_(model)\\useful_data" Output_Coordinate_System = "PROJCS['WGS_1984_UTM_Zone_46N',GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],PARAMETER['False_Easting',500000.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',93.0],PARAMETER['Scale_Factor',0.9996],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]" # provide a default value if unspecified # Local variables: reprojected = "%Workspace%\\reprojected" # Process: Project Raster arcpy.ProjectRaster_management(Input_dem, reprojected, Output_Coordinate_System, "NEAREST", "87.6969856825158 87.6969856825151", "", "", "GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
已知设置arcpy.env.workspace可实现预期存储效果,需要找到不依赖该环境变量、让上述写法代码正常运行的方案。
根因分析
代码中reprojected = "%Workspace%\\reprojected"的%变量名%写法是ArcGIS ModelBuilder专属的占位符语法,该语法仅在ModelBuilder运行环境内会被自动解析替换为对应变量值,独立运行的Python解释器无法识别这类占位符。
实际运行时reprojected变量的值是字面量字符串%Workspace%\reprojected,属于无效相对路径,ArcPy无法解析该路径时,会自动将输出结果写入系统临时目录。
解决方法
无需设置arcpy.env.workspace,只需将占位符替换为Python原生的路径拼接写法即可,推荐两种实现方式:
- 直接字符串拼接,注意给输出栅格添加文件后缀(无后缀会默认生成ESRI GRID格式栅格):
reprojected = Workspace + "\\reprojected.tif"
- 使用
os.path模块拼接路径,可自动适配不同操作系统的路径分隔符,避免转义错误,兼容性更好:
# 脚本开头先导入os模块 import os reprojected = os.path.join(Workspace, "reprojected.tif")
修改后重新运行脚本,重投影结果就会正常保存到指定的Workspace目录下。
注意:所有从ModelBuilder导出的ArcPy脚本,其中
%变量名%格式的占位符都需要手动替换为Python原生变量引用写法,不能直接在独立Python环境中运行。
内容的提问来源于stack exchange,提问作者Nyigam Bole
相关产品推荐
相关产品推荐

