从传单地图

时间:2017-08-30 12:20:48

标签: r leaflet rstudio tiff geotiff

我试图从传单地图创建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")

这是最后一步&#34; writeRaster&#34;那是行不通的。我得到的错误消息如下所示:

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

知道错误可能在哪里?

1 个答案:

答案 0 :(得分:1)

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)

看看this也是如此。

如果您确实需要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)