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

如何基于bay.RDS制作指定位置的50米宽跨岸多边形并提取坐标?

解决方案:生成岸到岸的50米宽多边形并提取坐标

1. 加载依赖包与数据

首先加载空间分析所需的包,再加载本地的bay.RDS文件:

library(tmap)
library(leaflet)
library(mapview)
library(sf) # 补充空间操作核心包

# 加载本地的bay.RDS文件(需确保文件在当前工作目录)
bay <- readRDS('bay.RDS')
mapview(bay) # 预览底图

2. 定义多个相邻目标点位

指定需要生成多边形的相邻点位(可根据需求调整坐标数量与位置):

# 定义3个相邻点位示例
pts <- st_sfc(
  st_point(c(-122.91, 38.17)),
  st_point(c(-122.908, 38.17)),
  st_point(c(-122.906, 38.17)),
  crs = 4326
)

# 预览点位与底图叠加效果
mapview(bay) + mapview(pts, color = 'red')

3. 批量生成岸到岸的50米宽多边形

核心逻辑:先转平面坐标系(米为单位),基于点位生成垂直于岸线的宽缓冲区,再裁剪到湾区范围得到岸到岸的独立多边形:

# 转换为UTM平面坐标系(适配旧金山湾区的EPSG:32610,单位为米)
bay_utm <- st_transform(bay, crs = 32610)
pts_utm <- st_transform(pts, crs = 32610)

# 提取湾区的边界线
bay_edge <- st_cast(bay_utm, "LINESTRING")

# 定义单点位生成多边形的函数
create_cross_poly <- function(pt, edge, width = 50) {
  # 计算点到岸线的垂直方向
  nearest_pt <- st_nearest_points(pt, edge)[[1]][2]
  direction <- st_coordinates(pt - nearest_pt)[1,]
  
  # 生成横跨两岸的线段(延伸足够长度确保覆盖湾区)
  cross_line <- st_sfc(st_linestring(rbind(
    st_coordinates(pt) + direction * 10000,
    st_coordinates(pt) - direction * 10000
  )), crs = st_crs(edge))
  
  # 生成50米宽缓冲区并裁剪到湾区范围
  buffer <- st_buffer(cross_line, width / 2)
  poly <- st_intersection(buffer, bay_utm)
  return(st_cast(poly, "POLYGON"))
}

# 批量生成所有点位对应的多边形
cross_polys <- lapply(pts_utm, function(x) create_cross_poly(x, bay_edge))
cross_polys <- st_sf(geom = do.call(c, cross_polys))

# 添加用于颜色编码的属性列(替换为你的实际业务数据)
cross_polys$score <- c(15, 25, 35)

# 转换回WGS84经纬度坐标系(EPSG:4326)
cross_polys_wgs84 <- st_transform(cross_polys, crs = 4326)

# 预览效果:按score列颜色编码多边形
mapview(bay) + mapview(cross_polys_wgs84, zcol = "score")

4. 提取多边形坐标并合并数据集

将多边形的经纬度坐标提取为表格格式,可直接合并到你的业务数据中:

# 定义提取单个多边形坐标的函数
get_poly_coords <- function(poly_row) {
  coords <- st_coordinates(poly_row$geom)
  return(data.frame(
    poly_id = rep(poly_row$row.names, nrow(coords)),
    lon = coords[,1],
    lat = coords[,2],
    score = rep(poly_row$score, nrow(coords))
  ))
}

# 批量提取所有多边形的坐标
coords_df <- do.call(rbind, lapply(1:nrow(cross_polys_wgs84), function(i) {
  get_poly_coords(cross_polys_wgs84[i,])
}))

# 查看提取结果
head(coords_df)

# 合并到你的原始数据集(假设原始数据集为raw_df,包含对应poly_id)
# merged_data <- merge(raw_df, coords_df, by = "poly_id")

效果说明

生成的多边形为相邻但独立的岸到岸区域,可通过自定义属性列(如示例中的score)实现颜色编码,提取的坐标为标准经纬度格式,可直接用于后续分析或可视化。

内容的提问来源于stack exchange,提问作者Salvador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:57