Suite

Déterminer les valeurs min et max dans un jeu de données raster ASCII à l'aide de Python ?

Déterminer les valeurs min et max dans un jeu de données raster ASCII à l'aide de Python ?


J'ai un jeu de données raster au format ASCII. En utilisant Python, je dois déterminer leminetmaxvaleurs à l'intérieur de l'ensemble de données. On m'a dit que les informations d'en-tête sont essentielles et contiennent des éléments tels que le nombre de lignes/colonnes, la taille des cellules, etc.

Ne pouvez-vous pas simplement ignorer les informations d'en-tête et lire l'ensemble de données complet pour déterminer leminetmaxvaleurs?

C'est ce que j'essaie de faire. Je saute les deux premières lignes qui contiennent les informations d'en-tête et j'essaie de déterminer les valeurs à partir de là. Ce qui suit est en quelque sorte ce que j'ai, mais j'ai besoin de conseils car je suis nouveau sur Python.

raster_file = open('data.asc', 'r') # Ouvrir le fichier data = raster_file.readlines()[4:] # Lire les lignes du fichier et sauter les six premières lignes pour les lignes de data : print max (données) # Trouver la valeur max dans les données print min(data) # Trouver la valeur min hte dans les données

Aucune suggestion?


Vous pouvez utiliser numpy. Voir l'exemple ci-dessous. Un tableau masqué numpy peut être généré en tenant compte des valeurs sans données. Voir la rubrique d'aide numpy pour mafromtxt et genfromtxt

Ci-dessous se trouve un petit fichier ascii avec une valeur nodata de -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]] >>>

à partir de là il s'agit simplement de déterminer les statistiques que vous voulez

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

Vous voulez des statistiques de données raster.
Voyez d'abord ce que vous faites dans l'interface graphique (pour les devoirs.)

Ensuite, vous pouvez utiliser une fenêtre python ou un script.

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

import sys class Ascii_file(object): def __init__(self,file): self.raster_file = open(file, 'r') # Ouvrir le fichier 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

Si vous ne voulez pas utiliser numpy (et vous devriez vraiment le faire, c'est parfait pour ce genre de chose), alors vous devrez :

  • initialisez votremaximumvariable à un très grand nombre négatif et votrele minimumvariable à un très grand nombre positif
  • divisez chaque ligne pour obtenir une liste de chaînes et utilisez la compréhension de liste pour la convertir en une liste de flottants
  • enfin utiliser quelque chose commemaximum = max(maximum, max(myfloatlist))et un équivalent pour la valeur minimale.

Je viens de le faire l'autre jour. j'ai utilisé arcpy.RasterToNumPyArray, a converti le tableau numpy en liste, puis a parcouru ma liste via une compréhension de liste pour trouver les valeurs min et max.

import arcpy import numpy myArray = arcpy.RasterToNumPyArray(r"D:NED_93512417NED_93512417_3DEM_RPRJ.TIF") p = myArray.tolist() max_elev = max([élément pour la sous-liste dans p pour l'élément dans la sous-liste]) min_elev = min([ élément pour la sous-liste dans p pour l'élément dans la sous-liste])

Voir la vidéo: python programme pour trouver le maximum dune liste + le minimum + létendue algorithmique SNT