我目前遇到一个问题,我正在尝试将矩形多边形投影到北美地图上。我的问题源于这样一个事实:我在纬度/经度中指定多边形,然后对其进行投影。函数
st_transform
能够准确地变换多边形的点,但不能精确地变换连接这些点的线。如何让线条随着整个形状变换?
此代码是一个可重现的示例:
library(sf)
library(spData)
library(dplyr)
library(ggplot2)
data(world)
proWorld <- st_transform(world, "EPSG:9311")
box <- st_bbox(c(xmin = -110,
ymin = 25,
ymax = 33,
xmax = -90), crs = "EPSG:4326") %>%
st_as_sfc() %>%
st_transform(crs = st_crs(proWorld))
ggplot() +
geom_sf(data = proWorld) +
geom_sf(data = box, fill = NA) +
ylim(c(-2182970, 1099711)) +
xlim(c(-1994737, 2770402))
如果这是正确的,生成的红色矩形的边缘将随着纬度线弯曲
谢谢!
如果您希望矩形沿其边缘均匀变形,您将需要从多个小片段构建边缘。您可以通过多种不同的方式来做到这一点,但其中一种方法使用
stplanr::line_segment
library(sf)
library(spData)
library(dplyr)
library(ggplot2)
data(world)
proWorld <- st_transform(world, "EPSG:9311")
box <- st_bbox(c(xmin = -110,
ymin = 25,
ymax = 33,
xmax = -90), crs = "EPSG:4326") %>%
st_as_sfc() %>%
st_cast("LINESTRING") %>%
st_sf() %>%
stplanr::line_segment(n_segments = 100) %>%
st_union() %>%
st_cast("POLYGON") %>%
st_transform(crs = st_crs(proWorld))
ggplot() +
geom_sf(data = proWorld) +
geom_sf(data = box, fill = NA, color = "red", linewidth = 1) +
ylim(c(-2182970, 1099711)) +
xlim(c(-1994737, 2770402))
虽然原则上同意已接受的答案 - 关键是多边形的分割 - 我建议采用替代方法。
stplanr::line_segment()
仅适用于行,并引入依赖关系。使用 sf::st_segmentize()
可以获得等效结果;该函数将采用多边形作为参数,并且是“base”{sf}的一部分,无需{stplanr}依赖项 - 这是一个很好但相当专业的包。
library(sf)
library(spData)
library(dplyr)
library(ggplot2)
data(world)
proWorld <- st_transform(world, "EPSG:9311")
box <- st_bbox(c(xmin = -110,
ymin = 25,
ymax = 33,
xmax = -90)) %>%
st_as_sfc() %>%
st_segmentize(1) %>%
st_set_crs(4326) %>%
st_transform(crs = st_crs(proWorld))
ggplot() +
geom_sf(data = proWorld) +
geom_sf(data = box, fill = NA, color = "red", lwd = 2) +
ylim(c(-2182970, 1099711)) +
xlim(c(-1994737, 2770402))