Je me demande s'il existe un moyen de trouver l'étendue de délimitation minimale pour un raster avec une valeur particulière. J'ai découpé un raster à partir d'une image globale et l'étendue est définie comme l'étendue globale avec beaucoup de zone NoData. Je voudrais supprimer la zone NoData de ce raster et ne conserver que la zone contenant les pixels de la valeur particulière. Comment puis-je faire ceci?
Voici mon exemple: je voudrais extraire la valeur = 1 (zone bleue) et utiliser l'étendue de la zone bleue plutôt que le monde entier pour un traitement ultérieur.
Réponses:
Si j'ai bien compris la question, il semble que vous souhaitiez connaître la zone de délimitation minimale des valeurs qui ne sont pas nulles. Vous pouvez peut-être convertir le raster en polygones, sélectionner les polygones qui vous intéressent, puis les reconvertir en raster. Vous pouvez ensuite regarder les valeurs des propriétés qui devraient vous donner la boîte englobante minium.
la source
L'astuce consiste à calculer les limites des données qui ont des valeurs. Le résumé peut être le moyen le plus rapide, le plus naturel et le plus général d'obtenir ces résumés: en utilisant toutes les cellules non NoData pour la zone, les min et max zonaux des grilles contenant les coordonnées X et Y fourniront l'étendue complète.
ESRI ne cesse de changer la façon dont ces calculs peuvent être effectués; par exemple, les expressions intégrées pour les grilles de coordonnées ont été supprimées avec ArcGIS 8 et semblent ne pas être revenues. Juste pour le plaisir, voici un ensemble de calculs simples et rapides qui feront le travail quoi qu'il arrive.
Convertissez la grille en une seule zone en l'assimilant à elle-même, comme dans
"Ma grille" == "Ma grille"
Créez une grille d'index de colonne en accumulant en flux une grille constante de valeur 1. (Les index commenceront par 0.) Si vous le souhaitez, multipliez-la par la taille de la cellule et ajoutez la coordonnée x de l'origine pour obtenir une grille de coordonnées x " X "(illustré ci-dessous).
De même, créez une grille d'index de ligne ( puis une grille de coordonnées y "Y") en accumulant en flux une grille constante de valeur 64.
Utilisez la grille de zone de l'étape (1) pour calculer le min et le max zonal de "X" et "Y" : vous avez maintenant l'étendue souhaitée.
(L'étendue, comme indiqué dans les deux tableaux de statistiques zonales, est représentée par un contour rectangulaire sur cette figure. La grille "I" est la grille de zone obtenue à l'étape (1).)
Pour aller plus loin, vous devrez extraire ces quatre nombres de leurs tableaux de sortie et les utiliser pour limiter l'étendue de l'analyse. La copie de la grille d'origine, avec l'étendue d'analyse restreinte en place, termine la tâche.
la source
Voici une version de la méthode @whubers pour ArcGIS 10.1+ en tant que boîte à outils python (.pyt).
la source
J'ai conçu une solution basée sur gdal et numpy. Il divise la matrice raster en lignes et colonnes et supprime toute ligne / colonne vide. Dans cette implémentation, "vide" est inférieur à 1 et seuls les rasters à bande unique sont pris en compte.
(Je me rends compte au moment où j'écris que cette approche de la ligne de balayage ne convient qu'aux images avec des "colliers" nodata. Si vos données sont des îles dans des mers nulles, l'espace entre les îles sera également supprimé, écrasant tout ensemble et gâchant totalement le géoréférencement .)
Les parties commerciales (doivent être développées, ne fonctionneront pas telles quelles):
Dans un script complet:
Le script est dans ma cachette de code sur Github, si le lien va 404 chasser un peu; ces dossiers sont mûrs pour une réorganisation.
la source
MemoryError
Source raster (geo units): Origin (top left): 2519950.0001220703, 5520150.00012207 Pixel size (x,-y): 100.0, -100.0 Columns, rows : 42000, 43200 Traceback (most recent call last): File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 72, in <module> cropped_raster, cropped_transform = main(src_raster) File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 22, in main data = np.array(raster.ReadAsArray()) MemoryError
Malgré toute sa puissance analytique, ArcGIS manque de manipulations raster de base que vous pouvez trouver avec les éditeurs d'images de bureau traditionnels comme GIMP . Il s'attend à ce que vous souhaitiez utiliser la même étendue d'analyse pour votre raster en sortie que votre raster en entrée, sauf si vous remplacez manuellement le paramètre d'environnement Output Extent . Étant donné que c'est exactement ce que vous cherchez à trouver, et non à définir, la façon de faire d'ArcGIS se met en travers.
Malgré mes meilleurs efforts, et sans recourir à la programmation, je n'ai trouvé aucun moyen d'obtenir l'étendue de votre sous-ensemble souhaité de l'image (sans conversion raster en vecteur qui est un gaspillage de calcul).
Au lieu de cela, j'ai utilisé GIMP pour sélectionner la zone bleue à l'aide de l'outil de sélection par couleur, puis inversé la sélection, appuyez sur Supprimer pour supprimer le reste des pixels, inversé à nouveau la sélection, recadré l'image à la sélection et enfin exporté vers PNG. GIMP l'a enregistré en tant qu'image de profondeur 1 bit. Le résultat est ci-dessous:
Bien sûr, parce que votre échantillon d'image ne comportait pas de composant de référence spatiale et que GIMP n'est pas conscient de l'espace, l'image de sortie est à peu près aussi utile que votre entrée d'échantillon. Vous devrez le géoréférencer pour qu'il soit utile dans une analyse spatiale.
la source
Voici une possibilité en utilisant SAGA GIS: http://permalink.gmane.org/gmane.comp.gis.gdal.devel/33021
Une autre possibilité en utilisant uniquement les outils ArcGIS GP serait de créer un TIN à partir de votre raster à l'aide de Raster vers TIN , de calculer sa frontière à l'aide du domaine TIN et de découper votre raster par la frontière (ou son enveloppe à l'aide de l'enveloppe d' entité au polygone ).
la source