You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:30:56