Encontrando o valor da célula raster mais próximo com base no ponto do vetor?

9

Eu tenho duas camadas no ArcGIS: uma é um ponto vetorial e a outra é uma camada raster. Quero acrescentar o valor da grade de dados raster ao ponto do vetor. O problema é que o ponto do vetor está longe de qualquer grade raster existente com valor; portanto, o comando "Amostra" não retorna nenhum valor para esse ponto do vetor.

Portanto, minha pergunta é: como posso encontrar a célula raster mais próxima com um ponto vetorial e extrair o valor da célula?

Na verdade, há duas coisas que preciso fazer:

  1. Identificar o contorno dentro de uma guarda florestal (geralmente 1-2 células de distância da minha varredura existente)
  2. Atribua um valor da varredura mais próxima a eles, se eles estiverem em um intervalo

Editado: tenho cerca de 3000 pontos vetoriais e meu problema é este: insira a descrição da imagem aqui

Preciso acrescentar o valor da varredura com base nos locais para os pontos do vetor. Eu usei a ferramenta "Sample" e funciona bem na maioria dos pontos.

No entanto, há uma situação como esta insira a descrição da imagem aqui

O ponto certo pode obter o valor da varredura ("Amostra" funciona), mas o ponto esquerdo não pode devido aos problemas de alinhamento.

A varredura para polígono não está funcionando porque recebo uma mensagem de erro de que não posso transformá-los em vetor porque estão fora do domínio. Também tenho pontos como esteinsira a descrição da imagem aqui

Esses pontos superiores não devem receber nenhum valor porque estão muito longe da varredura.

Pensei em algumas maneiras de contornar:

Etapa 1. Faça a "amostra" primeiro

Etapa 2. Selecione o valor nulo após as operações "sample"

Etapa 3. construir zonas de buffer (com 1 grau decimal) com base nos pontos nulos

Etapa 4. use estatísticas zonais? ? ou outras ferramentas para percorrer todas as células raster no buffer, encontrar a mais próxima, extrair seu valor e colocá-lo no ponto do vetor.

Estou preso na etapa 4. Não sei qual ferramenta no ArcSDK posso usar para atingir essa função.

Ou então ... Você tem uma idéia melhor para lidar com isso?

Eu tenho 20 camadas rasterizadas como esta e gostaria de fazer isso automaticamente (usando o model builder e o arcobject).

Visto
fonte
@ whuber: Seu método parece muito inteligente. Minha pergunta é: estou lidando com dados em escala global e como posso determinar x0 e x1 para o raster de esboço?
Visto
Inspecione suas propriedades depois de adicioná-lo ao projeto.
whuber
11
Estatísticas zonais são um beco sem saída. Com base na sua edição, existe uma solução direta e simples: expanda a varredura levemente ao redor de seu limite e faça uma amostra da varredura expandida. Existem várias maneiras de fazer isso, mas todas elas exigem um pouco de facilidade com cálculos de varredura. Uma das mais simples é aumentar a extensão da análise, calcular uma média focal e (usando 'con') colar seus valores na zona de fronteira NoData. Isso atribui uma média de valores de varredura próximos a cada local de amostra fora da varredura.
whuber
@whuber Há outro problema é que não sei onde estão os delineadores. Portanto, existem dois procedimentos no meu processo: identificar os delineadores e atribuir valores a eles.
Visto
O que é um "delineador"? Se é um ponto que não é coberto por um valor raster, você não pode deixar de encontrá-los: esses serão os pontos que não recebem nenhum valor quando você aplica a Sampleferramenta.
whuber

Respostas:

8

Um contorno raster ocupa um retângulo delimitado na parte inferior esquerda pela origem, com coordenadas (digamos) (x0, y0) e no canto superior direito por (x1, y1): essas são propriedades facilmente descobertas em qualquer raster. Você pode usar essas informações para mover qualquer ponto fora da extensão da varredura para o ponto mais próximo no limite da varredura e extrair os valores da varredura nos novos locais.

Tarefas como essa costumam ser prontamente realizadas considerando dimensões inferiores . A extensão de uma varredura unidimensional é apenas um intervalo de números, digamos de x0 a x1> x0, convencionalmente escrito [x0, x1]. Suponha que você queira encontrar o ponto mais próximo nesse intervalo para um determinado número x. Existem três casos: x <x0 (x está à esquerda), x0 <= x <= x1 (x está no intervalo) e x1 <x (x está à direita). Claramente, os pontos mais próximos são x0, x e x1, respectivamente. Uma fórmula para esse resultado é

x -> min (máximo (x, x0), x1),

como você pode ver, contemplando cada um dos três casos separadamente.

Como a extensão de uma varredura é o produto cartesiano de dois intervalos, [x0, x1] * [y0, y1], a mesma fórmula funciona em duas dimensões. Basta aplicá-lo a cada intervalo. Assim, as coordenadas do ponto projetado podem ser calculadas (em uma Calculadora de Campo, por exemplo) como

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

Aqui está esta fórmula em ação com 100 pontos aleatoriamente colocados ao redor e dentro da extensão de uma grade:

Figura

As linhas tracejadas associam visualmente pontos fora da extensão aos locais para onde serão movidos.

Crie uma camada de pontos a partir dessas coordenadas computadas e aplique a Sampleferramenta para extrair os valores de varredura. Junte os resultados de volta à camada de pontos original.

