web-dev-qa-db-fra.com

Comment convertir un cadre de données en coordonnées spatiales

Je travaille sur des données sismiques qui ont des valeurs lat longues, et je souhaite convertir ces valeurs latérales en coordonnées spatiales.

Supposons que j'ai les données suivantes df:

longitude          latitude
        128.6979    -7.4197
        153.0046    -4.7089
        104.3261    -6.7541
        124.9019    4.7817
        126.7328    2.1643
        153.2439    -5.6500
        142.8673    23.3882
        152.6890    -5.5710

Je veux le convertir en points spatiaux. Quelque chose comme ça:

 lon        lat  
[1,] 2579408.24 1079721.15
[2,] 2579333.69 1079729.18
[3,] 2579263.65 1079770.55
[4,] 2579928.04 1080028.46
[5,] 2579763.65 1079868.92
[6,] 2579698.00 1079767.97

J'ai utilisé le code suivant:

library(sp)
df.sp<-df
coordinates(df.sp)<-~x+y

Mais je reçois l'erreur suivante:

Error in `[.data.frame`(object, , -coord.numbers, drop = FALSE) : 
  undefined columns selected
39
mk04

Tout d’abord, prenez les colonnes de lon et lat et créez un objet pour coord. Ensuite, vous les soustrayez du cadre de données d'origine et créez un nouvel objet. Vous utilisez finalement SpatialPointsDataFrame() pour créer un SpatialPointsDataFrame. Lorsque vous créez un SpatialPointsDataFrame, vous devez attribuer proj4string. Choisissez-en un qui vous convient.

Dans votre cas, vous n'avez aucune autre colonne que lon et lat, la méthode ne fonctionnera pas. J'ai volontairement laissé lon et lat @data.

LES DONNÉES

mydf <- structure(list(longitude = c(128.6979, 153.0046, 104.3261, 124.9019, 
126.7328, 153.2439, 142.8673, 152.689), latitude = c(-7.4197, 
-4.7089, -6.7541, 4.7817, 2.1643, -5.65, 23.3882, -5.571)), .Names = c("longitude", 
"latitude"), class = "data.frame", row.names = c(NA, -8L))


### Get long and lat from your data.frame. Make sure that the order is in lon/lat.

xy <- mydf[,c(1,2)]

spdf <- SpatialPointsDataFrame(coords = xy, data = mydf,
                               proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))


#> str(spdf)
#Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
#..@ data       :'data.frame':  8 obs. of  2 variables:
#.. ..$ longitude: num [1:8] 129 153 104 125 127 ...
#.. ..$ latitude : num [1:8] -7.42 -4.71 -6.75 4.78 2.16 ...
#..@ coords.nrs : num(0) 
#..@ coords     : num [1:8, 1:2] 129 153 104 125 127 ...
#.. ..- attr(*, "dimnames")=List of 2
#.. .. ..$ : NULL
#.. .. ..$ : chr [1:2] "longitude" "latitude"
#..@ bbox       : num [1:2, 1:2] 104.33 -7.42 153.24 23.39
#.. ..- attr(*, "dimnames")=List of 2
#.. .. ..$ : chr [1:2] "longitude" "latitude"
#.. .. ..$ : chr [1:2] "min" "max"
#..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
#.. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
42
jazzurro

Ou en utilisant sf au lieu de sp objets (pour en savoir plus sur fonctionnalités simples pour R ou pour migrer de sp à sf - ici ):

require(sf)
my.df <- read.table(text="
                    longitude    latitude
                    128.6979    -7.4197
                    153.0046    -4.7089
                    104.3261    -6.7541
                    124.9019    4.7817
                    126.7328    2.1643
                    153.2439    -5.6500
                    142.8673    23.3882
                    152.6890    -5.5710",
                    header=TRUE)

my.sf.point <- st_as_sf(x = my.df, 
                        coords = c("longitude", "latitude"),
                        crs = "+proj=longlat +datum=WGS84")
# simple plot
plot(my.sf.point)
# interactive map:
require(mapview)
mapview(my.sf.point)

# convert to sp object if needed
my.sp.point <- as(my.sf.point, "Spatial")

enter image description here

31
Valentin

Avec

structure(list(longitude = c(128.6979, 153.0046, 104.3261, 124.9019, 
126.7328, 153.2439, 142.8673, 152.689), latitude = c(-7.4197, 
-4.7089, -6.7541, 4.7817, 2.1643, -5.65, 23.3882, -5.571)), .Names = c("longitude", "latitude"), class = "data.frame", row.names = c(NA, -8L))

Pour convertir en SpatialPointsDataFrame

coordinates(df) <- cbind(df$longitude , df$latitude)

Comme l'a souligné @jazzurro, vous devrez probablement attribuer un CRS à votre objet géographique.

proj4string(df) = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")

le processus inverse SpatialPointsDataFrame en df d'origine

df <- data.frame(longitude = coordinates(df)[,1], latitude = coordinates(df)[,2])
6
G. Cocca