使用ggmap绘制OpenStreetMap

使用ggmap绘制OpenStreetMap,r,ggplot2,openstreetmap,ggmap,R,Ggplot2,Openstreetmap,Ggmap,我正在尝试获取华沙的地区并在谷歌地图上绘制它们。使用这段代码,其中2536107是OpenStreetMap单个华沙区的关系代码,它给了我几乎想要的东西,但有一些bug。有一般的轮廓,但也有点之间的线,不应该连接。我做错了什么 map <- get_googlemap('warsaw', zoom =10) warszawa <- get_osm(relation(2536107), full = T) warszawa.sp <- as_sp(warszawa, what=

我正在尝试获取华沙的地区并在谷歌地图上绘制它们。使用这段代码,其中2536107是OpenStreetMap单个华沙区的关系代码,它给了我几乎想要的东西,但有一些bug。有一般的轮廓,但也有点之间的线,不应该连接。我做错了什么

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

map我不确定这是否是一个普遍的问题——我可以重现您的示例并了解问题所在。我的第一个想法是,您没有提供group=id,这通常用于具有许多线的多边形,但您有线,因此不需要这样做

我能让它正确显示的唯一方法是将您的线条从脚本中更改为多边形
Qgis的直线到多边形
没有得到这个“正确”的结果,得到了一个大的甜甜圈洞,所以我使用了
ArcMap
,它生成了一个完整的多边形。如果这是一个一次性的,可能会为您的工作流程。很可能不是这样。在这种情况下,也许RGDAL可以将直线转换为多边形,假设这确实是一个普遍问题

在阅读多边形形状文件并加强它之后,代码运行时没有问题。
有一种方法可以在不使用外部软件包的情况下生成地图:不要使用
osmar

,转到优秀的Mapzen网站,提供波兰行政区域的一组形状文件。如果您下载并解压缩它,您将看到一个名为
warsaw.osm admin.*
的文件集。这是波兰所有地区的多边形形状文件,方便地用osm_id(!!)索引。下面的代码假设您已经下载了该文件并将其解压缩到“带有shapefile的目录”中

颜色按“彩虹”顺序排列(红色、橙色、黄色、绿色等)。显然,这些行不是按顺序排列的

编辑对@ako评论的回复

有一种方法可以“修复”SpatialLines对象,但它不是微不足道的。
rgeos
包中的函数
gPolygonize(…)
将获取
SpatialLines
的列表,并将其转换为
SpatialPolygons
对象,可在ggplot中使用
fortify(…)
。一个巨大的问题(坦白说,我不理解)是OP的
warszaw.sp
对象有12行,其中两行似乎是重复的-这导致
gPolygonize(…)
失败。因此,如果创建一个仅包含前11条路径的SpatialLines列表,则可以将
warszawa.sp
转换为多边形。但是,这不是一般性的,因为我无法预测它将如何或是否与从
osm
转换的其他
spatialline
对象一起工作。这是代码,它指向与上面相同的映射

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)
库(rgeos)

coords+1非常清楚地解释了错误。如果替代文件不可用,是否有一种简单的方法使用拓扑按邻接重新排序,即;修理而不是更换?伙计,你的黄金!事实上,我意识到它是由按错误顺序绘制的线条组成的,但我从来没有想到,在某个地方有一个简单的解决方案——华沙的形状文件(虽然对于这样的特定数据集来说这太好了,不可能是真的)——现在我所需要做的就是导入Warsaw.osm-admin.shp,一切都搞定了!非常感谢你,伙计@ako是的,有,但这不是小事。最后看我的编辑。@jlhoward,复制品是完美的还是近似的?@ako我不知道<代码>坐标(warszawa.sp)
是坐标列表。我想你可以通过检查来比较。
spp    <- pol[pol$osm_id==-2536107,]
spp    <- spTransform(spp,CRS(wgs.84))
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))
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)