En utilisant ArcGIS 10, j'ai un raster où je voudrais trouver le pixel avec la valeur maximale dans le raster et retourner son emplacement (centre du pixel) en degrés décimaux. Je voudrais répéter ce processus en renvoyant l'emplacement de la deuxième valeur la plus élevée du raster, puis la troisième, et ainsi de suite de sorte qu'à la fin, j'ai une liste de N emplacements qui ont les valeurs les plus élevées dans le raster dans l'ordre.
J'imagine que cela pourrait être plus facilement fait en utilisant un script Python mais je suis ouvert à d'autres idées s'il y a une meilleure façon.
Réponses:
Si vous êtes heureux d'utiliser R , il existe un package appelé raster . Vous pouvez lire dans un raster à l'aide de la commande suivante:
Ensuite, lorsque vous allez le regarder (en tapant
test
), vous pouvez voir les informations suivantes:Il peut y avoir de meilleures façons de manipuler le raster, mais une façon de trouver les informations que vous souhaitez pourrait être de trouver la valeur la plus élevée, d'obtenir son emplacement de matrice, puis d'ajouter cela aux extensions inférieures.
la source
R
, vous pouvez utiliser desR
fonctions standard ou lagetValues
méthode pour accéder aux valeurs des cellules. De là, il est simple d'identifier les valeurs les plus élevées et leurs emplacements.La réponse peut être obtenue en combinant une grille indicatrice du 1% supérieur de valeurs avec des grilles de latitude et de longitude. L'astuce consiste à créer cette grille d'indicateurs, car ArcGIS (toujours! Après 40 ans!) N'a pas de procédure pour classer les données raster.
Une solution pour les rasters à virgule flottante est itérative, mais heureusement rapide . Soit n le nombre de cellules de données. La distribution empirique cumulative des valeurs se compose de toutes les paires (z, n (z)) où z est une valeur dans la grille et n (z) est le nombre de cellules dans la grille avec des valeurs inférieures ou égales à z . Nous obtenons une courbe reliant (-infinity, 0) à (+ infinity, n) à partir de la séquence de ces sommets ordonnée par z . Il définit ainsi une fonction f , où (z, f (z)) se trouve toujours sur la courbe. Vous voulez trouver un point (z0, 0.99 * n) sur cette courbe.
En d'autres termes, la tâche consiste à trouver un zéro de f (z) - (1-0.01) * n . Faites-le avec n'importe quelle routine de recherche de zéro (qui peut gérer des fonctions arbitraires: celle-ci n'est pas différenciable). Le plus simple, qui est souvent efficace, est de deviner et de vérifier: au départ, vous savez que z0 se situe entre la valeur minimale zMin et la valeur maximale zMax. Devinez toute valeur raisonnable strictement entre ces deux. Si la supposition est trop faible, définissez zMin = z0; sinon définissez zMax = z0. Maintenant, répétez. Vous convergerez rapidement vers la solution; vous êtes suffisamment proche lorsque zMax et zMin sont suffisamment proches. Pour être prudent, choisissez la valeur finale de zMin comme solution: il pourrait ramasser quelques points supplémentaires que vous pourrez supprimer plus tard. Pour des approches plus sophistiquées, voir le chapitre 9 des recettes numériques (le lien va vers une ancienne version gratuite).
Un examen rétrospectif de cet algorithme révèle que vous devez effectuer uniquement deux types d'opérations raster : (1) sélectionner toutes les cellules inférieures ou égales à une valeur cible et (2) compter les cellules sélectionnées. Ce sont parmi les opérations les plus simples et les plus rapides du marché. (2) peut être obtenu sous la forme d'un comptage zonal ou en lisant un enregistrement de la table attributaire de la grille de sélection.
la source
Je l'ai fait il y a quelque temps, bien que ma solution utilise GDAL (donc ce n'est pas seulement pour ArcGIS). Je pense que vous pouvez obtenir un tableau NumPy à partir d'un raster dans ArcGIS 10, mais je ne suis pas sûr. NumPy fournit une indexation de tableau simple et puissante, comme
argsort
et d'autres. Cet exemple ne gère pas NODATA ni ne transforme les coordonnées du projeté en lat / long (mais ce n'est pas difficile à faire avec osgeo.osr, fourni avec GDAL)Affiche les éléments suivants pour mon fichier raster de test:
la source
NODATA = rast_band.GetNoDataValue()
, puis en utilisant soit une valeur NaN (rast[rast == NODATA] = np.nan
) soit en utilisant un tableau masqué (rast = np.ma.array(rast, mask=(rast == NODATA))
). L'astuce la plus compliquée consisteargsort
à supprimer en quelque sorte les valeurs NODATA de l'analyse, ou simplement à les ignorer dans la boucle for si elles sont NaN / masquées.