web-dev-qa-db-fra.com

Créer des points de données spatiaux

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   ..   ..   ..   ..   ..   ..    .. 
12
Stophface

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.

15
hrbrmstr

Pour faire un SpatialPointsDataFrame vous avez besoin de 3 composants:

  1. coordonnées
  2. données
  3. 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")

enter image description here

4
Rich Pauloo