如何将一个数据框转换为简单要素数据框?

24
我有一个包含地点参考、x和y坐标的表格,使用给定的坐标参考系统。我想将其转换为一个简单的要素数据框。我应该如何创建它呢?我原以为可能是:
data_frame(place = "London", 
           lat = 51.5074, lon = 0.1278, 
           epsg = 4326) %>%
  group_by(place) %>%
  mutate(feature = st_point(c(lon, lat)))

但这会导致一个错误:
错误在 mutate_impl(.data, dots) 中:列 feature 的长度必须为1(组大小),而不是2
这可能很简单,只是我在文档中没有看到相关讨论。大多数空间分析师似乎默认要求更好的数据 :)
我还想尝试:
data_frame(place = "London", 
           lat = 51.5074, lon = 0.1278, 
           epsg = 4326) %>%
  group_by(place) %>%
  do(with(., {
    p <- st_point(c(lon, lat))
    pcol <- st_as_sfc(p)
    st_as_sf(data_frame(place = place,
                        point = pcol),
             crs = epsg)
  }))

在管道的末端,我希望得到一个简单的特征数据框,可以像其他任何数据框一样进行绘图和操作。
我尝试做的另一个问题是,我有一个包含EPSG列的数据框。我需要为每个地点创建这个简单特征数据框,并将它们合并成一个更大的简单特征数据框。

那么这里期望的输出是什么?您想要在数据框中存储一个 st_point 对象吗? - MrFlick
2
请检查 st_as_sf如何将数据框转换为空间坐标 - Henrik
@MrFlick 我想创建一个类似文档中的nc的简单特征数据框。我有成千上万个这些坐标存储在数据库中,并引用它们的espg。但默认情况下,它们没有以任何GIS友好的方式存储。 - wdkrnls
谢谢,@Henrik。我想这就是我想知道的。不知怎么错过了coords参数。 - wdkrnls
如果这是一个重复的问题,那么基于我之前的评论,还有一个更广泛的部分需要考虑。我已经将其添加到问题中。 - wdkrnls
2个回答

45

你的尝试以及被接受的答案不必要地复杂而且非常令人困惑。只需要使用st_as_sf(顺便提一下,它还可以轻松地迁移所有对象,包括过时的sp类(例如SpatialPolygonsDataFrames等)):

df <- data.frame(place = "London", 
       lat = 51.5074, lon = 0.1278,
       population = 8500000) # just to add some value that is plotable
projcrs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
df <- st_as_sf(x = df,                         
           coords = c("lon", "lat"),
           crs = projcrs)

我们完成了,就这么简单。

为了直观一些:

library(tmap)
data("World")    
tm_shape(World[World$iso_a3 == "GBR", ]) + tm_polygons("pop_est") + 
    tm_shape(df) + tm_bubbles("population")

tmap way

或者使用ggplot2中的新奇妙的geom_sf

library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)

ggplot2 way


4
请阅读原帖中的最后一部分问题 - 当数据框具有多个epsg值时,需要将它们转换为通用的epsg。这正是我的回答所涉及的。st_as_sf函数的crs参数不接受多个值。我在回答中解决了这个问题。 - sebdalgarno

7

更新 @Franz Plumpton的回答是具有单个EPSG的正确解决方案。我的下面的回答仅在数据框的每一行具有不同EPSG时才是必要的。否则,这将是一个重复(如@ Henrik所指出的那样)。

library(sf)
library(tibble)

df <- data_frame(place = c("London", "Kalamazoo"), 
           lat = c(51.5074, 396088), lon = c(0.1278, 5452158),
           epsg = c(4326, 32610))

l <- lapply(unique(df$place), function(x){
  df <- df[df$place == x,]
  epsg <- df$epsg[1]
  df  <-  st_as_sf(df, coords = c('lon', 'lat'), crs = epsg)
}) 

您可以将所有数据转换为相同的EPSG并合并到单个数据框中:
do.call(rbind, lapply(l, function(x) x <- st_transform(x, 4326)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接