2014-07-15 5 views
5

Ich habe eine Shapefile (SpatialLinesDataFrame), die alle Straßen in Köln enthält, die von here heruntergeladen werden können. Ich habe diese @data mit Daten von einer externen Quelle zusammengeführt. Wie kann ich diese Straßen plotten (wenn möglich auf einer Google Map mit ggmaps), so dass jede Straße eine andere Farbe (oder Dicke) hat, abhängig von ihrem individuellen Wert?Wie man Straßen in einem SpatialLinesDataFrame mit ggplot/ggmap plant und einfärbt?

Bisher habe ich dies getan:

shapefile <- readOGR(shapfile, "Strasse", stringsAsFactors=FALSE, 
encoding="latin-9") 
shp <- spTransform(shapefile, CRS("+proj=longlat +datum=WGS84")) 

an dieser Stelle ich eine andere Spalte zu der shp @ data Datenrahmen hinzufügen, die für jede Straße einen bestimmten Wert enthält. Dann fortifiy ich die Shape-Datei, so dass es mit ggplot aufgetragen werden:

shp$id <- rownames([email protected]) 
shp.df <- as.data.frame(shp) 
data_fort <- fortify(shp, region = "id") 
data_merged <- join(data_fort, shp.df, by="id") 

Wenn ich geom_lines verwenden, die Linien nicht gut aussehen und sind nicht leicht zu identifizieren:

ggplot(data_merged, aes(x=long, y=lat, 
         group=group, 
         colour=values)) + 
geom_line() 

Here ich sehe, dass man könnte das Shapefile so transformieren, dass geom_segement (oder in diesem Fall eine modifizierte Funktion "geom_segment2") verwendet werden kann, aber dann würde ich die straßenspezifischen Werte verlieren.

+0

Ihr Shapefile scheint> 5500 Straßen zu haben. Willst du, dass jeder von ihnen eine andere Farbe hat? Außerdem hat die Attributtabelle keine "values" -Spalte. – jlhoward

+0

Ich habe die @data mit einer externen Datei abgeglichen (die ich aus Datenschutzgründen nicht hochladen kann). In der Shapedatei, die sich in meiner Originaldatei befindet, sind nur noch die Straßen übrig. Dann füge ich die Werte aus der externen Datei an den Shapefile @ Daten Dataframe an. Im Moment erkenne ich, dass ich die modifizierte Shapefile hochladen kann, werde das morgen tun. Die Werte Spalte ist in meiner Shapefile, es enthält Werte von 1-10 zum Beispiel, aber das ist simuliert. Wenn ich geom_line() verwende, sind einige Teile bestimmter Linien (Straßen) mit farbähnlichen Formen gefüllt. Weißt du, warum das so ist? –

+0

Für den Anfang müssen Sie 'geom_path (...)', nicht 'geom_line (...) verwenden. – jlhoward

Antwort

3

So nimmt dieser Code die 100 längsten Straßen von Ihrem Shapefile, weist "Werte" auf (1,10) zu und zeichnet diese mit Farbe basierend auf Wert, über einem Google Rasterbild von Köln.

library(ggplot2) 
library(ggmap)   # for ggmap(...) and get_map(...) 
library(rgdal)   # for readOGR(...) 
library(plyr)   # for join(...) 
set.seed(1)    # for reproducible example 
setwd(" <directory with your shapefiles> ") 
spl <- readOGR(dsn=".", "Strasse", encoding="latin-9") 
spl <- spl[spl$SHAPE_LEN %in% tail(sort(spl$SHAPE_LEN),100),] 
shp  <- spTransform(spl, CRS("+proj=longlat +datum=WGS84")) 
shp.df <- data.frame(id=rownames([email protected]), 
         values=sample(1:10,length(shp),replace=T), 
         [email protected], stringsAsFactors=F) 

data_fort <- fortify(shp) 
data_merged <- join(data_fort, shp.df, by="id") 

ggmap(get_map(unlist(geocode("Cologne")),zoom=11))+ 
    geom_path(data=data_merged,size=1, 
      aes(x=long,y=lat,group=group,color=factor(values)))+ 
    labs(x="",y="")+ 
    theme(axis.text=element_blank(),axis.ticks=element_blank()) 

Es ist möglich, den ggmap(...) Aufruf einfacher, zB,

ggmap(get_map("Cologne")) 

aber es gibt ein Problem zu machen: das zoom=... Argument wird unterschiedlich interpretiert, und ich war nicht in der Lage Vergrößern Sie die Karte ausreichend.

Verwandte Themen