[英]Plotting OpenStreetMap with ggmap
我正試圖讓華沙地區在谷歌地圖上繪制它們。 使用此代碼,其中2536107是OpenStreetMap單個華沙區的關系代碼,幾乎給了我想要的東西,但有一些錯誤。 有一般大綱,但也有不應連接的點之間的線。 我究竟做錯了什么?
map <- get_googlemap('warsaw', zoom =10)
warszawa <- get_osm(relation(2536107), full = T)
warszawa.sp <- as_sp(warszawa, what='lines')
warsawfort <- fortify(warszawa.sp)
mapa_polski <- ggmap(map, extent='device', legend="bottomleft")
warsawfort2 <- geom_polygon(aes(x = long, y = lat),
data = warsawfort, fill="blue", colour="black",
alpha=0.0, size = 0.3)
base <- mapa_polski + warsawfort2
base
編輯:我認為它必須以某種方式與繪制每個點/線的順序相關聯,但我不知道如何解決這個問題。
有一種方法可以在不使用外部包的情況下生成地圖:不要使用osmar
...
這個鏈接 ,通過優秀的Mapzen網站,提供了一套波蘭行政區域的形狀文件。 如果您下載並解壓縮它,您將看到一個名為warsaw.osm-admin.*
的shapfile集。 這是波蘭所有地區的多邊形 shapefile,通過osm_id(!!)進行索引。 下面的代碼假定您已下載文件並將其解壓縮到“包含shapefile的目錄”中。
library(ggmap)
library(ggplot2)
library(rgdal)
setwd(" <directory with your shapefiles> ")
pol <- readOGR(dsn=".",layer="warsaw.osm-admin")
spp <- pol[pol$osm_id==-2536107,]
wgs.84 <- "+proj=longlat +datum=WGS84"
spp <- spTransform(spp,CRS(wgs.84))
map <- get_googlemap('warsaw', zoom =10)
spp.df <- fortify(spp)
ggmap(map, extent='device', legend="bottomleft") +
geom_polygon(data = spp.df, aes(x = long, y=lat, group=group),
fill="blue", alpha=0.2) +
geom_path(data=spp.df, aes(x=long, y=lat, group=group),
color="gray50", size=0.3)
兩個細微差別:(1)osm ID存儲為負數,因此您必須使用,例如,
spp <- pol[pol$osm_id==-2536107,]
提取相關區域,以及(2)在WGS84(long / lat)中不投影shapefile。 所以我們必須使用以下方法重新投影:
spp <- spTransform(spp,CRS(wgs.84))
osmar
不起作用的原因是路徑的順序錯誤。 您的warszawa.sp
是一個SpatialLinesDataframe
,由一組路徑(在您的情況下為12)組成,每個路徑由一組線段組成。 當你對此使用fortify(...)
時, ggplot
嘗試將它們組合成一個單獨的點序列。 但由於路徑不是凸起的順序,例如,ggplot嘗試將一條以東北方向結束的路徑連接到一條從西南方向開始的路徑。 這就是你得到所有額外線條的原因。 你可以通過着色段來看到這一點:
xx=coordinates(warszawa.sp)
colors=rainbow(11)
plot(t(bbox(warszawa.sp)))
lapply(1:11,function(i)lines(xx[[i]][[1]],col=colors[i],lwd=2))
顏色為“彩虹”順序(紅色,橙色,黃色,綠色等)。 顯然,線條不是那樣的。
編輯回復@ ako的評論。
有一種方法可以“修復”SpatialLines對象,但這並非易事。 rgeos
包中的函數gPolygonize(...)
將獲取SpatialLines
列表並轉換為SpatialPolygons
對象,該對象可以在帶有fortify(...)
ggplot中使用。 坦率地說,一個巨大的問題(我不明白)是OP的warszaw.sp
對象有12行,其中兩行似乎是重復的 - 這導致gPolygonize(...)
失敗。 因此,如果僅使用前11個路徑創建SpatialLines列表,則可以將warszawa.sp
轉換為多邊形。 然而,這並不常見,因為我無法預測它是如何或是否與從osm
轉換的其他SpatialLines
對象一起使用。 這是代碼,它導致與上面相同的地圖。
library(rgeos)
coords <- coordinates(warszawa.sp)
sll <- lapply(coords[1:11],function(x) SpatialLines(list(Lines(list(Line(x[[1]])),ID=1))))
spp <- gPolygonize(sll)
spp.df <- fortify(spp)
ggmap(map, extent='device', legend="bottomleft") +
geom_polygon(data = spp.df, aes(x = long, y=lat, group=group),
fill="blue", alpha=0.2) +
geom_path(data=spp.df, aes(x=long, y=lat, group=group),
color="gray50", size=0.3)
我不確定這是一般的掛斷 - 我可以重現你的例子並看到問題。 我的第一個想法是你沒有提供group = id,它通常用於有很多行的多邊形,但你有線,所以不需要。
我能夠正確顯示它的唯一方法是將線條更改為多邊形腳本。 Qgis' line to polygon
沒有得到這個“正確”,得到一個大的圓環孔,所以我使用了ArcMap
,它產生了一個完整的多邊形。 如果這是一次性的,可能適用於您的工作流程。 可能性不大。 在這種情況下,也許RGDAL可以將線條轉換為多邊形,假設這確實是一個普遍的問題。
在讀取多邊形shapefile並加強它后,您的代碼運行沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.