如何程序化匹配尺寸,将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
相关产品推荐
相关产品推荐

