2011-03-18 9 views
18

मैं आर maps पैकेज, की तरह कुछ का उपयोग कर दुनिया के नक्शे पर कुछ स्थानों की प्लॉटिंग कर रहा हूँ:फिक्सिंग नक्शे प्रशांत के लिए पुस्तकालय डेटा केंद्रित (0 ° -360 ° देशांतर) प्रदर्शन

Map of the world, -180° to 180° longitude

आधार मानचित्र को आकर्षित करने के लिए आदेश है:

map("world", fill=TRUE, col="white", bg="gray", ylim=c(-60, 90), mar=c(0,0,0,0)) 

लेकिन मुझे प्रशांत केंद्रित मानचित्र प्रदर्शित करने की आवश्यकता है। मैं map("world2", आदि का उपयोग के साथ प्रशांत नक्शे पैकेज से आधार मानचित्र केंद्रित उपयोग करने के लिए, और मेरे dataframe (df) में डेटा बिंदुओं के निर्देशांक परिवर्तित:

df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360 

यह काम करता है अगर मैं fill विकल्प का उपयोग नहीं करते हैं, लेकिन fill के साथ बहुभुज जो 0 डिग्री कारणों को पार करते हैं।

Map of the world, 0° to 360° longitude

मुझे लगता है मैं किसी भी तरह इस सुलझाने के लिए maps पुस्तकालय से बहुभुज डेटा को बदलने की जरूरत है लगता है, लेकिन मैं पता नहीं कैसे इस पर प्राप्त करने के लिए किया है।

मेरा आदर्श समाधान -20 डिग्री पर बाएं सीमा के साथ नक्शे खींचना होगा और -30 डिग्री (यानी 330 डिग्री) पर दाएं सीमा को बनाना होगा। निम्नलिखित नक्शे पर सही अंक और तटरेखा हो जाता है, लेकिन पार शून्य समस्या एक ही

df$longitude[df$longitude < -20] = df$longitude[d$longitude < -20] + 360 
map("world", fill=TRUE, col="white", bg="gray", mar=c(0,0,0,0), 
    ylim=c(-60, 90), xlim=c(-20, 330)) 
map("world2", add=TRUE, col="white", bg="gray", fill=TRUE, xlim=c(180, 330)) 

किसी भी मदद की बहुत सराहना की जाएगी है।

+1

इसकी वजह से सीमाओं क्योंकि जहां कटौती है के बंद आकार फार्म नहीं है। – James

+0

यहां एक वर्कअराउंड है: डीएफ $ रेखांश के लिए एक बड़ा, मनमाना संख्या जोड़ें, उदाहरण 360 के लिए कहें। यह तब तक काम करना चाहिए जब तक आपको पैमाने पर लंबी अवधि दिखाने की आवश्यकता न हो। पुनश्च। मैंने ggplot() ग्राफिक्स का सफलतापूर्वक उपयोग किया है। – Andrie

+0

@ जेम्स, एक बंद बहुभुज अंत में दोहराए गए पहले बिंदु के साथ एक खुली बहुभुज है? क्या आप जानते हैं कि मैं इसे मानचित्र पैकेज में कैसे उपयोग कर सकता हूं? –

उत्तर

17

आप तथ्य यह है कि आंतरिक रूप से, एक map वस्तु map() समारोह से वापस लौटे पुनर्गणना और map() समारोह में फिर से इस्तेमाल किया जा सकता इस्तेमाल कर सकते हैं। मैं व्यक्तिगत बहुभुज के साथ एक सूची बनाउंगा, जांचें कि किसके पास बहुत अलग देशांतर मूल्य हैं, और उनको पुनर्व्यवस्थित करें। मैं * नीचे समारोह है, जो की तरह कुछ की अनुमति देता है में इस दृष्टिकोण का एक उदाहरण दिया:

plot.map("world", center=180, col="white",bg="gray", 
    fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

पाने के लिए

Corrected map center 180

अगर मैं तुम्हें थे, मैं सब कुछ थोड़ा और बदलाव चाहते हैं, जैसे:

plot.map("world", center=200, col="white",bg="gray", 
    fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

Corrected map center 200

समारोह:

plot.map<- function(database,center,...){ 
    Obj <- map(database,...,plot=F) 
    coord <- cbind(Obj[[1]],Obj[[2]]) 

    # split up the coordinates 
    id <- rle(!is.na(coord[,1])) 
    id <- matrix(c(1,cumsum(id$lengths)),ncol=2,byrow=T) 
    polygons <- apply(id,1,function(i){coord[i[1]:i[2],]}) 

    # split up polygons that differ too much 
    polygons <- lapply(polygons,function(x){ 
     x[,1] <- x[,1] + center 
     x[,1] <- ifelse(x[,1]>180,x[,1]-360,x[,1]) 
     if(sum(diff(x[,1])>300,na.rm=T) >0){ 
      id <- x[,1] < 0 
      x <- rbind(x[id,],c(NA,NA),x[!id,]) 
     } 
     x 
    }) 
    # reconstruct the object 
    polygons <- do.call(rbind,polygons) 
    Obj[[1]] <- polygons[,1] 
    Obj[[2]] <- polygons[,2] 

    map(Obj,...) 
} 

* ध्यान दें कि यह कार्य केवल सकारात्मक केंद्र मान लेता है। यह आसानी से दोनों दिशाओं में केंद्र मूल्यों की अनुमति देने के लिए अनुकूलित किया गया है, लेकिन अब यह मुश्किल नहीं है क्योंकि यह मामूली है।

+0

यह शानदार है, बहुत बहुत धन्यवाद! –

+2

@ माइकल डुन: आपका स्वागत है। यदि आपको कभी भी बहुभुज के नामों की आवश्यकता है, तो आपको फ़ंक्शन को अनुकूलित करना होगा ताकि आप मानचित्र ऑब्जेक्ट के '$ name' तत्व में विभाजित बहुभुज के नामों को दोगुना कर सकें। –

1

एक थोड़ी देर हो चुकी है, लेकिन आप भी एक स्थानांतरित कर दिया नक्शा एक प्रक्षेपण का उपयोग करके बना सकते हैं (mapproj पैकेज की आवश्यकता है):

map("world", projection="rectangular", parameter=0, 
     orientation=c(90,0,180), wrap=TRUE, fill=T, resolution=0,col=0) 

यह 180 डिग्री से परिवर्तन होगा। लेकिन 'world2' के साथ अंतर यह है कि देशांतर समन्वय अलग होगा ([-पीआई, पीआई])। इस पैकेज के सभी अनुमान केंद्र में 0 डाल दिए गए हैं। और उस स्थिति में, 'लपेटें' विकल्प कूद को सही ढंग से पहचानता है।

'रेज़ोल्यूशन = 0' क्लीनर सीमाएं प्राप्त करने में मदद करता है।

आप प्रक्षेपण विवरण में '180' मान को बदलकर आसानी से केंद्र देशांतर बदल सकते हैं।

0

मानचित्रों का नवीनतम संस्करण (3.2.0) स्थापित करें।

ऐसा करते हैं:

d$lon2 <- ifelse(d$lon < -25, d$lon + 360, d$lon) # where d is your df 
mapWorld <- map_data('world', wrap=c(-25,335), ylim=c(-55,75)) 

ggplot() + 
geom_polygon(data = mapWorld, aes(x=long, y = lat, group = group)) + 
geom_point(data = d, aes(x = lon2, y = lat)) 
संबंधित मुद्दे