Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Convert data frame to spatial coordinates

Tags:

r

gis

geospatial

I have been working on earthquake data that has lat long values, and I want to convert those lat long values to spatial coordinates.

Suppose I have the following data set 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 

I want to convert it into spatial points. Something like this:

 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 

I used the following code:

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

But I receive the following error:

Error in `[.data.frame`(object, , -coord.numbers, drop = FALSE) :    undefined columns selected 
like image 324
mk04 Avatar asked Apr 19 '15 22:04

mk04


People also ask

What is a spatial points data frame?

names (i.e. is a data. frame), then the SpatialPointsDataFrame object is formed by matching the row names of both components, leaving the order of the coordinates in tact. Checks are done to see whether both row names are sufficiently unique, and all data are matched.

What is a spatial data frame in R?

In sf spatial objects are stored as a simple data frame with a special column that contains the information for the geographic coordinates. That special column is a list with the same length as the number of rows in the data frame.


2 Answers

First, you take the columns of lon and lat and create an object for coord. Then, you subtract them from the original data frame and create a new object. You finally use SpatialPointsDataFrame() to create a SpatialPointsDataFrame. When you create a SpatialPointsDataFrame, you need to assign proj4string. Choose an appropriate one for you.

In your case, you do not have any other columns but lon and lat, the method won't work. I purposely left lon and lat @data.

DATA

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" 
like image 197
jazzurro Avatar answered Sep 23 '22 02:09

jazzurro


Or using sf instead of sp objects (check out more about Simple Features for R or migrating from sp to sf here):

library(sf)  # the given data above 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)  # Convert data frame to sf object my.sf.point <- st_as_sf(x = my.df,                          coords = c("longitude", "latitude"),                         crs = "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")  # simple plot plot(my.sf.point)  # interactive map: library(mapview) mapview(my.sf.point)  # convert to sp object if needed my.sp.point <- as(my.sf.point, "Spatial") 

enter image description here

like image 37
Valentin Avatar answered Sep 23 '22 02:09

Valentin