2016-08-21 16 views
7

Ggmap'i, google earth'in altındaki bir uydu görüntüsü ile çalıştığım korunan alanların haritasını oluşturmak için kullanmaya çalışıyorum. Bir kuzey ok ve ölçek çubuğu yoksun olması dışında ben çok tatmin edici bir görüntü yapabiliriz:Kuzey ok ve ölçek çubuğunu ggmap'a eklemenin en iyi yolu

enter image description here

Ben çok uzun bu öğeleri eklemek için yollar vardır soluklu farkında değilim (örn here) ama orada mutlaka olmalı Bunu yapmak için daha kutsal bir yol ol!

Ben map.scale ve north.arrow kullanarak denedim ama bunlar hem bana vermek:

Error in polygon(xb + arrow.x * s, yb + arrow.y * s, ...) : 
    plot.new has not been called yet 

Ben plot kullanarak baz Ar çalışmak hem map.scale ve north.arrow alabilirsiniz ama sonra benim uydu görüntüsünü alamıyorum Düzgün çizim arrows ve text'u temel R'de kullanmak istediğimi de alabilirim ancak yine de bunlar ggmap'ta çalışmaz.

Kullandığım kod aşağıda. Çokgen içermezsiniz (bu yüzden kodu ekleyemeyeceğim), ancak google earth görüntüsünü yükleyebilir ve hatayı çoğaltabilirsiniz. map.scale ve north.arrow fonksiyonları ggmap işlevi açık pencere grafiksel olarak yaratır pencereyi tanımadıkları gibi okumayı biraz yapıyor itibaren

library(rgdal) 
library(ggmap) 
library(GISTools) 

# Load satellite picture 

map.centre <- c(lon = 35, lat = -2.5) 
map <- get_map(location=map.centre, source="google", maptype="satellite", zoom = 8) 

# Plot map 

ggmap(map, extent= "device") 

map.scale(xc= 34, yc= -3, len= 10, units= "Kilometers", 
ndivs= 4, tcol= "black", scol= "black", sfcol="black") 

north.arrow(xb= 35.5, yb= -1, len=100, lab="N") 

görünüyor. Biraz araştırma yaptım ve bunu düzeltmeye çalıştım ama hiçbir şey işe yaramadı. Kimse aldığım hatayı düzeltmek için bir yol önerebilir mi, yoksa yüzlerce satır kod kullanmadan ggmap'de bir ölçek çubuğu ve kuzey oku olsun?

+2

'ggsn' paket sizin için çalışma değildi? (https://cran.rstudio.com/web/packages/ggsn/) Ayrıca, kısırlığı gerçekten önemsiyorsanız, 'özlü' 3 daha az karakter ve BÜYÜK BÜYÜKDİR. – hrbrmstr

+0

Benim için işe yarayan bu: https://github.com/3wen/legendMap Ggsn görünümünü seviyorum, ancak ggmap ile çalışmasını sağlamak için çok fazla çaba harcamaktadır, bu yüzden legendMap – Ben

cevap

10

map.scale ve north.arrow gibi görünüyor, temel grafiklerle çalışmak üzere tasarlanmıştır, ancak ggplot grid grafiklerini kullanır. Ben mekansal veri grafiklerini aşina değilim ama Kuzey ok için hızlı kesmek gibi, kod aşağıda iki farklı seçenek içerir: Ben çizmek için kendi işlevini kullanma eğiliminde

ggmap(map, extent= "device") + 
    geom_segment(arrow=arrow(length=unit(3,"mm")), aes(x=33.5,xend=33.5,y=-2.9,yend=-2.6), 
       colour="yellow") + 
    annotate(x=33.5, y=-3, label="N", colour="yellow", geom="text", size=4) + 
    geom_segment(arrow=arrow(length=unit(4,"mm"), type="closed", angle=40), 
       aes(x=33.7,xend=33.7,y=-2.7,yend=-2.6), colour=hcl(240,50,80)) + 
    geom_label(aes(x=33.7, y=-2.75, label="N"), 
      size=3, label.padding=unit(1,"mm"), label.r=unit(0.4,"lines")) 

enter image description here

8

ggmaps üzerinde scalebars. Bu, tam olarak nasıl istediğinizi ortaya koymak için iyi bir kontrol sağlar. Örneğin,

scalebar = function(x,y,w,n,d, units="km"){ 
    # x,y = lower left coordinate of bar 
    # w = width of bar 
    # n = number of divisions on bar 
    # d = distance along each division 

    bar = data.frame( 
    xmin = seq(0.0, n*d, by=d) + x, 
    xmax = seq(0.0, n*d, by=d) + x + d, 
    ymin = y, 
    ymax = y+w, 
    z = rep(c(1,0),n)[1:(n+1)], 
    fill.col = rep(c("black","white"),n)[1:(n+1)]) 

    labs = data.frame(
    xlab = c(seq(0.0, (n+1)*d, by=d) + x, x), 
    ylab = c(rep(y-w*1.5, n+2), y-3*w), 
    text = c(as.character(seq(0.0, (n+1)*d, by=d)), units) 
    ) 
    list(bar, labs) 
} 

sb = scalebar(33.5, -3.8, 0.05, 5, 0.3, "degrees") 

# Plot map 

ggmap(map, extent= "device") + 
    geom_rect(data=sb[[1]], aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, fill=z), inherit.aes=F, 
      show.legend = F, color = "black", fill = sb[[1]]$fill.col) + 
    geom_text(data=sb[[2]], aes(x=xlab, y=ylab, label=text), inherit.aes=F, show.legend = F) 

enter image description here

+0

Nice. Bir metre birim projeksiyon ile kullandım. Aşağıdaki bölümde 'text = c (as.character (seq (0.0, ((n + 1) * d)/1000, by = d/1000)), birimleri (scalebar'da km) olması için tweaked. –

İlgili konular