Trouver la valeur de cellule raster la plus proche en fonction du point vectoriel?

9

J'ai deux couches dans ArcGIS: l'une est un point vectoriel et l'autre est une couche raster. Je veux ajouter la valeur de la grille de données raster au point vectoriel. Le problème est que le point vecteur est éloigné de toute grille raster existante avec une valeur, donc la commande "Sample" ne renvoie aucune valeur pour ces points vectoriels.

Ma question est donc la suivante: comment trouver la cellule raster la plus proche à partir d'un point vectoriel et extraire la valeur de la cellule?

En fait, je dois faire deux choses:

  1. Identifier le contour dans un ranger (généralement 1-2 cellules loin de mon raster existant)
  2. Attribuez-leur une valeur du raster le plus proche, s'ils se trouvent dans une plage

Modifié: j'ai environ 3000 points vectoriels et mon problème est le suivant: entrez la description de l'image ici

J'ai besoin d'ajouter la valeur du raster basée sur les emplacements aux points vectoriels. J'ai utilisé l'outil "Sample" et il fonctionne bien pour la plupart des points.

Cependant, il y a une situation comme celle-ci entrez la description de l'image ici

Le point droit peut obtenir la valeur du raster ("Sample" fonctionne) mais le point gauche ne peut pas en raison des problèmes d'alignement.

Le raster en polygone ne fonctionne pas car je reçois un message d'erreur indiquant que je ne peux pas les transformer en vecteur car ils sont hors du domaine. J'ai aussi des points comme çaentrez la description de l'image ici

Ces points supérieurs ne doivent pas obtenir de valeurs car ils sont trop éloignés du raster.

J'ai pensé à un moyen de contourner:

Étape 1. Faites d'abord "l'échantillon"

Étape 2. Sélectionnez la valeur nulle après les opérations "échantillon"

Étape 3. Construire des zones tampons (à 1 degré décimal près) sur la base des points nuls

Étape 4. utiliser des statistiques zonales ?? ? ou d'autres outils pour parcourir toutes les cellules raster du tampon, trouver la plus proche, extraire sa valeur et la placer dans le point vecteur.

Je suis bloqué à l'étape 4. Je ne sais pas quel outil ArcSDK je peux utiliser pour réaliser cette fonction.

Ou bien ... Avez-vous une meilleure idée pour y faire face?

J'ai 20 couches raster comme celle-ci et je voudrais le faire automatiquement (en utilisant le générateur de modèles et l'arcobjet).

Vu
la source
@whuber: Votre méthode semble très intelligente. Ma question est la suivante: je traite des données à l'échelle mondiale et comment puis-je déterminer les x0 et x1 pour le raster décrivant?
Vu
Inspectez ses propriétés après l'avoir ajouté au projet.
whuber
1
Les statistiques zonales sont une impasse. En fonction de votre modification, il existe une solution directe simple: étendez légèrement le raster autour de sa limite et échantillonnez le raster développé. Il existe de nombreuses façons de le faire, mais elles nécessitent toutes une petite facilité avec des calculs raster. L'une des plus simples consiste à agrandir l'étendue de l'analyse, à calculer une moyenne focale et (en utilisant «con») à coller ses valeurs dans la zone limite NoData. Cela affecte une moyenne des valeurs de raster proches à chaque emplacement d'échantillon hors raster.
whuber
@whuber Il y a un autre problème, c'est que je ne sais pas où sont les contours. Il y a donc en fait 2 procédures dans mon processus: identifier les contours et leur attribuer des valeurs.
Vu
Qu'est-ce qu'un "Outliner"? S'il s'agit d'un point non couvert par une valeur raster, vous ne pouvez pas vous empêcher de les trouver: ce sont les points qui ne reçoivent aucune valeur lorsque vous appliquez l' Sampleoutil.
whuber

Réponses:

8

