特定の座標参照系に場所参照と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
は2ではなく長さ1(グループサイズ)である必要があります
これはおそらく非常に簡単に実行できます。ドキュメントで簡単に説明されていないだけです。ほとんどの空間アナリストは、デフォルトでより良いデータを要求しているようです:)。
私も試してみようと思いました:
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)
}))
パイプの最後に、他の方法と同じようにプロットおよび操作できる単純なフィーチャデータフレームが必要です。
私がやろうとしていることのもう1つの摩擦は、EPSGの列を持つデータフレームがあることです。場所ごとにこの単純な特徴データフレームを作成し、それらをすべて組み合わせて、より大きな単純な特徴データフレームにする必要があります。
更新@FranzPlumptonからの回答は、単一のepsgの正しい正しい解決策です。以下の私の答えは、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
クラス(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")
または新しい驚くべきgeom_sf
ggplot2から:
library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)