ggmap

2016-08-21 32 views
7

पर उत्तर तीर और स्केल बार जोड़ने का पारदर्शी तरीका मैं संरक्षित क्षेत्रों का नक्शा बनाने के लिए ggmap का उपयोग करने की कोशिश कर रहा हूं, मैं नीचे Google धरती से उपग्रह छवि के साथ काम कर रहा हूं। मैं एक बहुत ही संतोषजनक छवि बना सकते हैं सिवाय इसके कि यह एक उत्तर तीर और बड़े पैमाने बार का अभाव:ggmap

enter image description here

मुझे पता है कि वहाँ बहुत लंबे इन तत्वों को जोड़ने के तरीके चढ़ा हुआ कर रहे हैं रहा हूँ (जैसे here) लेकिन वहाँ निश्चित रूप से करना चाहिए ऐसा करने के लिए एक और अधिक विचित्र तरीका हो!

मैं map.scale और north.arrow उपयोग करने की कोशिश की है, लेकिन इन दोनों ने मुझे दे:

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

मैं plot का उपयोग कर आधार आर में काम करने के लिए दोनों map.scale और north.arrow प्राप्त कर सकते हैं लेकिन फिर मैं करने के लिए अपने उपग्रह छवि नहीं मिल सकता है साजिश ठीक से। मैं बेस आर में arrows और text का उपयोग करके जो भी चाहता हूं उसे प्राप्त कर सकता हूं लेकिन फिर ये ggmap में काम नहीं करेंगे।

मैं जिस कोड का उपयोग कर रहा हूं वह नीचे है। आपके पास बहुभुज नहीं होगा (इसलिए मैं इसे कोड में शामिल नहीं करूंगा) लेकिन आप Google धरती छवि को लोड करने और त्रुटि को दोहराने में सक्षम होंगे।

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

इसे पढ़ने का एक सा कर से map.scale और north.arrow कार्यों की तरह खिड़की ggmap समारोह एक खुला चित्रमय विंडो के रूप में बनाता है पहचान नहीं कर रहे हैं। मैंने कुछ शोध किया है और इसे ठीक करने की कोशिश की लेकिन कुछ भी काम नहीं किया है। क्या कोई भी मुझे प्राप्त त्रुटि को ठीक करने या कोड की सैकड़ों लाइनों का उपयोग किये बिना ggmap में स्केल बार और उत्तर तीर प्राप्त करने का कोई तरीका सुझा सकता है?

+2

'ggsn' पैकेज आप के लिए काम नहीं कर रहा था? (https://cran.rstudio.com/web/packages/ggsn/) इसके अलावा, यदि आप वास्तव में संक्षिप्तता की परवाह करते हैं, तो 'संक्षिप्त' 3 कम वर्ण और $ BIGWORD है। – hrbrmstr

+0

यह वह है जो मेरे लिए काम करता है: https://github.com/3wen/legendMap मुझे ggsn के रूप में पसंद है, लेकिन यह legendMap – Ben

उत्तर

10

ऐसा लगता है कि map.scale और north.arrow बेस ग्राफिक्स के साथ काम करने के लिए डिज़ाइन किए गए हैं, लेकिन ggplot grid ग्राफिक्स का उपयोग करता है। मुझे लगता है कि स्थानिक डेटा ग्राफ़ बनाने से परिचित नहीं हूँ, लेकिन उत्तर तीर के लिए एक त्वरित हैक के रूप में, कोड के नीचे दो विभिन्न विकल्पों में शामिल हैं:

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 पर स्केलबार्स। इससे आपको यह ठीक करने के लिए अच्छा नियंत्रण मिल जाता है कि आप इसे कैसे चाहते हैं। उदाहरण के लिए,

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

नाइस की तुलना में ggmap के साथ काम करने के लिए बहुत दूर है। मैंने इसे एक मीटर इकाई प्रोजेक्शन के साथ इस्तेमाल किया। निम्न भाग 'text = c (as.character (seq (0.0, ((n + 1) * d)/1000, = d/1000 द्वारा) tweaked), इकाइयों)' स्केलबार में किमी संख्या है। –

संबंधित मुद्दे