Un contour raster occupe un rectangle délimité en bas à gauche par l'origine, ayant des coordonnées (disons) (x0, y0), et en haut à droite par (x1, y1): ce sont des propriétés faciles à découvrir de tout raster. Vous pouvez utiliser ces informations pour déplacer tous les points en dehors de l'étendue du raster vers le point le plus proche sur la limite du raster et extraire les valeurs du raster aux nouveaux emplacements.

De telles tâches sont souvent facilement élaborées en considérant des dimensions plus faibles . L'étendue d'un raster unidimensionnel n'est qu'un intervalle de nombres, disons de x0 à x1> x0, écrit conventionnellement [x0, x1]. Supposons que vous vouliez trouver le point le plus proche dans cet intervalle d'un nombre donné x. Il existe trois cas: x <x0 (x est à gauche), x0 <= x <= x1 (x est dans l'intervalle) et x1 <x (x est à droite). De toute évidence, les points les plus proches sont respectivement x0, x et x1. Une formule pour ce résultat est

x -> min (max (x, x0), x1),

comme vous pouvez le voir en envisageant chacun des trois cas séparément.

Étant donné que l'étendue d'un raster est le produit cartésien de deux intervalles, [x0, x1] * [y0, y1], la même formule fonctionne en deux dimensions. Il suffit de l'appliquer à chaque intervalle. Ainsi, les coordonnées du point projeté peuvent être calculées (dans une calculatrice de champ, par exemple) comme

