[英]How to Convert data frame to spatial coordinates
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
:假设我有以下数据集
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
First, you take the columns of lon
and lat
and create an object for coord
.首先,您使用
lon
和lat
列并为coord
创建一个对象。 Then, you subtract them from the original data frame and create a new object.然后,从原始数据框中减去它们并创建一个新对象。 You finally use
SpatialPointsDataFrame()
to create a SpatialPointsDataFrame
.最后使用
SpatialPointsDataFrame()
创建SpatialPointsDataFrame
。 When you create a SpatialPointsDataFrame
, you need to assign proj4string
.创建
SpatialPointsDataFrame
,需要分配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.在您的情况下,除了
lon
和lat
,您没有任何其他列,该方法将不起作用。 I purposely left lon
and lat
@data.我故意离开了
lon
和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"
Or using sf
instead of sp
objects (check out more about Simple Features for R or migrating from sp
to sf
here ):或者使用
sf
而不是sp
对象(查看更多关于R 的简单功能或从sp
迁移到sf
在这里):
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")
With和
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))
To convert to SpatialPointsDataFrame转换为 SpatialPointsDataFrame
coordinates(df) <- cbind(df$longitude , df$latitude)
As pointed out by @jazzurro you will probably need to assign a CRS to your spatial object.正如@jazzurro 所指出的,您可能需要为空间对象分配一个 CRS。
proj4string(df) = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
the reverse process SpatialPointsDataFrame to original df将 SpatialPointsDataFrame 反向处理为原始 df
df <- data.frame(longitude = coordinates(df)[,1], latitude = coordinates(df)[,2])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.