【问题标题】:How to Convert data frame to spatial coordinates如何将数据框转换为空间坐标
【发布时间】:2015-06-26 12:15:51
【问题描述】:

我一直在研究具有 lat long 值的地震数据,我想将这些 lat long 值转换为空间坐标。

假设我有以下数据集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

我想把它转换成空间点。 像这样的:

 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

我使用了以下代码:

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

但我收到以下错误:

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

【问题讨论】:

  • 这里的错误来自xy没有被定义。在此示例中,您的 x 和 y 是 df$longitudedf$latitude。因此,一种解决方案是运行:coordinates(df.sp)&lt;-~ df$longitude + df$latitude

标签: r gis geospatial


【解决方案1】:

首先,获取lonlat 的列,并为coord 创建一个对象。然后,从原始数据框中减去它们并创建一个新对象。您最终使用SpatialPointsDataFrame() 创建了一个SpatialPointsDataFrame。创建SpatialPointsDataFrame 时,需要分配proj4string。为您选择一个合适的。

在您的情况下,除了lonlat,您没有任何其他列,该方法将不起作用。我故意离开了lonlat @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"

【讨论】:

  • 与上面相反的是什么。我想将 SpatialPointsDataFrame xy 坐标转换为 LAT LON?谢谢!
  • @M.Qasim 如果您使用上面的示例,似乎以下两种方式可以让您提取 lon 和 lat。 spdf@data,这是一个数据框,或spdf@coords,这是一个矩阵。
  • @jazzurro,假设您拥有一个城市的所有纬度,经度可以生成类似于stackoverflow.com/questions/40179966/… 的边界多边形如果不是创建边界多边形,如一个在链接中发送?
  • @MHOOS 我看了一下这个问题。恐怕我不知道你怎么能画出这样的多边形。我能想到的所有想法都已经在答案中了。
  • 这是一个过时的解决方案,因为sf 是新的方法。请参阅此线程或此处的其他答案:stackoverflow.com/a/52951856/4624994
【解决方案2】:

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))

转换为 SpatialPointsDataFrame

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

正如@jazzurro 所指出的,您可能需要为您的空间对象分配一个 CRS。

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

将SpatialPointsDataFrame反向处理为原始df

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

【讨论】:

    【解决方案3】:

    或者使用sf 代替sp 对象(查看更多关于Simple Features for R 或从sp 迁移到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")
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多