J'ai une trame de données df1
avec 10 colonnes. Deux de ces colonnes sont lng
et lat
. Je veux créer un SpatialPointsDataframe
à partir de df1
. Quand je lis comment créer un SpatialPointsDataframe j'ai l'impression de devoir créer une matrice m1
à partir de mes deux colonnes de coordonnées, puis affectez cette matrice au cadre de données "pdf1".
Ce serait un détour puisque mes coordonnées sont déjà une colonne dans mon dataframe df1
. De plus, comment puis-je m'assurer que les coordonnées de ma matrice m1
sont affectés aux lignes correctes de mon cadre de données df1
?
c'est comme ça que mon df1
ressemblerait
> df1
a b c d e lat lng
1 12 f2 23 dd 2d 15.6 80.9
2 12 g5 99 NA hh 20.9 10.9
3 13 g4 12 aa 3r3 1.2 81.8
4 .. .. .. .. .. .. ..
Il utilise l'ordre des lignes pour assurer la correspondance entre les coordonnées et les données. Et, vous pouvez lui dire quelles colonnes utiliser pour lon/lat. Voici quelques exemples qui, espérons-le, clarifient un peu les choses:
library(sp)
dat_orig <- read.table(text=" a b c d e lat lng
12 f2 23 dd 2d 15.6 80.9
12 g5 99 NA hh 20.9 10.9
13 g4 12 aa 3r3 1.2 81.8", header=TRUE, stringsAsFactors=FALSE)
dat <- dat_orig
coordinates(dat) <- ~lng+lat
dat
## coordinates a b c d e
## 1 (80.9, 15.6) 12 f2 23 dd 2d
## 2 (10.9, 20.9) 12 g5 99 <NA> hh
## 3 (81.8, 1.2) 13 g4 12 aa 3r3
dat_1 <- dat_orig
colnames(dat_1) <- c(colnames(dat_1)[1:5], "steve", "larry")
coordinates(dat_1) <- ~larry+steve
dat_1
## coordinates a b c d e
## 1 (80.9, 15.6) 12 f2 23 dd 2d
## 2 (10.9, 20.9) 12 g5 99 <NA> hh
## 3 (81.8, 1.2) 13 g4 12 aa 3r3
dat_2 <- SpatialPointsDataFrame(dat_orig[,c("lng", "lat")], dat_orig[,1:5])
dat_2
## coordinates a b c d e
## 1 (80.9, 15.6) 12 f2 23 dd 2d
## 2 (10.9, 20.9) 12 g5 99 <NA> hh
## 3 (81.8, 1.2) 13 g4 12 aa 3r3
dat_3 <- dat_orig
colnames(dat_3) <- c(colnames(dat_3)[1:5], "steve", "larry")
dat_3 <- SpatialPointsDataFrame(dat_3[,c("larry", "steve")], dat_3[,1:5])
dat_3
## coordinates a b c d e
## 1 (80.9, 15.6) 12 f2 23 dd 2d
## 2 (10.9, 20.9) 12 g5 99 <NA> hh
## 3 (81.8, 1.2) 13 g4 12 aa 3r3
Et voici ce que coordinates<-
fait sous les couvertures:
setReplaceMethod("coordinates", signature(object = "data.frame", value = "ANY"),
function(object, value) {
coord.numbers = NULL
if (inherits(value, "formula")) {
cc = model.frame(value, object, na.action = na.fail) # retrieve coords
if (dim(cc)[2] == 2) {
nm = as.character(as.list(value)[[2]])[2:3]
coord.numbers = match(nm, names(object))
} else if (dim(cc)[2] == 3) {
nm = c(as.character(as.list((as.list(value)[[2]])[2])[[1]])[2:3],
as.character(as.list(value)[[2]])[3])
coord.numbers = match(nm, names(object))
} # else: give up.
} else if (is.character(value)) {
cc = object[, value] # retrieve coords
coord.numbers = match(value, names(object))
} else if (is.null(dim(value)) && length(value) > 1) { # coord.columns?
if (any(value != as.integer(value) || any(value < 1)))
stop("coordinate columns should be positive integers")
cc = object[, value] # retrieve coords
coord.numbers = value
} else # raw coordinates given; try transform them to matrix:
cc = coordinates(value)
if (any(is.na(cc)))
stop("coordinates are not allowed to contain missing values")
if (!is.null(coord.numbers)) {
object = object[ , -coord.numbers, drop = FALSE]
stripped = coord.numbers
# ... but as.data.frame(x) will merge them back in, so nothing gets lost.
if (ncol(object) == 0)
#stop("only coords columns present: use SpatialPoints to create a points object")
return(SpatialPoints(cc))
} else
stripped = numeric(0)
SpatialPointsDataFrame(coords = cc, data = object, coords.nrs = stripped,
match.ID = FALSE)
}
)
Ce qui montre qu'il fait juste l'idiome SpatialPointsDataFrame
pour vous dans un appel plus court.
SpatialPointsDataFrame
vous avez besoin de 3 composants:proj4string
de vos coordonnées [également appelé système de référence des coordonnées (CRS)]# load spatial library and built-in dataset
library(sp) # spatial library
data(meuse) # load built in dataset
# prepare the 3 components: coordinates, data, and proj4string
coords <- meuse[ , c("x", "y")] # coordinates
data <- meuse[ , 3:14] # data
crs <- CRS("+init=epsg:28992") # proj4string of coords
# make the spatial points data frame object
spdf <- SpatialPointsDataFrame(coords = coords,
data = data,
proj4string = crs)
# check the object class
class(spdf)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
# plot the copper column
spplot(spdf, "copper")