我正在尝试使用 sf 在以太平洋为中心的地图中绘制 shapefile,但由于该 shapefile 是为更“典型”的以大西洋为中心的投影而设计的,因此我得到了穿过反子午线处所有多边形的线( 180° 经度)。我之前遇到过这个问题,但后来通过找到专为太平洋设计的形状文件来解决它。在这种情况下,这不是一个选择。
有没有办法合并这些多边形,使线条消失?我已经以各种方式尝试过
st_union
,但问题是这些形状实际上在该点上是闭合的,即使该物体合并为单个多边形,该线仍然存在。我觉得这一定是其他人遇到过的问题。
如何将这些东西合并成一个没有垂直线的多边形?
这是一些使用我正在使用的数据子集的示例代码:
library(tidyverse)
library(sf)
#> Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
regions <- st_read("https://gist.github.com/mhoban/ebdee566c4d1963e9fcd88fae818fc83#file-hawaii-geojson")
#> Reading layer `hawaii' from data source
#> `https://gist.github.com/mhoban/ebdee566c4d1963e9fcd88fae818fc83#file-hawaii-geojson'
#> using driver `GeoJSON'
#> Simple feature collection with 1 feature and 9 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -180 ymin: 13.36447 xmax: 180 ymax: 31.51548
#> Geodetic CRS: WGS 84
# out of the box, polygons are split to either side of the map
ggplot(regions) +
geom_sf(fill = "lightgrey",linewidth=1)
在这里您可以看到,直接绘制 shapefile 会显示它在地图的两侧分开:
# using a pacific-centered projection, the polygon is complete,
# but there's a break at the anti-meridian
ggplot(regions %>% st_transform(3832)) +
geom_sf(fill = "lightgrey",linewidth=1)
我可以使用以太平洋为中心的投影来获得完整的形状,但仍然有一条 180° 的垂直线:
# similarly, we can shift the longitudes
# but the problem persists
ggplot(regions %>% st_shift_longitude()) +
geom_sf(fill="lightgrey",linewidth=1)
我也可以使用
st_shift_longitude
,但我最终得到同样的结果:
是否有某种方法可以将这些单独的多边形分解为一个?问题(我认为)是它们似乎是相邻的,实际上并不重叠,所以
st_union
保留了边界。
我明白它可能会变得棘手,因为这是一个具有三部分(底部的圆圈加上顶部的两部分)而不是只有两部分的多多边形,但即使我只有顶部的两部分,我也不知道如何去做。
这个类似问题的答案提供了更多细节,但本质上主要问题是您必须使用 UTM 投影。根据这些答案(包括使用相关 UTM 代码),以下是您的问题的两种可能的解决方案:
在
regions
周围创建0个单位的缓冲区以删除内边框
regions %>%
st_buffer(0) %>%
st_transform(crs='EPSG:32704') %>%
ggplot() +
geom_sf(fill = 'lightgrey', linewidth = 1)
或者您可以使用
ms_dissolve()
包中的 rmapshaper
函数
library(rmapshaper)
regions %>%
st_transform(crs='EPSG:32704') %>%
rmapshaper::ms_dissolve() %>%
ggplot() +
geom_sf(fill = 'lightgrey', linewidth = 1)
第二张图片看起来更像您要找的东西。请记住,此解决方案使用 UTM 区域 4。夏威夷州的大部分地区位于此区域,但夏威夷大岛(最东端的岛屿)的大部分区域位于 UTM 区域 5。