Como uma questão prática , para evitar problemas com o arredondamento dos pontos flutuantes que possam impedir que os novos pontos fiquem dentro da extensão da grade, seria prudente tornar x0 e y0 um pouco maiores que a verdadeira origem (você pode adicionar metade do tamanho da célula a eles) e, da mesma forma, torne x1 e y1 um pouco menores.

Em resumo , o fluxo de trabalho consiste em calcular dois campos (as novas coordenadas) na tabela da camada de pontos original, criando uma camada de eventos de pontos a partir dessas novas coordenadas, executando a Sampleferramenta e executando uma junção ao banco de dados (não uma junção espacial).


Quando você tem muito mais pontos vetoriais do que células na varredura , deve preferir a solução fornecida por @celenius (que propõe converter a varredura em pontos e usar uma junção espacial). Normalmente, porém, os raspadores têm muitas células - milhões a bilhões - e a conversão em pontos é tão demorada e demorada que deve ser abordada com cautela.

Como alternativa, você pode acelerar a solução da Celenius usando um cálculo de varredura para criar uma grade inteira com valores apenas ao longo de seus limites. Converter isso em uma camada de pontos é rápido e fácil, pois terá poucos pontos. Vamos chamar isso de "camada limite". Prove a grade nos pontos da camada de limite, copiando assim os valores da grade na tabela de atributos da camada de limite. Após executar Samplecom a camada de pontos original, remova todos os pontos em que uma amostra foi obtida com sucesso. Una espacialmente a camada limite aos pontos restantes para concluir o processo de amostragem.

(Uma maneira de criar uma grade com valores somente ao longo de seu limite é aplicar uma operação de vizinhança focal que falhe ao longo do limite: exemplos incluem encontrar encostas, sombreamento, estatísticas focais de bairro 3 x 3. Isso cria uma grade com uma célula anel grosso de NoData em torno de sua borda. Usar IsNull e SetNull para detectar células NoData e converter entre NoData e células de dados produz uma grade cheia de valores NoData, exceto ao redor do limite.)

whuber
fonte
Em resumo, o fluxo de trabalho consiste em calcular dois campos (as novas coordenadas) na tabela da camada de pontos original, criando uma camada de eventos de pontos a partir dessas novas coordenadas, executando a ferramenta Amostra e executando uma associação ao banco de dados (não uma associação espacial). Você poderia elaborar como fazer isso? (Você pode ver minhas fotos para o meu problema). Obrigado!
Visto
Eu tenho cerca de 15% de pontos com esse problema. como você pode determinar o x0 e o x1 para cada ponto?
Visto
11
@ Observe que x0, y0, x1, y1 são para as grades. As coordenadas do ponto (x, y) podem ser calculadas na Calculadora de Campo, conforme descrito na ajuda do ArcGIS ou em várias threads neste site. Existem itens de menu para fazer uma camada de pontos XY e junções de banco de dados: são operações básicas padrão.
whuber
4

Você pode converter a varredura em pontos ( ref ) e, em seguida, fazer uma junção espacial nos pontos (das rasters) para o ponto.

(Acabei de saber que os pontos podem ser unidos espacialmente aqui ontem )

djq
fonte
11
+1 para uma abordagem inteligente. Para grades grandes, quando isso se tornar impraticável, converta apenas as células de limite da varredura em pontos. (
Descrevo
Tenho milhares de células de cada layer e eu tenho 20 camadas assim ... então transformar aqueles em que pontos do vetor são demorado ...
Visto
Além disso, quando tento fazer varredura em polígono, recebo uma mensagem de erro como ERROR 000864 Varredura de entrada: A entrada não está no domínio definido. ERRO 000863: Tipo de dados GP inválido
visto
Você recebe um erro ao converter raster em pontos?
7111 djq
@celenius Funciona, mas demorou muito tempo.
Visto
1

Você pode converter a camada raster em um polígono usando a ferramenta Raster to Polygon e executar junção espacial (clique com o botão direito do mouse na camada de ponto e selecione Junções e relações - Junção, no primeiro menu suspenso, selecione a opção de junção espacial e selecione a opção mais próxima opção no botão Readio) ou use a ferramenta Próximo.

artwork21
fonte
Como você usa o resultado da junção espacial para extrair o valor raster apropriado?
whuber
@whuber, na caixa de diálogo Join Data, quando você seleciona a opção "está mais próximo", a junção espacial seleciona o recurso de polígono mais próximo (resultado da ferramenta Raster to Polygon) e adiciona essas informações de atributo ao recurso de ponto. É isso que sua pergunta estava perguntando? Minha resposta inicial foi postada antes da edição dele. Eu estou supondo que a varredura de Seen pode ter sido muito grande para converter em polígono?
artwork21
A idéia não é encontrar a varredura mais próxima. Realmente, o que se quer é uma maneira de extrapolar os valores de uma varredura além de sua extensão original. A pergunta propõe uma abordagem de vizinho mais próximo: em qualquer ponto próximo que não esteja na varredura, encontre a célula mais próxima na varredura e use o valor dessa célula.
whuber
Ao reler seu último comentário, parece que você está propondo transformar a varredura não em "um polígono", mas em uma camada de polígono com um polígono para cada célula (ou conjunto contíguo de células). Nesse caso, ele pode ser bem-sucedido com rasters muito pequenos, mas por que você propõe isso - que é uma operação complexa e cara (e funciona apenas para grades inteiras) - em vez da solução semelhante, mas mais eficiente, que o @celenius ofereceu anteriormente? Que vantagens sua solução oferece?
whuber
@ whuber, a camada de polígono está correta. Sim, o método celenius custaria menos memória.
artwork21