将Python代码转换为ID并跳过空栅格失败的数字栅格语法

时间:2019-09-15 19:37:24

标签: python arrays numpy raster

我有数百个裁剪后的栅格,需要使用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的含义以及为什么在其他问题语法中不需要它。

任何其他跳过空栅格并仅处理具有数据的栅格的简单方法,都值得赞赏!!谢谢!

1 个答案:

答案 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个布尔值。但这并不清楚您要做什么。