如何将线串几何类型转为SpatialPolygon?西非海岸线转换异常求助
问题解决思路与修正代码
问题根源
- 数据误用:提取坐标时用了原始
coastline而非裁剪后的coastline_west_africa,包含了超出研究区的线段,触发错误连接。 - 多边形构建逻辑错误:
df_to_SpatialPolygons会把所有线段按L1分组直接闭合为多边形,但海岸线是线状要素,直接转多边形会出现不合理的跨区域连线(就是你看到的斜线)。 - 投影误解:当前用的是WGS84地理坐标(不是UTM),跨南北半球的问题可以通过选择合适的投影解决,无需纠结UTM分带。
修正步骤与代码
方案1:直接从sf对象转SpatialPolygons(最简便)
海岸线本身是线,若要转多边形,建议先构建闭合的海洋区域(结合研究区边界+海岸线),直接用sf转sp更可靠:
library(sp) library(sf) library(rnaturalearth) library(rnaturalearthdata) library(FRK) # 下载海岸线并裁剪到研究区 coastline <- ne_download(scale = "medium", type = "coastline", category = "physical", returnclass = "sf") bbox_west_africa <- st_bbox(c(xmin = -43.18, xmax = 19.34, ymin = -26.57, ymax = 29.49), crs = st_crs(coastline)) coastline_west_africa <- st_crop(coastline, bbox_west_africa) # 构建研究区边界,与海岸线求差得到海洋区域多边形 study_area <- st_as_sfc(bbox_west_africa) ocean_polygon <- st_difference(study_area, st_union(coastline_west_africa)) # 直接转成SpatialPolygons ocean_sp <- as(ocean_polygon, "Spatial") plot(ocean_sp)
方案2:适配INLA网格的投影优化
如果是为了INLA创建网格,推荐用非洲专属等面积投影(规避UTM跨半球问题):
# 非洲等面积投影参数 africa_crs <- "+proj=aea +lat_1=-20 +lat_2=20 +lat_0=0 +lon_0=10 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" # 转换投影后构建海洋多边形 coastline_aea <- st_transform(coastline_west_africa, crs = africa_crs) study_area_aea <- st_transform(study_area, crs = africa_crs) ocean_polygon_aea <- st_difference(study_area_aea, st_union(coastline_aea)) # 转SpatialPolygons用于INLA ocean_sp_aea <- as(ocean_polygon_aea, "Spatial")
关键说明
- 不要手动提取坐标转多边形,sf和sp之间的
as()转换函数更可靠,避免人为错误。 - 构建海洋区域必须用
st_difference形成闭合面,否则会出现异常连线。 - INLA的
inla.mesh.2d支持sf对象,直接用sf格式处理可以省去sp转换的麻烦。
内容的提问来源于stack exchange,提问作者Lola Riesgo Torres
相关产品推荐
相关产品推荐

