Menentukan nilai min dan maks dalam dataset ASCII raster menggunakan Python?

12

Saya memiliki dataset raster dalam format ASCII. Menggunakan Python, saya perlu menentukan mindan maxnilai - nilai di dalam dataset. Saya telah diberitahu bahwa informasi header adalah kunci, yang berisi hal-hal seperti jumlah baris / kolom, ukuran sel, dan lain-lain.

Tidak bisakah Anda melewatkan informasi header dan membaca seluruh dataset untuk menentukan nilai min- maxnilainya?

Inilah yang saya coba lakukan. Saya melewatkan beberapa baris pertama yang berisi informasi header, dan mencoba menentukan nilai dari sana. Berikut ini adalah jenis dari apa yang saya miliki, tetapi perlu bimbingan karena saya baru di 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

Ada saran?

kaoscify
sumber
2
Apakah Anda menggunakan sumber terbuka atau tumpukan ESRI?
underdark

Jawaban:

12

Anda bisa menggunakan numpy. Lihat contoh di bawah ini. Array bertopeng numpy dapat dihasilkan akuntansi untuk nilai tidak ada data. Lihat topik bantuan numpy untuk mafromtxt dan 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]]

>>>

dari sana hanya masalah menentukan statistik yang Anda inginkan

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

sumber
Terima kasih Dan. Saya akan mencoba ini. Apakah ada cara alternatif ... mungkin tanpa modul numpy?
kaoscify
6

Anda ingin statistik data raster.
Lihat apa yang Anda lakukan di gui dulu (untuk pekerjaan rumah.)

Kemudian Anda dapat menggunakan jendela python atau skrip .

import arcpy
arcpy.CalculateStatistics_management("c:/data/image.tif", "4", "6", "0;255;21")
Brad Nesom
sumber
Setelah Anda menghitung statistik, Anda selalu dapat mengakses statistik melalui properti objek raster juga. misal r = arcpy.Raster ("c: /data/image.tif"), r.mean, r.minimum, r.maximum
blord-castillo
@ blord-castillo Keren! Tidak tahu itu. Terima kasih atas tipnya :)
kaoscify
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()
Pablo
sumber
Ini adalah jenis yang saya coba sebelumnya, tetapi saya terus mendapatkan kesalahan ketika saya menggunakan metode split:AttributeError: 'list' object has no attribute 'split'
kaoscify
Saya merasa garis data = raster_file.readlines()[4:]tersebut tidak benar-benar berfungsi ketika menentukan rentang. Saya memperbaiki kesalahan yang saya alami di komentar sebelumnya. Ini dilakukan dengan menambahkan num = data[7]di baris ke-3. Itu kemudian dipisah menggunakan values = num.split()dan mampu menemukan max / min, tetapi untuk jalur tertentu saja. Bagaimana saya dapat menemukan maks / mnt dari seluruh dokumen?
kaoscify
oh, kesalahan saya, "data" adalah daftar, "baris" adalah string. Saya telah mengedit kode ... Saya mengujinya dengan file asc. Cukup salin dan tempel, perhatikan lekukannya.
Pablo
2
Anda dapat menjatuhkan if check==Trueblok dengan menginisialisasi nilai min / maks Anda. Anda ingin menginisialisasi min ke sys.float_info.max dan maks ke sys.float_info.min.
Sasa Ivetic
3
Anda harus menginisialisasi max ke sys.float_info.min, dan min ke sys.float_info.max. Bahwa Anda min awal Anda akan menjadi nilai terbesar yang mungkin, dan nilai apa pun yang Anda bandingkan dengan itu akan lebih kecil, dan dengan demikian menjadi min baru. Sama halnya dengan nilai maks Anda, itu akan menjadi nilai sekecil mungkin, dan nilai apa pun yang Anda bandingkan akan lebih besar, dan dengan demikian maks baru.
Sasa Ivetic
1

Jika Anda tidak ingin menggunakan numpy (dan memang seharusnya begitu, sangat cocok untuk hal semacam ini), maka Anda perlu:

  • inisialisasi maximumvariabel Anda ke angka negatif yang sangat besar dan minimumvariabel Anda ke angka positif yang sangat besar
  • bagi setiap baris untuk mendapatkan daftar string dan gunakan pemahaman daftar untuk mengubahnya menjadi daftar pelampung
  • akhirnya menggunakan sesuatu seperti maximum = max(maximum, max(myfloatlist))dan setara untuk nilai minimum.
MerseyViking
sumber
0

Saya baru saja melakukannya kemarin. Saya menggunakan arcpy.RasterToNumPyArray, mengkonversi array numpy ke daftar, lalu mengulangi daftar saya melalui daftar pemahaman untuk menemukan nilai min dan max.

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])
Chad Cooper
sumber
bukan myArray.min()/ myArray.max()lebih sederhana / lebih cepat?
Mike T
1
@Chad, jika Anda sudah memiliki array numpy, maka tidak perlu mengkonversi ke daftar, cukup gunakan fungsi min (), max () dll di utas saya di atas. Seperti yang Anda perhatikan, tidak ada akses tersirat ke Arcpy ditunjukkan.