Je suis vraiment nouveau sur Python et j'aimerais savoir s'il existe une méthode rapide pour obtenir les valeurs de cellule d'un raster pixel par pixel et les coordonnées (mapper les coordonnées XY du centre de chaque pixel) en utilisant Python dans ArcGIS 10?
Pour décrire cela plus en détail, je dois obtenir la carte X, la carte Y et la valeur de cellule du premier pixel et affecter ces trois valeurs à trois variables et répéter cette étape pour le reste des autres pixels (boucle à travers le raster entier).
Je pense que je dois décrire ma question davantage. Le problème est que je dois obtenir l'emplacement XY d'un pixel du premier raster et obtenir les valeurs de cellule de plusieurs autres rasters correspondant à cet emplacement XY. Ce processus devrait parcourir tous les pixels du premier raster sans créer de fichier de formes de points intermédiaires car cela va vraiment prendre beaucoup de temps car je dois gérer un raster avec près de 8 milliards de pixels. De plus, je dois le faire en utilisant Python dans ArcGIS 10.
@JamesS: Merci beaucoup pour votre suggestion. Oui, cela fonctionnerait pour un raster, mais je dois également collecter les valeurs des cellules pour plusieurs autres rasters. Le problème est qu'après avoir obtenu les coordonnées X et Y du premier pixel du premier raster, j'ai besoin d'obtenir la valeur de cellule du deuxième raster correspondant à cet emplacement X, Y du premier raster, puis du troisième raster et ainsi de suite. Donc, je pense que lorsque vous parcourez le premier raster, obtenir l'emplacement X et Y d'un pixel et obtenir les valeurs de cellule de l'autre raster correspondant à cet emplacement doit être fait simultanément, mais je ne suis pas sûr. Cela peut être fait en convertissant le premier raster en un fichier de formes de points et en effectuant la fonction d'extraction de plusieurs valeurs en points dans ArcGIS 10, mais je '
@hmfly: Merci, oui, cette méthode (RastertoNumpyarray) fonctionnera si je peux obtenir les coordonnées d'une valeur de ligne et de colonne connue du tableau.
@whuber: Je ne veux pas effectuer de calculs, tout ce que je dois faire est d'écrire les coordonnées XY et les valeurs des cellules dans un fichier texte et c'est tout
la source
Réponses:
En suivant l'idée de @ Dango, j'ai créé et testé (sur de petits rasters avec la même étendue et la même taille de cellule) le code suivant:
Basé sur le code @hmfly, vous pouvez avoir accès aux valeurs souhaitées:
Malheureusement, il y a un «mais» - le code convient aux tableaux NumPy qui peuvent être gérés par la mémoire système. Pour mon système (8 Go), la plus grande baie était d'environ 9 000 9 000.
Comme mon expérience ne me permet pas de fournir plus d'aide, vous pouvez envisager quelques suggestions sur le traitement avec de grands tableaux: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
permet de spécifier le sous-ensemble de raster converti en tableau NumPy ( page d'aide d'ArcGIS10 ) ce qui peut être utile lors du découpage d'un grand ensemble de données en sous-matrices.la source
Si vous voulez simplement faire passer les valeurs des pixels (ligne, colonne), vous pouvez écrire un script arcpy comme ceci:
Mais, si vous souhaitez obtenir les coordonnées du pixel, NumPyArray ne peut pas vous aider. Vous pouvez convertir le raster en point par l'outil RasterToPoint, puis vous pouvez obtenir les coordonnées par forme déposée.
la source
La méthode la plus simple pour générer des coordonnées et des valeurs de cellule dans un fichier texte dans ArcGIS 10 est l' exemple de fonction , pas besoin de code et surtout pas besoin de boucler sur chaque cellule. Dans la calculatrice raster ArcGIS <= 9.3x, elle était aussi simple que celle
outfile.csv = sample(someraster)
qui produirait un fichier texte de toutes les valeurs et coordonnées (non nulles) des cellules (au format z, x, y). Dans ArcGIS 10, il semble que l'argument "in_location_data" soit désormais obligatoire, vous devez donc utiliser la syntaxeSample(someraster, someraster, outcsvfile)
.Edit: Vous pouvez également spécifier plusieurs rasters:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Que cela fonctionne sur 8 milliards de cellules, je n'ai aucune idée ...Edit: Remarque, je n'ai pas testé cela dans ArcGIS 10, mais j'ai utilisé l'exemple de fonction pendant des années dans <= 9.3 (et Workstation).
Edit: j'ai maintenant testé dans ArcGIS 10 et il ne sortira pas dans un fichier texte. L'outil modifie automatiquement l'extension de fichier en ".dbf". Cependant ... le code python suivant fonctionne car les instructions d'algèbre de carte SOMA et MOMA sont toujours prises en charge dans ArcGIS 10:
la source
Une façon de procéder consiste à utiliser l' outil Raster_To_Point suivi de l' outil Add_XY_Coordinates . Vous vous retrouverez avec un fichier de formes où chaque ligne de la table attributaire représente un pixel de votre raster avec des colonnes pour X_Coord , Y_Coord et Cell_Value . Vous pouvez ensuite parcourir ce tableau à l'aide d'un curseur (ou l'exporter vers quelque chose comme Excel si vous préférez).
Si vous n'avez qu'un seul raster à traiter, cela ne vaut probablement pas la peine de faire un script - utilisez simplement les outils d'ArcToolbox. Si vous devez effectuer cette opération pour de nombreux rasters, vous pouvez essayer quelque chose comme ceci:
[ Remarque: je n'ai pas ArcGIS 10 et je ne connais pas ArcPy, il ne s'agit donc que d'un aperçu très approximatif. Il n'a pas été testé et devra presque certainement être peaufiné pour le faire fonctionner.]
Vous pouvez ensuite parcourir les tables d'attributs de fichiers de formes à l'aide d'un curseur de recherche ou (peut-être plus simple) à l'aide de dbfpy . Cela vous permettra de lire les données de votre raster (maintenant stockées dans une table shapefile .dbf) dans des variables python.
la source
Vous pouvez peut-être créer un fichier universel pour le raster, convertir le raster en un tableau numpy. puis si vous bouclez sur le tableau, vous obtiendrez les valeurs des cellules et si vous mettez à jour progressivement les x, y à partir du fichier mondial, vous aurez également les coordonnées de chaque valeur de cellule. j'espère que c'est utile.
la source
Le code de Marcin a bien fonctionné, sauf un problème dans les fonctions rasCentrX et rasCentrY qui faisait apparaître les coordonnées de sortie à une résolution différente (comme l'a observé Grazia). Ma solution était de changer
à
et
à
J'ai utilisé le code pour convertir une grille ESRI en un fichier CSV. Ceci a été réalisé en supprimant la référence à inRaster2, puis en utilisant un csv.writer pour sortir les coordonnées et les valeurs:
Je n'ai pas non plus trouvé que la transposition était nécessaire dans
tellement converti en
la source
Moche mais très efficace:
la source
Une solution simple utilisant des packages open source python:
Fiona est pratique car vous pouvez ouvrir un fichier de formes, parcourir les fonctionnalités et (comme je l'ai) les ajouter à un
dict
objet. En effet, le Fionafeature
lui-même est comme undict
aussi, il est donc facile d'accéder aux propriétés. Si mes points avaient des attributs, ils apparaîtront dans ce dict avec les coordonnées, l'id, etc.Rasterio est pratique car il est facile à lire dans le raster comme un tableau numpy, un type de données léger et rapide. Nous avons également accès à une
dict
des propriétés du raster, y compris leaffine
, qui est toutes les données dont nous avons besoin pour convertir les coordonnées x, y du raster en ligne de tableau, coordonnées col. Voir l'excellente explication de @ perrygeo ici .On se retrouve avec un
pt_data
de typedict
qui a des données pour chaque point et l'extraitraster_value
. Nous pourrions facilement réécrire le fichier de formes avec les données extraites si nous le voulions.la source