2016-08-21 18 views
7

Tôi đang cố gắng sử dụng ggmap để tạo bản đồ của các khu vực được bảo vệ mà tôi đang làm việc với hình ảnh vệ tinh từ google earth bên dưới. Tôi có thể làm cho một hình ảnh rất khả quan ngoại trừ việc nó thiếu một mũi tên về phía bắc và quy mô thanh:Cách phân tích để thêm mũi tên hướng bắc và thanh tỷ lệ vào ggmap

enter image description here

Tôi biết rằng có rất dài hơi cách để thêm các yếu tố (ví dụ here) nhưng có phải chắc chắn là một cách phân tích hơn để làm điều đó!

Tôi đã cố gắng sử dụng map.scalenorth.arrow nhưng cả hai cho tôi:

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

tôi có thể có được cả hai map.scalenorth.arrow làm việc trong cơ sở R sử dụng plot nhưng sau đó tôi không thể nhận được hình ảnh vệ tinh của tôi để cốt truyện đúng cách. Tôi cũng có thể có được những gì tôi muốn sử dụng arrowstext trong cơ sở R nhưng một lần nữa những điều này sẽ không hoạt động trong ggmap.

Mã tôi đang sử dụng ở bên dưới. Bạn sẽ không có đa giác (vì vậy tôi sẽ không bao gồm nó trong mã) nhưng bạn sẽ có thể tải hình ảnh của Google Earth và tái tạo lỗi.

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") 

Từ làm một chút về đọc nó có vẻ như map.scalenorth.arrow chức năng không nhận ra cửa sổ ggmap chức năng tạo ra như một cửa sổ đồ họa mở. Tôi đã thực hiện một số nghiên cứu và cố gắng khắc phục điều này nhưng không có gì có hiệu quả. Có ai có thể đề xuất một cách để sửa lỗi tôi nhận được hoặc để có được một thanh tỷ lệ và mũi tên phía bắc trong ggmap mà không cần sử dụng hàng trăm dòng mã?

+2

'cái gói ggsn' đã không làm việc cho bạn? (https://cran.rstudio.com/web/packages/ggsn/) Ngoài ra, nếu bạn thực sự quan tâm về ngắn gọn, 'ngắn gọn' là 3 ký tự ít hơn và $ BIGWORD. – hrbrmstr

+0

Đây là một trong những công trình cho tôi: https://github.com/3wen/legendMap Tôi thích cái nhìn của ggsn, nhưng nó chỉ là quá nhiều fiddling để làm cho nó làm việc với ggmap, so với legendMap – Ben

Trả lời

10

Có vẻ như map.scalenorth.arrow được thiết kế để hoạt động với đồ họa cơ sở, nhưng ggplot sử dụng đồ họa grid. Tôi không phải là quen thuộc với vẽ đồ thị dữ liệu không gian, nhưng như một hack nhanh chóng cho Bắc mũi tên, mã dưới đây bao gồm hai lựa chọn khác nhau:

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

Tôi có xu hướng sử dụng chức năng của riêng tôi để vẽ scalebars trên ggmaps. Điều đó cho phép bạn kiểm soát tốt để đặt nó ra chính xác như thế nào bạn muốn nó. Ví dụ,

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. Tôi đã sử dụng nó với một phép chiếu đơn vị mét. Tinh chỉnh phần sau đây 'text = c (as.character (seq (0.0, ((n + 1) * d)/1000, by = d/1000)), đơn vị)' để có số km trong thanh tỷ lệ. –

Các vấn đề liên quan