Conversion de données ponctuelles en trame de données quadrillée pour l'analyse d'histogramme à l'aide de R?

14

Je suis très nouveau dans l'utilisation des données SIG et je n'ai qu'une expérience modeste de R. J'ai lu comment analyser les données spatiales en utilisant le livre PDF spatial-analyst.net, donc je ne suis pas complètement perdu, mais je pensais pouvoir décrire mon problème et les gens pourraient suggérer des idées.

J'ai un ensemble de données avec environ 2000 mesures à différentes coordonnées lat / long, bien que je subdiviserai probablement cet ensemble de données car les données ont été collectées sur 3 ans et les conditions ont changé au fil du temps. Appelons la variable mesurée "IP".

Je veux créer une carte IP dans toute la zone en question en utilisant le krigeage ou une autre méthode d'interpolation sur les données d'échantillon. Ensuite, je veux créer un histogramme mesurant la quantité de terrain dans divers compartiments IP. Je devrai également créer un histogramme qui montre le nombre d'échantillons dans chaque compartiment (notez qu'un échantillon peut avoir une IP réelle supérieure ou inférieure à ce que le krigeage prédit pour sa terre).

Je montre comment charger les données dans un SpatialPointsDataFrame et exécuter une analyse de krigeage, où j'ai du mal à savoir comment convertir ces données en un cadre de données maillé afin de pouvoir faire l'analyse de l'histogramme.

Des suggestions pour convertir des points en grilles?

user1080253
la source

Réponses:

12

Tu as raison ... c'est assez facile! Le package "raster" propose des méthodes assez simples pour gérer la création et la manipulation 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) 

Vous pouvez attribuer la taille et la résolution de la grille de plusieurs façons - jetez un œil à la documentation du package raster.

Les valeurs des cellules raster de rasterize peuvent être calculées avec une fonction - «moyenne» dans l'exemple ci-dessus. Assurez-vous de le mettre: sinon, il utilise simplement la valeur IP du dernier point qu'il rencontre!


Depuis un 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
la source
Hé, c'est très utile, mais à quoi ressemblerait le code si je commençais avec les points dans un simple CSV avec lat / longs plutôt qu'avec un shapefile? Les colonnes dans le CSV seraient IP, Lat, Long, etc, etc, etc.
user1080253
Vous avez indiqué que vous avez déjà chargé les données dans un SpatialPointsDataFrame ... qui est exactement ce qui ptsest dans mon exemple ci-dessus. Exécutez simplement le code sur votre objet SpatialPointsDataFrame!
Simbamangu
4
Cette réponse, bien qu'excellente, ne semble pas répondre à ce qui est nécessaire. (Il semble plutôt offrir une solution à gis.stackexchange.com/questions/20018 .) Le défi consiste à interpoler environ 2000 points, et pas seulement à affecter leurs valeurs aux cellules raster. Étant donné que l'OP prétend déjà avoir "exécuté une analyse de krigeage", cette question se résume à extraire les valeurs d'un raster (disons r) pour les utiliser dans une histprocédure similaire, qui est simplement une question d'expression hist(getValues(r)).
whuber
@whuber - On dirait que OP demande "où j'ai du mal à savoir comment convertir ces données en une trame de données maillées pour que je puisse faire l'analyse de l'histogramme ... toutes suggestions pour convertir des points en grilles" comme question réelle, et sait comment pour créer un SpatialPointsDataFrame et exécuter le krigeage. Mais vous avez raison, il semble que ce soit un doublon de 20018 (sauf pour les entrées quadrillées).
Simbamangu
Toutes mes excuses, @ user1080253 ... J'ai lu «grille» comme «raster», ce qui n'est pas correct et n'est pas utile pour le krigeage; voyez ici pour une meilleure idée sur la création d'une grille régulière et l'interpolation de vos données sur cette grille.
Simbamangu
3

Le package plotKML a une fonction appelée vect2rast. Cette fonction étend essentiellement la rasterizefonction disponible dans le package raster. L'avantage de vect2rast; cependant, il ne nécessite aucune entrée du côté de l'utilisateur, c'est-à-dire qu'il détermine automatiquement la taille des cellules de la grille et le cadre de délimitation en fonction des propriétés de l'ensemble de données d'entrée. La taille des cellules de la grille est estimée en fonction de la densité / taille des entités sur la carte ( nndistfonction dans le package spatstat).

library(plotKML)
Rast2 <- vect2rast(pts)

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