Convertendo dados de ponto em quadro de dados com grade para análise de histograma usando R?

14

Sou muito novo no uso de dados GIS e tenho pouca experiência com R. Estive lendo sobre como analisar dados espaciais usando o livro PDF de spatial-analyst.net, por isso não estou completamente perdido, mas achei que poderia descrever meu problema e as pessoas podem sugerir idéias.

Eu tenho um conjunto de dados com cerca de 2000 medições em diferentes coordenadas latinas / longas, embora provavelmente subdividi-lo, pois os dados foram coletados ao longo de 3 anos e as condições foram alteradas ao longo do tempo. Vamos chamar a variável que está sendo medida "IP".

Desejo criar um mapa de IP em toda a área em questão usando Kriging ou algum outro método de interpolação nos dados de amostra. Quero criar um histograma medindo a quantidade de terra em vários buckets de IP. Também precisarei criar um histograma que mostre o número de amostras em cada bloco (observe que uma amostra pode ter um IP real maior ou menor do que o que o kriging prevê para sua terra).

Eu sigo como carregar os dados em um SpatialPointsDataFrame e executar uma análise de krigagem, onde estou tendo problemas é como converter esses dados em um dataframe com grade para que eu possa fazer a análise do histograma.

Alguma sugestão para converter pontos em grades?

user1080253
fonte

Respostas:

12

Você está certo ... é muito fácil! O pacote "raster" possui algumas maneiras bem simples de lidar com a criação e manipulação de rasters.

library(maptools)
library(raster)

# Load your point shapefile (with IP values in an IP field):
pts <- readShapePoints("pts.shp")

# Create a raster, give it the same extent as the points
# and define rows and columns:

rast <- raster()
extent(rast) <- extent(pts) # this might be unnecessary
ncol(rast) <- 20 # this is one way of assigning cell size / resolution
nrow(rast) <- 20

# And then ... rasterize it! This creates a grid version 
# of your points using the cells of rast, values from the IP field:
rast2 <- rasterize(pts, rast, pts$IP, fun=mean) 

Você pode atribuir o tamanho e a resolução da grade de várias maneiras - dê uma boa olhada na documentação do pacote raster.

Os valores das células rasterizadas de rasterize podem ser calculados com uma função - 'mean' no exemplo acima. Certifique-se de colocar isso: caso contrário, ele apenas usa o valor de IP desde o último ponto em que aparece!


De um CSV:

pts <- read.csv("IP.csv")
coordinates(pts) <- ~lon+lat
rast <- raster(ncol = 10, nrow = 10)
extent(rast) <- extent(pts)
rasterize(pts, rast, pts$IP, fun = mean)
Simbamangu
fonte
Ei, isso é muito útil, mas como seria o código se eu iniciasse com os pontos em um CSV simples com lat / longs em vez de um shapefile? As colunas na CSV seria IP, Lat, Long, etc, etc, etc.
user1080253
Você indicou que já carregou os dados em um SpatialPointsDataFrame ... que é exatamente o que ptsestá no meu exemplo acima. Basta executar o código no seu objeto SpatialPointsDataFrame!
Simbamangu
4
Essa resposta, embora excelente, parece não abordar o que é necessário. (Parece oferecer uma solução para gis.stackexchange.com/questions/20018 .) O desafio é interpolar cerca de 2000 pontos, não apenas atribuir seus valores às células raster. Dado que o OP já afirma ter "executado uma análise de krigagem", essa questão se resume a extrair os valores de uma varredura (digamos r) para uso em um histprocedimento semelhante, que é simplesmente uma questão de expressão hist(getValues(r)).
whuber
@whuber - Parece que o OP pergunta "onde estou tendo problemas é como converter esses dados em um quadro de dados em grade para que eu possa fazer a análise do histograma ... qualquer sugestão para converter pontos em grades" como a pergunta real, e sabe como para criar um SpatialPointsDataFrame e executar o kriging. Mas você está certo, parece ser uma duplicata de 20018 (exceto para entrada em grade).
Simbamangu
Desculpas, @ user1080253 ... Eu li 'grid' como 'raster', o que não está correto e não é útil para o kriging; veja aqui para ter uma idéia melhor sobre como criar uma grade regular e interpolar seus dados para essa grade.
Simbamangu
3

O pacote plotKML tem uma função chamada vect2rast. Essa função basicamente estende a rasterizefunção disponível no pacote raster. A vantagem de vect2rast; no entanto, é que ele não requer nenhuma entrada do lado do usuário, ou seja, determina automaticamente o tamanho da célula da grade e a caixa delimitadora com base nas propriedades do conjunto de dados de entrada. O tamanho da célula da grade é estimado com base na densidade / tamanho dos recursos no mapa ( nndistfunção no pacote spatstat).

library(plotKML)
Rast2 <- vect2rast(pts)

# for large data sets use SAGA GIS:
Rast2 <- vect2rast(pts, method = "SAGA")
HassanSh__3571619
fonte