我正在尝试从传单地图创建 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 文件,然后使用库
webshot
或 mapview
抓取信息,例如创建图像文件,例如 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)