我有数百个裁剪后的栅格,需要使用python 2.7.13重新分类。当我测试其中的12个(包括四个空栅格)时,由于没有数据,脚本在空栅格上失败。
我尝试使用在这里找到的arcpy get raster属性和numpy数组语法跳过空栅格。...https://gis.stackexchange.com/questions/208519/skip-empty-rasters-in-arcgis
arcpy.env.workspace = work_dir
rasters = arcpy.ListRasters("*", "tif")
for file in rasters:
filename, ext = os.path.splitext(file)
yr_mo = filename[10:17]
pattern = '*clip*'
reclass_name = 'Burn_Scar_' + yr_mo + '_' + 'reclass' +'.tif'
## Testing with numpy unique array
array = arcpy.RasterToNumPyArray(file)
values = numpy.unique(array)
if file.endswith('.tif') and fnmatch.fnmatch(file,pattern):
if values > 1:
print values
## Testing with arcpy get raster properties
file_results = arcpy.GetRasterProperties_management(file, property_type="MAXIMUM")
file = file_results.getOutput(0)
if file_results > 1:
print file_results
else:
outReclass2 = Reclassify(file, "Value", RemapRange([[-2, 0, "NODATA"]]))
outReclass2.save(reclass_name)
print(reclass_name)
print ('skipping....' + file + 'raster is empty')
arcpy代码始终打印所有最大值-不仅仅是大于1的那些。
带有'ValueError'的numpy.unique(array)错误包含多个元素的数组的真值不明确。使用a.any()或a.all()。我很困惑a.any或a.all的含义以及为什么在其他问题语法中不需要它。
任何其他跳过空栅格并仅处理具有数据的栅格的简单方法,都值得赞赏!!谢谢!
答案 0 :(得分:0)
由于您没有提供示例输入,因此我将用自己的示例进行演示:
In [171]: arr = np.arange(10)
In [172]: values = np.unique(arr)
In [173]: values
Out[173]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [174]: values>1
Out[174]:
array([False, False, True, True, True, True, True, True, True,
True])
In [175]: if np.any(values>1):print(values)
[0 1 2 3 4 5 6 7 8 9]
如果unique
产生的数组包含多个元素,则values>1
是具有多个值的布尔数组。不能在if
条件下使用。
我们可以使用任何/全部将数组减小为1个布尔值。但这并不清楚您要做什么。