r - 用 st_buffer 围绕一个地理点

标签 r sf

我想使用 sf 在都柏林机场周围绘制一个 110 NM(海里)的圆圈包裹。
(稍后我将通过 st_intersect 与来自 ADS-B 的航类位置报告相交。)

我为 NM 定义了一个新单位,如下所示:

library(units)
library(tidyverse)
library(sf)
NM <- make_unit("NM")
install_conversion_constant("NM", "km", 1.852)

然后定义都柏林机场坐标:
# DUB/EIDW location, see 
# https://skyvector.com/airport/EIDW/Dublin-Airport
# Coordinates:
#   N53°25.28' / W6°16.20' (Degrees Decimal Minutes (DDM) format)
#   (-6.27, 53.421333) (lon/lat Decimal Degrees (DD))
# Elevation: 242.0 feet (MSL)
dub_lon <- -6.27
dub_lat <- 53.421333
dub_elv <- set_units(242.0, ft)

dub <- st_point( x = c(dub_lon, dub_lat, dub_elv), dim = "XYZ")
dub <- dub %>% st_sfc(crs = 4326)

因此定义了机场周围圆的半径(以米为单位):
r110 <- set_units(110, NM) %>% set_units(km)

现在当我尝试时 st_buffer事情不工作:
> r110 <- set_units(110, NM) %>% set_units(km)
Error: cannot convert km into °
In addition: Warning message:
In st_buffer.sfc(dub, dist = r110) :
  st_buffer does not correctly buffer longitude/latitude data, dist needs to be in decimal degrees.

如果我尝试传递一个数值( 203.72 ,这些是公里)作为距离,至少我只会收到一个警告:
> dub110 <- st_buffer(dub, dist = 203.72)
Warning message:
In st_buffer.sfc(dub, dist = 203.72) :
  st_buffer does not correctly buffer longitude/latitude data, dist needs to be in decimal degrees.

但是绘制它显示了一个太大的圆圈
library(mapview)
mapview(dub110)

enter image description here
dist的单位是什么我应该输入st_buffer ?
我阅读了文档,但并没有真正找到该怎么做...

任何提示/帮助真的很感激!

最佳答案

感谢 PhilJul最初问题的完整解决方案如下:

library(units)
library(tidyverse)
library(sf)
library(mapview)
library(units)

# define nautical miles (as per ICAO notation)
NM <- make_unit("NM")
install_conversion_constant("NM", "km", 1.852)

# DUB/EIDW location, see
# https://skyvector.com/airport/EIDW/Dublin-Airport
# Coordinates:
#   N53°25.28' / W6°16.20' (Degrees Decimal Minutes (DDM) format)
#   (-6.27, 53.421333) (lon/lat Decimal Degrees (DD))
# Elevation: 242.0 feet (MSL)
dub_lon <- -6.27
dub_lat <- 53.421333
dub_elv <- set_units(242.0, ft)
dub <- st_point(x = c(dub_lon, dub_lat, dub_elv), dim = "XYZ")
dub <- dub %>% st_sfc(crs = 4326)

# define radious of interest, i.e. 110 NM
r110 <- set_units(110, NM) %>% set_units(km) %>% set_units(m)

# change to Irish grid, which uses meters
dub <- st_transform(dub, 29902)
dub_buffer <-  st_buffer(dub, r110)

# eventually convert back to WSG84 if needed for other purposes
dub <- st_transform(dub, 4326)
dub_buffer <- st_transform(dub_buffer, 4326)
mapview(dub_buffer)

enter image description here

关于r - 用 st_buffer 围绕一个地理点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46704878/

相关文章:

r - 如何在 R 中绘制二元状态时间序列?

r - 将 sf 转换为未标记的 ppp

r - 保留完全或部分在一个更大的多边形内的多边形,没有负缓冲区

r - 通过非 sf 列内部连接两个 sf 对象

python - arcpy 中同一数据集中所有对象的重叠 (st_overlaps)

r - 如何在 dplyr::across() 中使用 n() 按组计算行数?

r - 如何将具有单列的 R 数据框转换为 tm 的语料库,以便每一行都被视为文档?

r - 鱿鱼游戏第 7 集与模拟

r - 以整洁的方式将字符串列表转换为 data.frame