Determinare i valori minimo e massimo in un set di dati raster ASCII usando Python?


12

Ho un set di dati raster in formato ASCII. Usando Python, devo determinare i valori mine maxall'interno del set di dati. Mi è stato detto che le informazioni di intestazione sono fondamentali, che contengono elementi come il numero di righe / colonne, dimensioni delle celle e così via.

Non puoi semplicemente saltare le informazioni dell'intestazione e leggere l'intero set di dati per determinare i valori mine max?

Questo è quello che sto cercando di fare. Sto saltando la prima coppia di righe che contengono le informazioni di intestazione e provo a determinare i valori da lì in poi. Quello che segue è una specie di quello che ho, ma ho bisogno di una guida dato che sono nuovo 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

Eventuali suggerimenti?


2
Stai usando uno stack open source o ESRI?
underdark

Risposte:


12

Puoi usare numpy. Vedi l'esempio sotto. Un array mascherato intorpidito può essere generato tenendo conto dei valori di nessun dato. Vedere l'argomento della guida numpy per mafromtxt e 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]]

>>>

da lì è semplicemente una questione di determinare le statistiche desiderate

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

Grazie Dan. Ci proverò. C'è un modo alternativo ... forse senza il modulo intorpidito?
Kaoscify,

6

Vuoi statistiche sui dati raster.
Guarda prima cosa stai facendo nella gui (per i compiti.)

Quindi puoi usare una finestra di Python o uno script .

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

Dopo aver calcolato le statistiche, puoi sempre accedere alle statistiche anche tramite la proprietà dell'oggetto raster. es. r = arcpy.Raster ("c: /data/image.tif"), r.mean, r.minimum, r.ma maximum
blord-castillo,

@ blord-castillo Cool! Non lo sapevo. Grazie per la punta :)
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()

Questo è un po 'quello che stavo provando prima, ma continuo a ricevere errori quando uso il metodo split:AttributeError: 'list' object has no attribute 'split'
kaoscify

Sento che la linea in data = raster_file.readlines()[4:]realtà non funziona quando si tratta di specificare l'intervallo. Ho corretto l'errore che avevo riscontrato nel commento precedente. Questo è stato fatto aggiungendo num = data[7]nella terza riga. È stato quindi diviso usando values = num.split()ed è stato in grado di trovare il massimo / minimo, ma solo per quella particolare riga. Come posso trovare il massimo / minimo dell'intero documento?
Kaoscify,

oh, mio ​​errore, "data" è un elenco, "righe" è la stringa. Ho modificato il codice ... L'ho provato con un file asc. Basta copiare e incollare, prestare attenzione al rientro.
Pablo,

2
È possibile eliminare il if check==Trueblocco inizializzando i valori min / max. Ti consigliamo di inizializzare min su sys.float_info.max e max su sys.float_info.min.
Sasa Ivetic,

3
Devi inizializzare max su sys.float_info.min e min su sys.float_info.max. Che il tuo min iniziale sarà il valore più grande possibile, e qualsiasi valore che confronterai con esso sarà più piccolo, e quindi diventerà il nuovo min. Lo stesso vale con il tuo valore massimo, sarà il valore più piccolo possibile e qualsiasi valore che confronterai sarà più grande, e quindi il nuovo valore max.
Sasa Ivetic,

1

Se non vuoi usare numpy (e dovresti davvero, è perfetto per questo genere di cose), allora dovrai:

  • inizializza la tua maximumvariabile su un numero negativo molto grande e la tua minimumvariabile su un numero positivo molto grande
  • dividere ogni riga per ottenere un elenco di stringhe e utilizzare la comprensione dell'elenco per convertirlo in un elenco di float
  • infine usa qualcosa di simile maximum = max(maximum, max(myfloatlist))e un equivalente per il valore minimo.

0

L'ho fatto l'altro giorno. Ho usato arcpy.RasterToNumPyArray, convertito l'array numpy in un elenco, quindi ho ripetuto il mio elenco tramite una comprensione dell'elenco per trovare i valori minimo e massimo.

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])

non è myArray.min()/ myArray.max()più semplice / più veloce?
Mike T,

1
@Chad, se hai già l'array numpy, non è necessario convertirlo in un elenco, usa semplicemente le funzioni min (), max () ecc. Nel mio thread sopra. Come noterete anche, non è stato indicato alcun accesso implicito ad Arcpy.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.