Trovare il valore della cella raster più vicino in base al punto vettoriale?


9

Ho due livelli in ArcGIS: uno è un punto vettoriale e l'altro è un livello raster. Voglio aggiungere il valore della griglia di dati raster al punto vettoriale. Il problema è che il punto vettoriale è lontano da qualsiasi griglia raster esistente con valore, quindi il comando "Campione" non restituisce alcun valore per quel punto vettoriale.

Quindi la mia domanda è: come posso trovare la cella raster più vicina con un punto vettoriale ed estrarre il valore dalla cella?

In realtà ci sono due cose che devo fare:

  1. Identifica il outliner all'interno di un ranger (di solito 1-2 celle di distanza dal mio raster esistente)
  2. Assegna loro un valore dal raster più vicino, se si trovano in un intervallo

Modificato: ho circa 3000 punti vettoriali e il mio problema è questo: inserisci qui la descrizione dell'immagine

Devo aggiungere il valore raster in base alle posizioni ai punti vettoriali. Ho usato lo strumento "Esempio" e funziona bene per la maggior parte dei punti.

Tuttavia, c'è una situazione come questa inserisci qui la descrizione dell'immagine

Il punto giusto può ottenere il valore dal raster ("Esempio" funziona) ma il punto sinistro non può a causa di problemi di allineamento.

Dal raster al poligono non funziona perché ricevo un messaggio di errore che non riesco a trasformarli in vettore perché sono fuori dal dominio. Inoltre ho punti come questoinserisci qui la descrizione dell'immagine

Quei punti superiori non dovrebbero ottenere alcun valore perché sono troppo lontani dal raster.

Ho pensato in qualche modo di aggirare:

Passaggio 1. Eseguire prima il "campione"

Passaggio 2. Selezionare il valore null dopo le operazioni "campione"

Passaggio 3. costruire zone cuscinetto (entro 1 decimale) in base ai punti null

Passaggio 4. utilizzare le statistiche zonali ?? ? o altri strumenti per eseguire il ciclo tra tutte le celle raster nel buffer, trovare quella più vicina, estrarne il valore e inserirlo nel punto vettoriale.

Sono bloccato al passaggio 4. Non so quale strumento di ArcSDK posso usare per ottenere questa funzione.

Oppure ... Hai un'idea migliore per affrontarlo?

Ho 20 livelli raster come questo e vorrei farlo automaticamente (usando modellista e arcobject).


@whuber: il tuo metodo sembra molto intelligente. La mia domanda è: sto gestendo i dati su scala globale e come posso determinare x0 e x1 per il profilo raster?
Visto

Ispeziona le sue proprietà dopo averlo aggiunto al progetto.
whuber

1
Le statistiche zonali sono un vicolo cieco. Sulla base della tua modifica, esiste una semplice soluzione diretta: espandi leggermente il raster attorno al suo confine e campiona il raster espanso. Esistono molti modi per farlo, ma richiedono tutti una piccola funzione con calcoli raster. Uno dei più semplici è ingrandire l'estensione dell'analisi, calcolare una media focale e (usando 'con') incollare i suoi valori nella zona di confine NoData. Ciò assegna una media dei valori raster vicini a ciascuna posizione del campione off-raster.
whuber

@whuber C'è un altro problema è che non so dove siano gli outliner. Quindi in realtà ci sono 2 procedure nel mio processo: identificare gli outliner e assegnare loro dei valori.
Visto

Che cos'è un "outliner"? Se è un punto non coperto da un valore raster, non puoi fare a meno di trovarli: questi saranno i punti che non ricevono alcun valore quando applichi lo Samplestrumento.
whuber

Risposte:


8

Un profilo raster occupa un rettangolo delimitato in basso a sinistra dall'origine, con coordinate (diciamo) (x0, y0) e in alto a destra con (x1, y1): sono proprietà facilmente individuabili da qualsiasi raster. È possibile utilizzare queste informazioni per spostare eventuali punti al di fuori dell'estensione del raster sul punto più vicino sul confine del raster ed estrarre i valori del raster nelle nuove posizioni.

Compiti come questo sono spesso prontamente risolti considerando dimensioni inferiori . L'estensione di un raster unidimensionale è solo un intervallo di numeri, diciamo da x0 a x1> x0, scritto in modo convenzionale [x0, x1]. Supponiamo di voler trovare il punto più vicino in questo intervallo a un determinato numero x. Esistono tre casi: x <x0 (x è a sinistra), x0 <= x <= x1 (x è nell'intervallo) e x1 <x (x è a destra). Chiaramente i punti più vicini sono rispettivamente x0, xe x1. Una formula per questo risultato è

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

come puoi vedere contemplando ciascuno dei tre casi separatamente.

Poiché l'estensione di un raster è il prodotto cartesiano di due intervalli, [x0, x1] * [y0, y1], la stessa formula funziona in due dimensioni. Basta applicarlo a ciascun intervallo. Quindi le coordinate del punto proiettato possono essere calcolate (in un calcolatore di campo, per esempio) come

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

Ecco questa formula in azione con 100 punti posizionati casualmente attorno e all'interno di una griglia:

figura

Le linee tratteggiate associano visivamente i punti all'esterno dell'estensione alle posizioni in cui verranno spostati.

Crea un livello punti da queste coordinate calcolate e applica lo Samplestrumento per estrarre i valori raster. Unisci i risultati al livello punto originale.

