从传单地图创建 GeoTiff

Create a GeoTiff from leaflet map

我正在尝试从传单地图创建 GeoTiff。我试图在网上找到这个问题的答案,但似乎没有一个对我有用。我对使用 R 很陌生。 地理数据是一个 2000*10 矩阵,其中包含标题、经度和纬度。 这是我的代码:

install.packages('leaflet')
install.packages('rgdal')
install.packages('raster')
install.packages('sp')


library(leaflet)
library(raster)
library(rgdal)
library(raster)
library(sp)


sites <- data.frame(Name=(geodata[,2]),Long=(geodata[,10]),Lati=(geodata[,9]))

ma <- leaflet()
ma <- addTiles(ma)
ma <- addMarkers(ma, lng=sites$Long, lat=sites$Lati, popup=sites$Name)
ma

rast <- writeRaster(ma, filename="Worldmap.tif", format="GTiff")

最后一步 "writeRaster" 不起作用。我收到的错误消息如下所示:

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function 'writeRaster' 
for signature '"leaflet", "character"'

知道错误可能出在哪里吗?

Leaflet 基于 JavaScript 库并生成动态网络地图。

没有直接的方法将动态地图保存为静态地图,如 geotiff 或 png。如果您不必自动执行此操作,则只需在 RStudio 中导出图像,它为您提供了另存为 PNG、JPEG 或 BMP 的选项。

否则,有一些解决方法,将传单地图保存为 html 文件,然后使用 webshotmapview 库抓取信息以创建图像文件,例如 png。 Webshot 和 mapview 允许您将文件保存为 PNG、PDF 或 JPEG。

library(leaflet)
rand_lng = function(n = 10) rnorm(n, -93.65, .01)
rand_lat = function(n = 10) rnorm(n, 42.0285, .01)
ma <- addMarkers(ma, lng=rand_lng(50), lat=rand_lat(50), popup="a")

## With webshot and htmlwidgets:    
library(webshot)
saveWidget(ma, "temp.html", selfcontained = FALSE)
webshot("temp.html", file = "Rplot.png", cliprect = "viewport")

## With mapview
library(mapview)
mapshot(ma, file = "Rplot.png", remove_url = TRUE)

也看看

如果您确实需要 GeoTiff,则必须再次在 R 中加载图像,将其转换为光栅,然后将其另存为 GeoTiff。这是一个简短的例子。您将不得不调整您的范围并添加参考系统。并且可能控制光栅的值,因为我不确定图像数据是如何加载到矩阵中的。这种转换似乎丢失了很多信息。

library(png)
library(raster)
img <- readPNG("pathto/staticImage.png")

img[img==1]=NA
ar2mat <- matrix(img, nrow = nrow(img), ncol = ncol(img))
## Define the extent
rast = raster(ar2mat, xmn=0, xmx=1, ymn=0, ymx=1)
## Define the spatial reference system
proj4string(rast) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

plot(rast); extent(rast)
writeRaster(rast, "pathto/png2tif.tif", format="GTiff", overwrite=TRUE)