用 st_buffer 围绕一个地理点
circle around a geographic point with st_buffer
我想使用 sf
包在都柏林机场周围绘制一个 110 海里(海里)的圆。
(稍后我将通过 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)
我应该在 st_buffer
中输入 dist
的单位是什么?
我阅读了文档,但并没有真正找到该怎么做...
任何hints/helps真的很感激!
如 Phil 所述,您需要将坐标转换为米/'distance' 投影,而不是基于度数的投影。
我不熟悉 sf
,但是 sp
...
library(sp)
dub_transformed <- spTransform(dub,CRS("+init=epsg:29902"))
...在您 运行 之前,缓冲区命令应该足够了。
然后您可能希望将缓冲对象转换回 epsg:4326 以进行 plotting/additional 处理。例如
dub110 <- spTransform(dub110,CRS("+init=epsg:4326"))
如果您愿意,这里有一个纯粹的 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)
然后将坐标转换为Irish Grid:
dub = st_transform(dub, 29902)
在这一点附近以米为单位创建缓冲区:
dub_buffer = st_buffer(dub, 110000)
绘制结果:
plot(dub_buffer)
plot(dub, add = TRUE)
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)
我想使用 sf
包在都柏林机场周围绘制一个 110 海里(海里)的圆。
(稍后我将通过 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)
我应该在 st_buffer
中输入 dist
的单位是什么?
我阅读了文档,但并没有真正找到该怎么做...
任何hints/helps真的很感激!
如 Phil 所述,您需要将坐标转换为米/'distance' 投影,而不是基于度数的投影。
我不熟悉 sf
,但是 sp
...
library(sp)
dub_transformed <- spTransform(dub,CRS("+init=epsg:29902"))
...在您 运行 之前,缓冲区命令应该足够了。 然后您可能希望将缓冲对象转换回 epsg:4326 以进行 plotting/additional 处理。例如
dub110 <- spTransform(dub110,CRS("+init=epsg:4326"))
如果您愿意,这里有一个纯粹的 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)
然后将坐标转换为Irish Grid:
dub = st_transform(dub, 29902)
在这一点附近以米为单位创建缓冲区:
dub_buffer = st_buffer(dub, 110000)
绘制结果:
plot(dub_buffer)
plot(dub, add = TRUE)
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)