1

我正在尝试在 RGL 的 3d 环境中绘制平面地图,因为它应该能够自定义缩放/倾斜地图,以获得最适合数据和所需输出图像方面的投影。该线程描述使用rgl.surface(). 但尚不清楚此方法是否适用于 OSM/其他地图对象。非常感谢您可能有的任何想法。

这是起点,失败是因为Error in is.matrix(z) : 'z' is missing. 知道如何为 z 坐标插入一些零吗?

require(rgl)
open3d()               # R crashes if this is done later(?)
#Sys.setenv(NOAWT=1)   # fix an {OSM} X11 issue in Mac
require(OpenStreetMap)
require(ggplot2)

lat <- c(53, 50); lon <- c(-5, 1)
map <- openmap(c(lat[1],lon[1]),c(lat[2],lon[2]), 5, 'osm')
map <- openproj(map)
rgl.surface(map)
4

1 回答 1

8

您需要为高度创建一个零矩阵并使用col=参数来surface3d设置图像的颜色。

从对象中获取所有维度和排序以及所有这些map都是一件小事,所以这里有一个函数可以做到:

map3d <- function(map,...){
  if(length(map$tiles)!=1){
    stop("multiple tiles not implemented")
  }

  nx = map$tiles[[1]]$xres
  ny = map$tiles[[1]]$yres

  xmin = map$tiles[[1]]$bbox$p1[1]
  xmax = map$tiles[[1]]$bbox$p2[1]
  ymin = map$tiles[[1]]$bbox$p1[2]
  ymax = map$tiles[[1]]$bbox$p2[2]

  xc = seq(xmin,xmax,len=ny)
  yc = seq(ymin,ymax,len=nx)
  colours = matrix(map$tiles[[1]]$colorData,ny,nx)
  m = matrix(0,ny,nx)
  surface3d(xc,yc,m,col=colours,...)

}

这给了我们:

闪亮的地图

现在,请注意它仅在返回的地图中有一个图块时才有效,但原理就在那里。

另外,我并不完全相信坐标对齐是准确的。坐标可能是图像的像素或边缘的中心,因此某处可能缺少+1。而且我不确定它是否适用于灰色边框。

于 2013-04-26T09:18:01.330 回答