使用Python确定ASCII栅格数据集中的最小值和最大值吗?


12

我有一个ASCII格式的栅格数据集。使用Python,我需要确定数据集中的minmax值。有人告诉我,标题信息是关键,它包含行/列数,单元格大小等信息。

您不能简单地跳过标头信息并读取整个数据集以确定minmax值吗?

这就是我想要做的。我跳过了包含标题信息的前几行,并试图从那里开始确定值。以下是我所拥有的,但是由于我是Python的新手,因此需要一些指导。

raster_file = open('data.asc', 'r') # Open the file
data = raster_file.readlines()[4:] # Read the lines in the file, and skip the first six lines

for lines in data:
    print max(data) # Find the max value in data
    print min(data) # Find hte min value in data

有什么建议?


2
您正在使用开源还是ESRI堆栈?
黑暗

Answers:


12

您可以使用numpy。请参见下面的示例。考虑到没有数据值,可以生成一个numpy掩码数组。请参阅numpy帮助主题以获取mafromtxt和genfromtxt

Below is a small ascii file with a nodata value of -999

ncols          3
nrows          3
xllcorner      0
yllcorner      0
cellsize       1
NODATA_value   -999
0 1 2
-999 4 5 
6 7 8

>>> import numpy as np
>>> ascii_file = "c:/temp/Ascii_3x3_1nodata.asc"
>>> an_array = np.mafromtxt(ascii_file, 'float', '#', None, 6, None, '-999')

>>> print an_array

[[0.0 1.0 2.0]
 [-- 4.0 5.0]  
 [6.0 7.0 8.0]]

>>>

从那里确定您想要的统计信息只是一件事情

>>> print an_array.min()
0.0
>>> print an_array.max()
8.0
>>> print an_array.mean()
4.125
>>> 

谢谢你丹。我将尝试一下。是否有替代方法...也许没有numpy模块?
kaoscify

6

您需要栅格数据统计信息。
首先查看在gui中所做的事情(用于家庭作业)。

然后,您可以使用python窗口或脚本

import arcpy
arcpy.CalculateStatistics_management("c:/data/image.tif", "4", "6", "0;255;21")

计算统计信息后,您也始终可以通过栅格对象属性访问统计信息。例如r = arcpy.Raster(“ c:/data/image.tif”),r.mean,r.minimum,r.maximum
blord-castillo

@ blord-castillo酷!不知道 感谢您的提示:)
kaoscify 2011年

3
import sys

class Ascii_file(object):
    def __init__(self,file):
        self.raster_file = open(file, 'r') # Open the file
        self.max=sys.float_info.min
        self.min=sys.float_info.max
    def __minmax(self,value):
        if value>self.max:self.max=value
        if value<self.min:self.min=value
    def getMinMax(self):
        data = self.raster_file.readlines()
        data_values=data[6:]
        nodata=float(data[5].split()[1])
        for line in data_values:
            values=line.split(" ")
            for value in values:
                value=float(value)
                if value==nodata:continue
                else: self.__minmax(value)
        return self.min, self.max

if __name__=="__main__":
    myfile = Ascii_file('data.asc')
    print myfile.getMinMax()

这是我早些时候尝试过的,但是使用split方法AttributeError: 'list' object has no attribute 'split'
时却

我觉得在data = raster_file.readlines()[4:]指定范围时,该行实际上不起作用。我更正了先前评论中的错误。这是通过添加num = data[7]第三行来完成的。然后使用进行拆分values = num.split(),并能够找到最大值/最小值,但仅针对该特定行。如何从整个文档中找到最大值/最小值?
kaoscify 2011年

哦,我的错,“数据”是一个列表,“行”是字符串。我已经编辑了代码...我用一个asc文件对其进行了测试。只需复制粘贴,注意缩进即可。
巴勃罗(Pablo)

2
您可以if check==True通过初始化最小/最大值来删除该块。您需要将min初始化为sys.float_info.max,将max初始化为sys.float_info.min。
2011年

3
您必须将max初始化为sys.float_info.min,将min初始化为sys.float_info.max。您的初始最小值将是最大可能的值,与之比较的任何值都会较小,从而成为新的最小值。最大值也一样,它将是最小的可能值,与之比较的任何值都将更大,因此新的最大值将变为最大值。
Sasa Ivetic,2011年

1

如果您不想使用numpy(并且您确实应该使用numpy,则对这种事情非常理想),那么您将需要:

  • maximum变量初始化为非常大的负数,并将minimum变量初始化为非常大的正数
  • 拆分每行以获取字符串列表,并使用列表推导将其转换为浮点列表
  • 最后使用类似maximum = max(maximum, max(myfloatlist))的值作为最小值。

0

前几天我才这样做。我使用arcpy.RasterToNumPyArray,将numpy数组转换为列表,然后通过列表推导遍历列表以查找最小值和最大值。

import arcpy
import numpy
myArray = arcpy.RasterToNumPyArray(r"D:\NED_93512417\NED_93512417_3DEM_RPRJ.TIF")
p = myArray.tolist()

max_elev = max([item for sublist in p for item in sublist])
min_elev = min([item for sublist in p for item in sublist])

是不是myArray.min()/ myArray.max()更简单/更快?
Mike T

1
@Chad,如果您已经有了numpy数组,则无需转换为列表,只需在上面的线程中使用min(),max()等函数即可。您还要注意,未暗示对Arcpy的隐式访问。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.