Plot georeferenced raster images in Plotly (R API)

冷暖自知 提交于 2019-12-11 06:13:14

问题


I would like to use Plotly in R to create 3D modells of trenches of archaeological excavations. I'm quite successful to plot point and surface data (Example: Vignette of the R package I'm working on), but I would also like to add raster information of the georeferenced profile pictures of the trenches.

I didn't find any way to plot raster data in Plotlys 3D environment. The only solution I came up with so far (thanks to this post) was to create a 3D modell of the profile with SFM using Photoscan, export the coloured mesh as .ply file, fix the header of this file and import it into R to do the plotting with the following example code:

library(geomorph)
library(plotly)

#load data
mesh <- read.ply("plotly/expply8_corr.ply", ShowSpecimen = FALSE)

# extract vertex coordinates
x <- mesh$vb["xpts",]
y <- mesh$vb["ypts",]
z <- mesh$vb["zpts",]

# plot
plot_ly(
  x = x, y = y, z = z,
  i = mesh$it[1,]-1, j = mesh$it[2,]-1, k = mesh$it[3,]-1,
  facecolor = c(mesh$material$color[1, ]),
  type = "mesh3d"
)

You'll find the example data here.

Unfortunately this scales really badly. If you increase the mesh resolution everything becomes to slow. I would really like to just add a simple georeferenced raster to keep the performance high and avoid the necessity to create 3D modells of the profiles. Is there a workflow to achieve this with Plotly or an other plotting library?


回答1:


I found a nice solution with the package rgl. Example:

library(rgl)
library(jpeg)

# download and load picture
download.file(
  url = 'https://upload.wikimedia.org/wikipedia/en/6/6d/Chewbacca-2-.jpg',
  destfile = "chewbacca.jpg",
  mode = 'wb'
)

chewie <- readJPEG("chewbacca.jpg", native = TRUE)

# create some sample data
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x, y)

# plot sample data
plot3d(x, y, z, col = rainbow(1000), size = 5)

# add picture
show2d(
  # plot raster
  {
    par(mar = rep(0, 4))
    plot(
      0:1, 0:1, type="n",
      ann = FALSE, axes = FALSE,
      xaxs = "i", yaxs = "i"
    )
    rasterImage(chewie, 0, 0, 1, 1)
  },
  # image position and extent
  # coordinate order: lower left, lower right, upper right and upper left
  x = c(-2,  1,  1, -2),
  y = c(-1, -1,  1,  1),
  z = c(-3, -3,  2,  2)
)

The pictures have to be georeferenced with other software (photogrammetry in GIS/CAD). If you have the georeferenced raster you just need the coordinates of its corner points to plot it.



来源:https://stackoverflow.com/questions/39142040/plot-georeferenced-raster-images-in-plotly-r-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!