R语言 手动创建的多边形边界框使弯曲纬度线后,裁剪sf对象

qv7cva1a  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(132)

我尝试手动构建一个边界框来裁剪sf对象。我使用角坐标st_polygon和st_sfc构建简单的多边形,然后将crs设置为我想要裁剪的对象。然而,一旦我使用st_intersection裁剪它,纬度线就会稍微向北弯曲。
我知道这和crs有关,但我无论如何也破解不了。
示例:

usa <-rnaturalearth::ne_states(country = c('united states of america'), returnclass = "sf")

lon <- c(-84, -75, -75, -84, -84); lat <- c(40, 40, 35, 35, 40)
pol <- st_polygon(list(cbind(lon, lat)))
pol <- st_sfc(pol, crs=st_crs(usa))

usa <- st_intersection(usa, pol)

ggplot2::ggplot()+
  geom_sf(data=usa)

gfttwv5a

gfttwv5a1#

一般来说,同一纬度上两点之间的直线 * 不是 * 沿着该纬度的直线。
当然,球面上不存在直线这种东西;最接近的等价物是 * 测地线 *,即两点都位于大圆上的一段。经度线已经是大圆,因此连接完全相同经度上的两点的线将始终具有相同的经度。纬度线不是这样的,因为它们不是 * 大圆(除了赤道本身)。
如果你在北方半球定义一个足够大的矩形,它的南北边将向北凸出,在南半球,它们将向南凸出。
如果您想要的是一个具有固定纬度和经度边界的区域,那么最好指定坐标,沿着每条边指定几个点,这些点与您想要的确切纬度一致:

lon <- c(seq(-84, -74.99, len = 100),
         rep(-75, 100), seq(-75.01, -83.99, len = 100),  
         rep(-84, 100))
lat <- c(rep(40, 100), seq(39.99, 35.01, len = 100), rep(35, 100),
         seq(35.01, 40, len = 100))

pol <- sf::st_polygon(list(cbind(lon, lat)))
pol <- sf::st_sfc(pol, crs=sf::st_crs(usa))

usa <- sf::st_intersection(usa, pol)

ggplot() +
  geom_sf(data = usa)

相关问题