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

如何在R语言rayshader包的3D地图上添加多边形边界?

解决方案:在Rayshader 3D地图上添加多边形边界

问题1:使用generate_polygon_overlay无法显示边界

核心原因是空间参考系(CRS)不匹配,以及generate_polygon_overlay参数设置需调整,按以下步骤修改:

  1. 统一CRS
    检查并转换shp文件的CRS,使其与高程raster一致:

    # 查看raster的CRS
    crs(delhi_raster)
    # 转换shp的CRS匹配raster
    delhi_district_shp <- delhi_district_shp %>%
      st_transform(crs = crs(delhi_raster))
    
  2. 正确生成多边形覆盖层
    指定线条颜色和宽度,确保覆盖层在高度图上清晰可见:

    polygon_layer <- generate_polygon_overlay(delhi_district_shp,
                                             extent = extent(delhi_raster),
                                             heightmap = delhi_mat,
                                             linewidth = 2,  # 增大线条宽度提升辨识度
                                             color = "black", # 选择与底图对比强烈的颜色
                                             palette = NULL) # 仅显示边界,不填充多边形
    
  3. 重新绘制3D地图并添加覆盖层

    delhi_mat %>%
      height_shade(texture = grDevices::colorRampPalette(c("#9a133d","orange","red","purple"))(256)) %>%
      add_overlay(polygon_layer) %>%
      plot_3d(heightmap = delhi_mat,
              windowsize = c(800,800),
              solid = FALSE,
              zscale = 1,
              phi = 90,
              zoom = .6,
              theta = 0,
              shadowcolor = "grey50",
              linewidth = 6,
              background = "white",
              solidlinecolor = "#013b39")
    

问题2:osmdata无法获取行政边界数据

问题出在bbox格式错误和OSM特征筛选条件不正确,修正如下:

  1. 修正bbox格式
    opq()要求的bbox顺序为c(minlon, minlat, maxlon, maxlat),你之前的顺序颠倒了:

    # 正确提取extent顺序
    osm_bbox <- c(extent(delhi_raster)[1], extent(delhi_raster)[3],
                  extent(delhi_raster)[2], extent(delhi_raster)[4])
    
  2. 正确筛选OSM行政边界
    要获取德里的区县边界,需筛选boundary="administrative"和对应层级(印度区县对应admin_level="6"):

    raster_polygon_boundary <- opq(osm_bbox) %>%
      add_osm_feature(key = "boundary", value = "administrative") %>%
      add_osm_feature(key = "admin_level", value = "6") %>%
      osmdata_sf()
    
  3. 使用OSM数据生成覆盖层
    从osmdata中提取多边形数据,再生成覆盖层:

    # 提取OSM多边形
    osm_districts <- raster_polygon_boundary$osm_multipolygons
    # 转换CRS匹配raster
    osm_districts <- osm_districts %>% st_transform(crs = crs(delhi_raster))
    # 生成覆盖层
    osm_polygon_layer <- generate_polygon_overlay(osm_districts,
                                                  extent = extent(delhi_raster),
                                                  heightmap = delhi_mat,
                                                  linewidth = 2,
                                                  color = "white")
    # 添加到3D地图
    delhi_mat %>%
      height_shade(texture = grDevices::colorRampPalette(c("#9a133d","orange","red","purple"))(256)) %>%
      add_overlay(osm_polygon_layer) %>%
      plot_3d(heightmap = delhi_mat,
              windowsize = c(800,800),
              solid = FALSE,
              zscale = 1,
              phi = 90,
              zoom = .6,
              theta = 0,
              shadowcolor = "grey50",
              linewidth = 6,
              background = "white",
              solidlinecolor = "#013b39")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:03:18