Mer

Bestemme min- og maksverdier i et ASCII-rasterdatasett ved hjelp av Python?


Jeg har et rasterdatasett i ASCII-format. Ved hjelp av Python må jeg bestemmeminogmaksverdier inne i datasettet. Jeg har blitt fortalt at topptekstinformasjonen er nøkkel, som inneholder ting som antall rader / kolonner, cellestørrelse og etc.

Kan du ikke bare hoppe over topptekstinformasjonen og lese hele datasettet for å bestemmeminogmaksverdier?

Dette er hva jeg prøver å gjøre. Jeg hopper over de første par linjene som inneholder topptekstinformasjonen, og prøver å bestemme verdiene derfra. Følgende er liksom det jeg har, men trenger litt veiledning da jeg er ny på Python.

raster_file = open ('data.asc', 'r') # Åpne fildata = raster_file.readlines () [4:] # Les linjene i filen, og hopp over de første seks linjene for linjer i data: skriv ut maks (data) # Finn maks verdi i datautskrift min (data) # Finn min verdi i data

Noen forslag?


Du kan bruke nummen. Se eksemplet nedenfor. Det kan genereres en nummen maskert matrise som tar hensyn til verdiene uten data. Se nummen hjelpemne for mafromtxt og genfromtxt

Nedenfor er en liten ascii-fil med en nodata-verdi på -999 ncols 3 nrows 3 xllcorner 0 yllcorner 0 cellestørrelse 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') >>> skriv ut en_array [[0.0 1.0 2.0] [ - 4,0 5,0] [6,0 7,0 8,0]] >>>

derfra er det ganske enkelt en sak å bestemme statistikken du ønsker

>>> skriv ut en_array.min () 0.0 >>> skriv ut en_array.max () 8.0 >>> skriv ut en_array.mean () 4.125 >>>

Du vil ha rasterdatastatistikk.
Se hva du gjør i gui først (for lekser.)

Deretter kan du bruke et pythonvindu eller et skript.

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

importer sys klasse Ascii_file (objekt): def __init __ (selv, fil): self.raster_file = åpen (fil, 'r') # Åpne filen self.max = sys.float_info.min self.min = sys.float_info.max def __minmax (selv, verdi): hvis verdi> self.max: self.max = verdi hvis verdi

Hvis du ikke vil bruke nummen (og det burde du virkelig, det er perfekt for denne typen ting), må du:

  • initialiser dinmaksimumvariabel til et veldig stort negativt tall og dittminimumvariabelt til et veldig stort positivt tall
  • del hver linje for å få en liste over strenger og bruk listeforståelse for å konvertere den til en liste med flyter
  • endelig bruk noe såntmaksimum = maks (maksimum, maks (myfloatlist))og en ekvivalent for minimumsverdien.

Jeg gjorde dette her om dagen. jeg brukte arcpy.RasterToNumPyArray, konverterte den numme matrisen til en liste, deretter gjentok den gjennom listen min via en listeforståelse for å finne min- og maksverdiene.

import arcpy import numpy myArray = arcpy.RasterToNumPyArray (r "D:  NED_93512417  NED_93512417_3DEM_RPRJ.TIF") p = myArray.tolist () max_elev = max ([element for underliste i p for element i underliste) min vare for underliste i p for vare i underliste])