使用st_buffer围绕地理点圈出

esp*_*lli 7 r r-sf

我想使用sf包裹在都柏林机场附近绘制一个110海里(海里)的圆圈.(稍后我将通过st_intersectADS-B的航班位置报告与之相交.)

我为NM定义了一个新单元如下:

library(units)
library(tidyverse)
library(sf)
NM <- make_unit("NM")
install_conversion_constant("NM", "km", 1.852)
Run Code Online (Sandbox Code Playgroud)

然后定义都柏林机场坐标:

# 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)
Run Code Online (Sandbox Code Playgroud)

因此,定义了机场周围的圆的半径(以米为单位):

r110 <- set_units(110, NM) %>% set_units(km)
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试的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.
Run Code Online (Sandbox Code Playgroud)

如果我尝试传递一个数值(203.72,这些是km)作为距离至少我得到一个警告:

> 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.
Run Code Online (Sandbox Code Playgroud)

但是绘制它显示了一个相当大的圈子

library(mapview)
mapview(dub110)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

dist我应该输入什么单位st_buffer?我阅读了文档,但没有真正找到该做什么......

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

esp*_*lli 8

感谢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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Phi*_*hil 5

sf如果您愿意,这里有一个纯粹的答案,但 @Jul 完全可用。

设置为您的示例:

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)
Run Code Online (Sandbox Code Playgroud)

然后将您的坐标转换为Irish Grid

dub = st_transform(dub, 29902)
Run Code Online (Sandbox Code Playgroud)

在此点附近以米为单位创建缓冲区:

dub_buffer = st_buffer(dub, 110000)
Run Code Online (Sandbox Code Playgroud)

绘制结果:

plot(dub_buffer)
plot(dub, add = TRUE)
Run Code Online (Sandbox Code Playgroud)