2014-07-09 3 views
4

나는 바르샤바의 지구를 얻고 Google지도에 그려려고합니다. 이 코드를 사용하면, 2536107은 OpenStreetMap 단일 바르샤바 지역에 대한 관계 코드로, 원하는 바를 거의 제공하지만 몇 가지 버그가 있습니다. 일반적인 개요뿐만 아니라 연결해서는 안되는 점 사이의 선이 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?ggmap을 사용하여 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 

편집 : 나는 그것을 어떻게 든 모든 점/선을 플로팅 순서로 연결하지만이 문제를 해결하는 방법에 대해 아무 생각해야한다 생각.

답변

9

외부 패키지를 사용하지 않고지도를 생성하는 방법이있다는 :

This link

는 우수한 Mapzen 웹 사이트, 폴란드에서 행정 구역의 shape 파일의 집합을 제공합니다 ... osmar를 사용하지 마십시오. 다운로드하여 압축을 풀면 warsaw.osm-admin.*이라는 shapfile 세트가 표시됩니다. 이것은 다각형 폴란드의 모든 지구의 모양 파일로, 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) shapefile이 WGS84 (long/lat)에 투영되지 않습니다. 그래서 우리는 사용하여 재 투영 할 수 있습니다

spp <- spTransform(spp,CRS(wgs.84)) 

osmar이 작동하지 않는 이유는 경로가 잘못된 순서로 있다는 것입니다. warszawa.spSpatialLinesDataframe으로, 일련의 경로로 구성되어 있습니다 (귀하의 경우 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)) 

색상은 "무지개"순서 (레드, 오렌지, 노란색, 녹색, 등)에 있습니다. 분명히 선들이 그 순서대로 있지 않습니다.

EDIT @ ako 님의 의견에 대한 답변.

SpatialLines 객체를 "수정"하는 방법이 있지만 사소한 것은 아닙니다. rgeos 패키지의 gPolygonize(...) 함수는 의 목록을 가져오고 fortify(...)과 함께 ggplot에 사용할 수있는 SpatialPolygons 개체로 변환합니다. 하나의 큰 문제 (나는 솔직히 이해하지 못함)는 OP의 warszaw.sp 객체에 12 개의 행이 있고 그 중 두 개가 중복 된 것으로 보이는 것입니다. 이로 인해 gPolygonize(...)이 실패합니다. 따라서 처음 11 개 경로 만있는 SpatialLines 목록을 만들면 warszawa.sp을 다각형으로 변환 할 수 있습니다. 그러나 다른 개체가 osm으로 변환 된 방법이나 예상되는 방식을 예측할 수 없기 때문에 일반적인 것은 아닙니다. 위와 같은지도로 연결되는 코드가 있습니다.

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) 
+0

+1 오류를 너무 자세히 설명합니다. 대체 파일을 사용할 수없는 경우 토폴로지를 사용하여 인접성별로 순서를 바꾸는 사소한 방법이 있습니까? 교체보다는 수리? – ako

+0

맨, 황금! 나는 실제로 그것이 잘못된 순서로 그려진 선으로 이루어져 있다는 것을 깨닫지 만, 어쨌든 거기에 해결책이 간단하다는 것과 Warsaw의 모양의 파일이 있다는 것을 결코 알지 못했다. (그렇게 특별한 데이터 세트에 대해 너무 좋을 것이라고 생각했다. - 지금해야 할 일은 warsaw.osm-admin.shp를 가져 오는 것뿐입니다. 너 정말 고마워! –

+1

@ako 네, 그렇지만 사소한 것은 아닙니다. 끝에 내 편집 내용을 확인하십시오. – jlhoward

2

일반적인 전화 끊기가 확실하지 않습니다. 예를 재현하여 문제를 확인할 수 있습니다. 나의 첫 번째 생각은 당신이 group = id를 제공하지 않았다는 것이다.이 id는 일반적으로 많은 라인을 가진 다각형에 사용되지만 라인이 있으므로 필요하지 않아야한다.

올바르게 표시되도록하는 유일한 방법은 선을 다각형 스크립트로 변경하는 것입니다. Qgis' line to polygon은 큰 도넛 구멍을 얻는 "오른쪽"을 얻지 못했기 때문에 전체 다각형을 생성 한 ArcMap을 사용했습니다. 이것이 워크 플로에서 효과가 있을지 모르는 경우. 확률은 그렇지 않습니다. 이 경우 아마 RGDAL은 실제로 문제가 있다고 가정하고 라인을 다각형으로 변환 할 수 있습니다.

다각형 모양 파일을 읽고이를 강화하면 코드가 문제없이 실행됩니다. enter image description here

관련 문제