2015-05-21 27 views
10

Nehmen wir an, ich eine Karte von London mit ggmap Paket generieren:einen Kreis In den ggmap

library(ggmap) 
library(mapproj) 

map <- get_map(location = "London", zoom = 11, maptype = "satellite") 

p <- ggmap(map)+ 
    theme(legend.position = "none") 

print(p) 

Nun möchte Ich mag an diesem Grundstück einen Kreis mit einigen Zentrum Koordinaten hinzufügen (sagen wir mal: lon = -0.1 , lat = 52,23) und Radius ausgedrückt z in Kilometern. Ich habe versucht, eine Lösung für ähnliche Frage (Draw a circle with ggplot2) zu verwenden, wo man nur auf die Funktion eine Anweisung wie folgt hinzufügen:

p <- p + annotate("path", 
        x = xc+r*cos(seq(0,2*pi,length.out=100)), 
        y = yc+r*sin(seq(0,2*pi,length.out=100))) 

Es funktioniert, aber der Kreis ist nicht wirklich ein Kreis aufgrund der unterschiedlichen Skala. Ist es möglich, es richtig zu zeichnen? Jede Hilfe wäre willkommen!

EDIT: Ich fand Lösung (https://gis.stackexchange.com/questions/119736/ggmap-create-circle-symbol-where-radius-represents-distance-miles-or-km), die anderes Paket verwendet und die Ausgabe ist korrekt. Dennoch, wenn jemand es mit ggmap zu tun weiß, bitte teilen Sie es.

+0

Haben Sie versucht, '+ coord_equal()' an das Ende Ihrer Karte plot? – Phil

+0

Ja, aber ich denke, dass es dann nicht zuverlässig in Bezug auf die Entfernung ist –

+0

Plus die Ausgabe ist anders zB von der Ausgabe auf dieser Website erhalten: http://www.freemapetools.com/radius-around-point.htm –

Antwort

0

Sie können die Länge und Breite Spanne von der Landkarte Objekt erhalten:

> m = get_map(location="london", zoom=11, maptype="satellite") 
> corners = attributes(m)$bb 
> delta.x = corners["ur.lon"] - corners["ll.lon"] 
> delta.y = corners["ur.lat"] - corners["ll.lat"] 

dann entsprechend Ihren Weg anpassen. Beachten Sie auch, dass das Paket ggmap eine Funktion namens LonLat2XY hat (siehe reference).

+2

"Entsprechend" bedeutet in diesem Fall? –

+0

"Entspricht" das nicht nur dem Verknüpfen des Parameters circle size mit der Variablen, in die er eingefügt wird? Wenn also zum Beispiel Ihr Standort lat und lon 37,8 bzw. 122,4 sind, könnten Ihre Ecken für delta.y 37,9 [ur] - 37,7 [ll] sein - aber Sie müssen die Berechnung auf Ihren Referenzen aufbauen, um die zu bekommen Umkreist die Größe, die Sie für jede Koordinate haben möchten, die Sie ihm zuführen. –

1

Hier ist eine Lösung mit dem sf-Paket und ggplot :: geom_sf. Zuerst wird ein Punkt, von Koordinaten erstellen und mit EPSG 32630 zu Londoner UTM Zone (30u) zu transformieren, so kann dieser Abstand bestimmt werden:

# dev version of ggplot2 required 
library(sf) 
library(ggplot2) 

sf_pt <- st_point(c(-0.1, 52.23)) %>% 
    st_sfc(crs = 4326) %>% 
    st_transform(32630) 

fügen Sie dann einen Puffer

sf_pt %<>% st_buffer(100) 

jetzt Transformation zurück zu epsg: 4326 (lat/lon WGS84) und plot mit ggmap

p <- ggmap(map) + 
    geom_sf(data = sf_pt %>% st_transform(4326)) + 
    theme(legend.position = "none") 

print(p)