st_transform 无法准确投影多边形的连接线

问题描述 投票:0回答:2

我目前遇到一个问题,我正在尝试将矩形多边形投影到北美地图上。我的问题源于这样一个事实:我在纬度/经度中指定多边形,然后对其进行投影。函数

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))

这是我得到的输出:

如果这是正确的,生成的红色矩形的边缘将随着纬度线弯曲

谢谢!

r gis r-sf
2个回答
8
投票

如果您希望矩形沿其边缘均匀变形,您将需要从多个小片段构建边缘。您可以通过多种不同的方式来做到这一点,但其中一种方法使用

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))


0
投票

虽然原则上同意已接受的答案 - 关键是多边形的分割 - 我建议采用替代方法。

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))

© www.soinside.com 2019 - 2024. All rights reserved.