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

如何程序化匹配尺寸,将Bing地图对齐叠加到Rayshader地图?

程序化实现Bing地图与rayshader地图的对齐叠加

问题解决核心

要解决叠加错位问题,关键是让Bing地图的尺寸与rayshader生成的高程矩阵尺寸严格匹配,无需手动试错。具体做法是先提取高程矩阵的行列数,将其作为生成Bing地图PNG时的宽高参数,同时强制地图绘制的宽高比与地理范围比例一致。

修正后的完整代码

library(elevatr)
library(rayshader)
library(OpenStreetMap)
library(png)

# 伦敦区域边界
mapextent <- c(51.477482,-0.120438,51.527517,0.051910)

# 获取高程数据并转换为矩阵
elev_data <- get_elev_raster(
  locations = data.frame(x = c(mapextent[2], mapextent[4]), y = c(mapextent[1], mapextent[3])),
  z = 10,
  prj = "EPSG:4326",
  clip = "bbox"
)
elev_mat <- raster_to_matrix(elev_data)

# 提取高程矩阵的尺寸:宽度对应列数,高度对应行数
map_width <- ncol(elev_mat)
map_height <- nrow(elev_mat)
# 计算地理范围的宽高比(经度差/纬度差),确保地图绘制比例匹配
geo_aspect_ratio <- (mapextent[4] - mapextent[2]) / (mapextent[3] - mapextent[1])

# 生成匹配尺寸的Bing地图PNG
png("bing_map.png", width = map_width, height = map_height)
map <- openmap(
  upperLeft = c(mapextent[1], mapextent[2]), 
  lowerRight = c(mapextent[3], mapextent[4]), 
  type = "bing"
)
# 强制绘制比例与地理范围一致,避免拉伸变形
plot(map, asp = geo_aspect_ratio)
dev.off()

# 读取Bing地图并叠加
bing_map <- readPNG("bing_map.png")

elev_mat %>%
  sphere_shade() %>%
  add_overlay(bing_map, alphalayer = 0.9) %>%
  plot_3d(elev_mat, zscale = 10, fov = 0, theta = 0, phi = 60,
          windowsize = c(600, 450),
          zoom = 0.7,
          background = "lightgrey")

关键修改点说明

  • 提取矩阵尺寸:通过ncol()和nrow()获取高程矩阵的列数(宽度)和行数(高度),直接传递给png()函数的width和height参数,确保图片尺寸与高程矩阵完全匹配。
  • 强制绘制比例:设置plot(map, asp = geo_aspect_ratio),让Bing地图的绘制比例与地理边界的宽高比一致,避免图片拉伸导致的错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:42:56