如何在R语言rayshader包的3D地图上添加多边形边界?
解决方案:在Rayshader 3D地图上添加多边形边界
问题1:使用generate_polygon_overlay无法显示边界
核心原因是空间参考系(CRS)不匹配,以及generate_polygon_overlay参数设置需调整,按以下步骤修改:
统一CRS
检查并转换shp文件的CRS,使其与高程raster一致:# 查看raster的CRS crs(delhi_raster) # 转换shp的CRS匹配raster delhi_district_shp <- delhi_district_shp %>% st_transform(crs = crs(delhi_raster))正确生成多边形覆盖层
指定线条颜色和宽度,确保覆盖层在高度图上清晰可见:polygon_layer <- generate_polygon_overlay(delhi_district_shp, extent = extent(delhi_raster), heightmap = delhi_mat, linewidth = 2, # 增大线条宽度提升辨识度 color = "black", # 选择与底图对比强烈的颜色 palette = NULL) # 仅显示边界,不填充多边形重新绘制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特征筛选条件不正确,修正如下:
修正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])正确筛选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()使用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
相关产品推荐
相关产品推荐

