在R语言中使用经纬度坐标构建多边形遇异常求助
问题原因与解决方案
问题根源
你代码中使用st_buffer(dist = 25000)时,原始空间数据采用的是WGS84坐标系(EPSG:4326),该坐标系的单位是度,而非米。直接以米为单位设置缓冲区距离,会导致程序将25000当作“度”来计算,最终生成的缓冲区被极度放大,这就是多边形边界离目标点过远的核心原因。
修正方案
解决思路是先将地理坐标转换为以米为单位的投影坐标系(比如夏威夷所在的UTM Zone 4N,EPSG:32604),完成凸包、缓冲区等操作后,再转换回WGS84坐标系用于可视化。
以下是修正后的完整代码:
library(sf) library(data.table) library(dplyr) library(tmap) library(tmaptools) # 定义坐标点 lng1 <- -158.04968046414533 lat1 <- 21.67388250944907 lng2 <- -158.0410973950371 lat2 <- 21.684211388913273 lng3 <- -158.0455176756356 lat3 <- 21.669296090216402 lng4 <- -158.0350892466561 lat4 <- 21.679266380720016 # 构建数据框并转换为sf对象(WGS84坐标系) latlong <- data.table(long= c(lng1, lng2, lng3, lng4), lat= c(lat1, lat2, lat3, lat4)) latlong_sf <- st_as_sf(latlong, coords = c("long", "lat"), crs = 4326) # 转换为米单位的投影坐标系(UTM 4N,适配夏威夷区域) latlong_utm <- st_transform(latlong_sf, crs = 32604) # 计算凸包+缓冲区(此时dist单位为米,可根据需求调整数值,比如500米) conv_hawaii <- latlong_utm %>% st_union() %>% st_convex_hull() %>% st_buffer(dist = 500) %>% # 这里用500米作为示例,可按需修改 st_simplify(dTolerance = 50) %>% # 简化阈值同样以米为单位 st_transform(crs = 4326) # 转换回WGS84用于可视化 # 交互式可视化 tmap_mode("view") tm_shape(latlong_sf) + tm_dots(size = 0.5, alpha = 0.5) + tm_shape(conv_hawaii) + tm_borders(col = "gray", lwd = 2) + tm_layout(frame = FALSE, title = "hawaii area", title.size = 1.5, title.position = c(0.85, "bottom"))
关键说明
- 选择UTM Zone 4N(EPSG:32604)是因为该投影适配夏威夷的地理位置,能保证距离计算的准确性。
- 如果不需要缓冲区,可直接去掉
st_buffer步骤,仅保留st_convex_hull即可得到四个点的凸包多边形。 st_simplify的dTolerance参数在米单位坐标系下设置,数值越小保留的细节越多。
内容的提问来源于stack exchange,提问作者laplaceable
相关产品推荐
相关产品推荐

