如何将数据框变成简单的特征数据框?
how to make a data frame into a simple features data frame?
我有一个 table 在给定的坐标参考系统中带有位置参考和 x 和 y 坐标。我想把它变成一个简单的特征数据框。我该如何创建它?
我认为可能是:
data_frame(place = "London",
lat = 51.5074, lon = 0.1278,
epsg = 4326) %>%
group_by(place) %>%
mutate(feature = st_point(c(lon, lat)))
但这会导致错误:
Error in mutate_impl(.data, dots) : Column feature
must be length 1 (the group size), not 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 列的数据框。我需要为每个地方创建这个简单的要素数据框,并将它们组合成一个更大的简单要素数据框。
更新
@Franz Plumpton 的答案是 单个 epsg 的正确解决方案。只有当 a data.frame 的每一行都有不同的 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 并组合成一个 data.frame:
do.call(rbind, lapply(l, function(x) x <- st_transform(x, 4326)))
您的尝试和接受的答案不必要地复杂并且非常混乱。只需使用 st_as_sf
(顺便说一下,它也可以轻松地从过时的 sp
class(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")
或者使用来自 ggplot2 的新的惊人 geom_sf
:
library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)
我有一个 table 在给定的坐标参考系统中带有位置参考和 x 和 y 坐标。我想把它变成一个简单的特征数据框。我该如何创建它?
我认为可能是:
data_frame(place = "London",
lat = 51.5074, lon = 0.1278,
epsg = 4326) %>%
group_by(place) %>%
mutate(feature = st_point(c(lon, lat)))
但这会导致错误:
Error in mutate_impl(.data, dots) : Column
feature
must be length 1 (the group size), not 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 列的数据框。我需要为每个地方创建这个简单的要素数据框,并将它们组合成一个更大的简单要素数据框。
更新 @Franz Plumpton 的答案是 单个 epsg 的正确解决方案。只有当 a data.frame 的每一行都有不同的 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 并组合成一个 data.frame:
do.call(rbind, lapply(l, function(x) x <- st_transform(x, 4326)))
您的尝试和接受的答案不必要地复杂并且非常混乱。只需使用 st_as_sf
(顺便说一下,它也可以轻松地从过时的 sp
class(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")
或者使用来自 ggplot2 的新的惊人 geom_sf
:
library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)