2017-08-30 131 views
0

我正嘗試從小冊子地圖創建GeoTiff。我試圖找到這個在線答案,但他們似乎沒有爲我工作。我使用R很新。 地理數據是一個2000 * 10矩陣,其中標題,長和緯度被發現。 這裏是我的代碼:從小冊子地圖創建GeoTiff

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"' 

任何想法錯誤可能是哪裏?

回答

1

Leaflet基於JavaScript庫並生成動態Web地圖。

沒有直接的方法將動態地圖保存爲靜態地圖,如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)