(x, y) -> (min (max (x, x0), x1), min (max (y, y0), y1).

Voici cette formule en action avec 100 points placés au hasard autour et dans l'étendue d'une grille:

Figure

Les lignes en pointillés associent visuellement des points en dehors de l'étendue aux emplacements où ils seront déplacés.

Créez une couche de points à partir de ces coordonnées calculées et appliquez l' Sampleoutil pour extraire les valeurs raster. Joignez les résultats à la couche de points d'origine.

En pratique , pour éviter les problèmes d'arrondi à virgule flottante qui pourraient empêcher les nouveaux points de se situer dans l'étendue de la grille, il serait judicieux de rendre x0 et y0 légèrement plus grands que l'origine réelle (vous pouvez leur ajouter la moitié de la taille de la cellule) et, de même, rendre x1 et y1 légèrement plus petits.

En résumé , le workflow consiste à calculer deux champs (les nouvelles coordonnées) dans la table de la couche de points d'origine, à créer une couche d'événements de point à partir de ces nouvelles coordonnées, à exécuter l' Sampleoutil et à effectuer une jointure de base de données (pas une jointure spatiale).


Lorsque vous avez beaucoup plus de points vectoriels que de cellules dans le raster , vous devriez préférer la solution donnée par @celenius (qui propose de convertir le raster en points et d'utiliser une jointure spatiale). Normalement, cependant, les rasters ont beaucoup de cellules - des millions à des milliards - et la conversion en points prend tellement de temps et de disques qu'elle doit être abordée avec prudence.

Vous pouvez également accélérer la solution de Celenius en utilisant un calcul raster pour créer une grille entière avec des valeurs uniquement le long de sa frontière. Convertir cela en une couche de points est rapide et facile car il aura peu de points. Appelons cela la «couche limite». Échantillonnez la grille aux points de la couche limite, copiant ainsi les valeurs de la grille dans la table attributaire de la couche limite. Après avoir exécuté Samplela couche de points d'origine, supprimez tous les points où un échantillon a été obtenu avec succès. Reliez spatialement la couche limite aux points restants pour terminer le processus d'échantillonnage.

(Une façon de créer une grille avec des valeurs uniquement le long de sa frontière consiste à appliquer une opération de voisinage focal qui échoue le long de la frontière: les exemples incluent la recherche de pentes, d'ombrage, de statistiques focales de voisinage 3 x 3. Cela crée une grille avec une cellule à une cellule). anneau épais de NoData autour de son bord. L'utilisation de IsNull et SetNull pour détecter les cellules NoData et convertir entre NoData et les cellules de données produit une grille pleine de valeurs NoData sauf autour de la limite.)

whuber
la source
En résumé, le workflow consiste à calculer deux champs (les nouvelles coordonnées) dans la table de la couche de points d'origine, à créer une couche d'événements ponctuels à partir de ces nouvelles coordonnées, à exécuter l'outil Exemple et à effectuer une jointure de base de données (pas une jointure spatiale). Pourriez-vous nous expliquer comment procéder? (Vous pouvez voir mes photos pour mon problème). Merci!
Vu
J'ai environ 15% des points ont ce problème. comment pouvez-vous déterminer les x0 et x1 pour chaque point?
Vu
1
@Voir les x0, y0, x1, y1 sont pour les grilles. Les coordonnées du point (x, y) peuvent être calculées dans la calculatrice de champ comme décrit dans l'aide d'ArcGIS ou dans plusieurs threads de ce site. Il existe des éléments de menu pour créer une couche de points XY et des jointures de base de données: il s'agit d'opérations de base standard.
whuber
4

Vous pouvez convertir le raster en points ( ref ), puis effectuer une jointure spatiale sur les points (des rasters) au point.

(Je viens d'apprendre que les points peuvent être joints spatialement ici hier )

djq
la source
1
+1 pour une approche intelligente. Pour les grandes grilles, lorsque cela devient impossible, convertissez uniquement les cellules limites du raster en points. (Je décris comment à la fin de ma réponse.)
whuber
J'ai des milliers de cellules de chaque couche raster et j'ai 20 couches comme ça ... alors les transformer en points vectoriels prend du temps ...
Vu
En outre, lorsque j'essaie de créer un raster sur un polygone, j'obtiens un message d'erreur sous la forme ERREUR 000864 Raster en entrée: l'entrée n'est pas dans le domaine défini. ERREUR 000863: type de données GP non valide
vu
Obtenez-vous une erreur lors de la conversion du raster en points?
djq
@celenius Ça marche mais ça a pris du temps.
Vu
1

Vous pouvez convertir la couche raster en polygone à l'aide de l'outil Raster en polygone et exécuter la jointure spatiale (cliquez avec le bouton droit sur la couche de points et sélectionnez Jointures et relations - Joindre, dans la première liste déroulante, sélectionnez l'option de jointure spatiale et sélectionnez la plus proche) à l'option sur le bouton readio), ou utilisez l'outil Proche.

oeuvre21
la source
Comment utilisez-vous le résultat de la jointure spatiale pour extraire la valeur raster appropriée?
whuber
@whuber, dans la boîte de dialogue Joindre les données lorsque vous sélectionnez l'option "le plus proche", la jointure spatiale sélectionne l'entité surfacique la plus proche (résultat de l'outil Raster vers polygone) et ajoute ces informations d'attribut à l'entité ponctuelle. Est-ce ce que vous demandiez? Ma réponse initiale a été publiée avant sa modification. Je suppose que le raster de Seen était peut-être trop volumineux pour être converti en polygone?
artwork21
L'idée n'est pas de trouver le raster le plus proche. Vraiment, ce que l'on veut, c'est un moyen d'extrapoler les valeurs d'un raster au-delà de son étendue d'origine. La question propose une approche de voisin le plus proche: à tout point proche qui n'est pas sur le raster, trouvez la cellule la plus proche dans le raster et utilisez la valeur de cette cellule.
whuber
En relisant votre dernier commentaire, il semble que vous proposiez de transformer le raster non pas en "polygone" mais en une couche de polygones avec un polygone pour chaque cellule (ou un ensemble contigu de cellules). Si tel est le cas, cela pourrait réussir avec de très petits rasters, mais pourquoi proposez-vous cela - qui est une opération complexe et coûteuse (et ne fonctionne que pour les grilles entières) - au lieu de la solution similaire mais plus efficace @celenius proposée précédemment? Quels avantages offre votre solution?
whuber
@whuber, la couche de polygones est correcte. Oui, la méthode celenius coûterait moins de mémoire.
artwork21