Suite

Existe-t-il un moyen efficace de créer un raster avec une valeur de pixel représentant un identifiant unique calculé en fonction de la latitude/longitude des pixels ?

Existe-t-il un moyen efficace de créer un raster avec une valeur de pixel représentant un identifiant unique calculé en fonction de la latitude/longitude des pixels ?


J'ai une trame de 10 m pour chaque état des États-Unis. La valeur actuelle du pixel représente quelque chose. Je veux avoir le « même » raster mais une taille de pixel représentant un identifiant unique calculé en fonction de la latitude et de la longitude des pixels. Je me demande s'il existe un moyen efficace de le faire, la fonction existante d'ArcGIS ou la programmation python C# conviennent toutes les deux.

Je ne peux rien faire avec Raster Calculator dans ArcGIS car la valeur de pixel du raster actuel n'a rien à voir avec un identifiant unique ou lat/lon.

Jusqu'à présent, j'ai essayé de créer une paire lat/long et de calculer un tel identifiant avec la programmation. Mais afin de garder une connexion avec le raster, je lis également la valeur actuelle du pixel. J'ai donc un enregistrement pour un pixel, au format lon, lat, pixelVal, uniqueId, et je l'écris dans un fichier csv. Car pour un raster de 10m, le nombre de pixels est très très grand. Je me demande si je peux le faire au niveau raster, au lieu d'utiliser de cette façon. Merci d'avance!


Il existe de nombreuses façons d'attribuer des identifiants uniques aux cellules raster. Certains sont énumérés ci-dessous. Veuillez noter que bien que des identifiants uniques puissent être générés efficacement, tout algorithme qui nécessite des identifiants uniques pour les cellules dans les grands rasters (avec plusieurs millions de cellules supplémentaires) sera lui-même inefficace ; dans de nombreux cas, il pourrait probablement être remplacé par un algorithme n'exigeant pas que chaque cellule ait un identifiant. Notez également qu'il existe une limite naturelle à la taille d'une telle grille, car même les grilles 32 bits peuvent prendre en charge au plus 2^32-1 (environ quatre milliards) de valeurs uniques. Les méthodes pour dépasser cette limite (sans recourir à des grilles 64 bits) sont données à la fin.

  1. Utiliser une grille d'identifiants de colonnesje(avec des valeurs allant de 0 à un de moins que le nombre de colonnes,m) et une grille similaire d'identifiants de lignesJ(avec des valeurs de 0 àn-1), calculer

    n * "Je" + "J"

    Une alternative pratique consiste à arrondirmjusqu'à la puissance de dix suivante égale ou supérieurem. Les coordonnées des lignes et des colonnes peuvent alors être lues directement à partir des identificateurs de points. Par exemple, avecm= 12796 etm= 8092, utilisez la formule 100000 *je+J. (Parce que la plus grande valeur possible de 809112795 ne dépassera pas un entier 32 bits signé, cela fonctionnera.) Par exemple, si un point a l'identifiant 49160008, il doit avoir des coordonnées (ligne, colonne) (491, 60008) trouvées par division l'identifiant dans ses cinq derniers chiffres et le préfixe restant de celui-ci.

    Les grilles d'identifiant de colonne et de ligne peuvent être calculées (en un seul calcul chacune) à l'aide des méthodes décrites dans Comment puis-je calculer un centroïde pondéré par rapport à un raster, par ex. centroïde pondéré par la population.

  2. Pour les petites grilles, utilisez simplementCombiner("I", "J"). Cette opération créera des identifiants de pixels uniques internes.

  3. Pour les très petites grilles (avec moins de 2^16 cellules environ), générez une grille d'entiers uniformément répartis entre 0 et la plus grande valeur possible (2^31-1 généralement). Interrogez la table attributaire pour les nombres supérieurs à 1. S'ils existent, générez simplement une nouvelle grille aléatoire, en répétant jusqu'à ce que toutes les valeurs soient uniques.

  4. Ne vous embêtez même pas. Si jamais vous avez besoin d'identifier un pixel, extrayez les valeurs du deux grillesjeetJ. Désormais, il n'y a plus de limite pratique à la taille de la grille : elle n'a besoin que de moins de quatre milliards de lignes et quatre milliards de colonnes.

  5. Les rôles joués parjeetJpeuvent être remplacés par des grilles de coordonnées X et Y, respectivement, mais (a) le calcul en (1) est plus délicat car il sera difficile d'éviter les collisions potentielles d'ID et (2) lorsque la taille des cellules est très petite (comme quelques mètres ou moins) les flotteurs à simple précision ne distinguent généralement pas toutes les cellules voisines, une double précision sera donc nécessaire.

  6. Les grilles de coordonnées X et Y peuvent elles-mêmes être remplacées par d'autres grilles. Les bonnes sont les distances (signées) à partir des courbes appropriées : souvent deux de ces distances suffisent pour identifier de manière unique chaque point proche de l'intersection de ces courbes. Cela permet d'utiliser des systèmes de coordonnées non cartésiens (tels que des coordonnées polaires ou hyperboliques).


Cela ressemble un peu à cette question - en particulier la réponse fournie par marcin (qui ressemble au numéro 1 de la suggestion de whuber). Il semble que numpy puisse être un bon moyen de gérer les grands tableaux (peut-être s'ils ne sont pas trop grands). Et arcpy fournit les fonctions pour passer d'un raster à un tableau et inversement relativement facilement http://resources.arcgis.com/en/help/main/10.2/index.html#//018v0000005n000000 Et http://resources.arcgis.com /fr/help/main/10.2/index.html#//018v00000023000000


Voir la vidéo: Trouver des prospects ciblés pour vos liens daffiliation