In pratica , per evitare problemi con arrotondamenti a virgola mobile che potrebbero impedire ai nuovi punti di trovarsi all'interno della griglia, sarebbe saggio rendere x0 e y0 leggermente più grandi della vera origine (è possibile aggiungere metà della dimensione della cella a loro) e, allo stesso modo, rendere x1 e y1 leggermente più piccoli.

In sintesi , il flusso di lavoro consiste nel calcolare due campi (le nuove coordinate) nella tabella del livello punto originale, creare un livello evento punto da quelle nuove coordinate, eseguire lo Samplestrumento ed eseguire un join del database (non un join spaziale).


Quando hai molti più punti vettoriali rispetto alle celle nel raster , dovresti preferire la soluzione data da @celenius (che propone di convertire il raster in punti e usare un join spaziale). Normalmente, tuttavia, i raster hanno un sacco di celle - da milioni a miliardi - e la conversione in punti richiede così tanto tempo e dispendiosa da dover essere affrontata con cautela.

In alternativa, è possibile accelerare la soluzione di Celenius utilizzando un calcolo raster per creare una griglia intera con valori solo lungo il suo confine. La conversione che per un layer di punti è semplice e veloce perché avrà pochi punti. Chiamiamo questo "strato limite". Campionare la griglia nei punti del livello limite, copiando così i valori della griglia nella tabella degli attributi del livello limite. Dopo aver eseguito Samplecon il livello punto originale, rimuovere tutti i punti in cui è stato ottenuto correttamente un campione. Unisci spazialmente lo strato limite ai punti rimanenti per completare il processo di campionamento.

(Un modo per creare una griglia con valori solo lungo il suo confine è applicare un'operazione di vicinato focale che fallisce lungo il confine: esempi includono la ricerca di pendenze, pendenza delle colline, statistiche focali di quartiere 3 x 3. Questo crea una griglia con una cella singola anello spesso di NoData attorno al suo bordo. Usando IsNull e SetNull per rilevare le celle NoData e convertirle tra NoData e celle di dati si produce una griglia piena di valori NoData tranne attorno al limite.)


In sintesi, il flusso di lavoro consiste nel calcolare due campi (le nuove coordinate) nella tabella del livello punto originale, creare un livello evento punto da quelle nuove coordinate, eseguire lo strumento Campione ed eseguire un join del database (non un join spaziale). Potresti elaborare come fare questo? (Puoi vedere le mie foto per il mio problema). Grazie!
Visto

Ho circa il 15% di punti che hanno questo problema. come puoi determinare x0 e x1 per ciascun punto?
Visto

1
@Guardato x0, y0, x1, y1 sono per le griglie. Le coordinate del punto (x, y) possono essere calcolate nel Field Calculator come descritto nella guida di ArcGIS o in diversi thread su questo sito. Esistono voci di menu per creare un layer punti XY e unioni al database: si tratta di operazioni standard di base.
whuber

4

È possibile convertire il raster in punti ( ref ), quindi eseguire un join spaziale sui punti (dai raster) al punto.

(Ho appena imparato che i punti possono essere uniti spazialmente qui ieri )


1
+1 per un approccio intelligente. Per griglie di grandi dimensioni, dove ciò diventa impraticabile, converti solo le celle di confine del raster in punti. (Descrivo come alla fine della mia risposta.)
whuber

Ho migliaia di celle per ogni strato raster e ho 20 livelli come quello ... quindi trasformarli in punti vettoriali richiede tempo ...
Visto

Inoltre, quando provo a eseguire il raster al poligono, ricevo un messaggio di errore come ERRORE 000864 Input raster: l'input non è compreso nel dominio definito. ERRORE 000863: Tipo di dati GP non valido
Visto

Viene visualizzato un errore durante la conversione di punti raster in punti?
djq

@celenius Funziona ma ci è voluto molto tempo.
Visto

1

È possibile convertire il livello raster in un poligono utilizzando lo strumento Raster in poligono ed eseguire l'unione spaziale (fare clic con il tasto destro del mouse sul livello punto e selezionare Join e relativi - Unisci, al primo menu a discesa selezionare l'opzione di unione spaziale e selezionare il più vicino per l'opzione sul pulsante readio) o utilizzare lo strumento Vicino.


Come si utilizza il risultato del join spaziale per estrarre il valore raster appropriato?
whuber

@whuber, nella finestra di dialogo Dati join quando si seleziona l'opzione "è il più vicino ad essa" il join spaziale seleziona la funzione poligono più vicina (risultato dallo strumento Raster a poligono) e aggiunge le informazioni di questo attributo alla funzione punto. È questo ciò che la tua domanda stava ponendo? La mia risposta iniziale è stata pubblicata prima della sua modifica. Immagino che il raster visto potrebbe essere stato troppo grande per essere convertito in poligono?
artwork21

L'idea non è di trovare il raster più vicino. In realtà, ciò che si desidera è un modo per estrapolare i valori di un raster oltre la sua estensione originale. La domanda propone un approccio vicino più vicino: in qualsiasi punto vicino non sul raster, trova la cella più vicina nel raster e usa il valore di quella cella.
whuber

Rileggendo il tuo ultimo commento, sembra che tu stia proponendo di trasformare il raster non in "un poligono" ma in uno strato poligonale con un poligono per ogni cella (o insieme contiguo di celle). Se è così, potrebbe avere successo con raster molto piccoli, ma perché lo proponi - che è un'operazione complessa e costosa (e funziona solo per le reti intere) - invece della soluzione simile ma più efficiente offerta da @celenius in precedenza? Quali vantaggi offre la tua soluzione?
whuber

@whuber, lo strato poligonale è corretto. Sì, il metodo celenius costerebbe meno memoria.
artwork21
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.