2015-08-28 2 views
14

मैं आर में पत्रक पैकेज का उपयोग करने के लिए एक amp आकर्षित और नीचे दी गई तालिका में अक्षांश और देशांतर जानकारी दी मार्करों कनेक्ट करने के लिए कोशिश कर रहा हूँ में पत्रक का उपयोग कर एक लाइन के साथ दो निर्देशांक कनेक्ट करें।मैं कैसे आर

 

    | Observation | InitialLat | InitialLong | NewLat | NewLong | 
    |-------------|------------|-------------|-----------|-----------| 
    | A   | 62.469722 | 6.187194 | 51.4749 | -0.221619 | 
    | B   | 48.0975 | 16.3108  | 51.4882 | -0.302621 | 
    | C   | 36.84  | -2.435278 | 50.861822 | -0.083278 | 
    | D   | 50.834194 | 4.298361 | 54.9756 | -1.62179 | 
    | E   | 50.834194 | 4.298361 | 54.9756 | -1.62179 | 
    | F   | 50.834194 | 4.298361 | 51.4882 | -0.302621 | 
    | G   | 47.460427 | -0.530804 | 51.44  | -2.62021 | 
    | H   | 51.5549 | -0.108436 | 53.4281 | -1.36172 | 
    | I   | 51.5549 | -0.108436 | 52.9399 | -1.13258 | 
    | J   | 51.5549 | -0.108436 | 51.889839 | -0.193608 | 
    |    | 51.5549 | -0.108436 | 52.0544 | 1.14554 | 

मैं NewLat और NewLong स्तंभों द्वारा दिए गए एक अंत बिंदु को InitialLat और InitialLong स्तंभों में निर्देशांक द्वारा दिए गए एक प्रारंभिक बिंदु से लाइनों आकर्षित करने के लिए चाहते हैं।

यहाँ मेरे वर्तमान आर कोड जो केवल मानचित्र पर मार्कर खींचता है।

 

    library(leaflet) 
    map3 = leaflet(data) %>% addTiles() 
    map3 %>% addMarkers(~InitialLong,~InitialLat, popup=~Observation) 

उत्तर

15

यहाँ leaflet पैकेज का उपयोग एक वैकल्पिक तरीका है। प्रदर्शन के उद्देश्य के लिए मैंने आपके डेटा में दो डेटा पॉइंट ले लिए हैं।

mydf <- data.frame(Observation = c("A", "B"), 
        InitialLat = c(62.469722,48.0975), 
        InitialLong = c(6.187194, 16.3108), 
        NewLat = c(51.4749, 51.4882), 
        NewLong = c(-0.221619, -0.302621), 
        stringsAsFactors = FALSE) 

मैं mydf का स्वरूप बदल गया है और पत्रक के लिए एक नया डेटा फ्रेम बनाने। आप अपने डेटा को विभिन्न तरीकों से दोबारा बदल सकते हैं।

mydf2 <- data.frame(group = c("A", "B"), 
        lat = c(mydf$InitialLat, mydf$NewLat), 
        long = c(mydf$InitialLong, mydf$NewLong)) 

# group  lat  long 
#1  A 62.46972 6.187194 
#2  B 48.09750 16.310800 
#3  A 51.47490 -0.221619 
#4  B 51.48820 -0.302621 

library(leaflet) 
library(magrittr) 

leaflet()%>% 
addTiles() %>% 
addPolylines(data = mydf2, lng = ~long, lat = ~lat, group = ~group) 

मैंने इंटरैक्टिव मानचित्र को ट्रिम किया। कृपया नीचे नक्शा देखें। हालांकि इस छवि में दो लाइनें जुड़े हुए हैं, वे अलग हो गए हैं। यदि आप कोड चलाते हैं और ज़ूम इन करते हैं, तो आप देखेंगे कि दो पंक्तियां अलग हैं।

enter image description here

9

पत्रक addPolylines फ़ंक्शन का उपयोग करके लाइनें जोड़ सकता है। इसके साथ समस्या यह मानती है कि हर पंक्ति जुड़ा हुआ है - आप उन्हें सभी जुड़े हुए होंगे।

इस (AFAIK) ठीक करने के लिए सबसे अच्छा तरीका है एक पाश का उपयोग करने के लिए है:

library(leaflet) 
map3 = leaflet(data) %>% addTiles() 
map3 <- map3 %>% addMarkers(~InitialLong,~InitialLat, popup=~Observation) 
for(i in 1:nrow(data)){ 
    map3 <- addPolylines(map3, lat = as.numeric(data[i, c(2, 4)]), 
           lng = as.numeric(data[i, c(3, 5)])) 
} 
map3 

संपादित करें: वहाँ भी केली वाकर द्वारा points_to_line function का उपयोग कर एक आसान तरीका है (के एक चिपकाया प्रति के लिए बहुत नीचे देख कोड)।

पहले डेटा नयी आकृति प्रदान, तो प्रारंभ और समाप्त होता वही कॉलम में हैं:

map3 = leaflet(data) %>% addTiles() 
map3 %>% addMarkers(~InitialLong, ~InitialLat, popup = ~Observation) %>% 
     addPolylines(data = y) 

points_to_line के स्रोत:

library(tidyr) 
library(dplyr) 
z <- gather(dta, measure, val, -Observation) %>% group_by(Observation) %>% 
      do(data.frame( lat=c(.[["val"]][.[["measure"]]=="InitialLat"], 
            .[["val"]][.[["measure"]]=="NewLat"]), 
          long = c(.[["val"]][.[["measure"]]=="InitialLong"], 
            .[["val"]][.[["measure"]]=="NewLong"]))) 

फिर points_to_line

z <- as.data.frame(z) 
y <- points_to_line(z, "long", "lat", "Observation") 

अब भूखंड फोन केली वाकर द्वारा:

012,
library(sp) 
library(maptools) 

points_to_line <- function(data, long, lat, id_field = NULL, sort_field = NULL) { 

    # Convert to SpatialPointsDataFrame 
    coordinates(data) <- c(long, lat) 

    # If there is a sort field... 
    if (!is.null(sort_field)) { 
    if (!is.null(id_field)) { 
     data <- data[order(data[[id_field]], data[[sort_field]]), ] 
    } else { 
     data <- data[order(data[[sort_field]]), ] 
    } 
    } 

    # If there is only one path... 
    if (is.null(id_field)) { 

    lines <- SpatialLines(list(Lines(list(Line(data)), "id"))) 

    return(lines) 

    # Now, if we have multiple lines... 
    } else if (!is.null(id_field)) { 

    # Split into a list by ID field 
    paths <- sp::split(data, data[[id_field]]) 

    sp_lines <- SpatialLines(list(Lines(list(Line(paths[[1]])), "line1"))) 

    # I like for loops, what can I say... 
    for (p in 2:length(paths)) { 
     id <- paste0("line", as.character(p)) 
     l <- SpatialLines(list(Lines(list(Line(paths[[p]])), id))) 
     sp_lines <- spRbind(sp_lines, l) 
    } 

    return(sp_lines) 
    } 
} 
0

मैं जानता हूँ कि यह एक साल पहले कहा गया था, लेकिन मैं एक ही सवाल था और पता लगा कि कैसे पत्रक में यह करने के लिए।

आपको पहले अपने डेटाफ्रेम को समायोजित करना होगा क्योंकि ऐडपोलीलाइन सिर्फ सभी निर्देशांक को अनुक्रम में जोड़ती है। मैं इस प्रदर्शन के प्रयोजन के लिए 4 अलग समाप्त होने के स्थानों के साथ एक dataframe कर देगा।

dest_df <- data.frame (lat = c(41.82, 46.88, 41.48, 39.14), 
        lon = c(-88.32, -124.10, -88.33, -114.90) 
       ) 

इसके बाद, मैं केंद्रीय गंतव्य स्थानों में से (इस उदाहरण में 4) एक ही आकार के स्थान के साथ एक डेटा फ्रेम बनाने के लिए जा रहा हूँ।मैं कारण है कि मैं जल्द ही

orig_df <- data.frame (lat = c(rep.int(40.75, nrow(dest_df))), 
        long = c(rep.int(-73.99,nrow(dest_df))) 
       ) 

कारण है कि मैं इस वजह से addPolylines एक दृश्य में सभी निर्देशांक कनेक्ट करेगा सुविधा कर रहा हूँ कर रहा हूँ की व्याख्या करेगा। आपके द्वारा वर्णित छवि बनाने के लिए इसे पाने का तरीका शुरुआती बिंदु से शुरू होता है, फिर गंतव्य बिंदु पर जा रहा है, और फिर शुरुआती बिंदु पर और फिर अगले गंतव्य बिंदु पर। आदेश dataframe यह करने के लिए बनाने के लिए, हम इस तरह के रूप में पंक्तियों में रखकर दो dataframes जिल्द करना होगा:

प्रारंभिक बिंदु - गंतव्य बिंदु 1 - प्रारंभिक बिंदु - गंतव्य बिंदु 2 - और इसके आगे ...

जिस तरह से मैं डेटा फ्रेम दोनों के लिए एक कुंजी बना सकता हूं। मूल डेटाफ्रेम के लिए, मैं 1 से शुरू करूंगा, और 2 से वृद्धि (उदा।, 1 3 5 7)। गंतव्य डेटाफ्रेम के लिए, मैं 2 से शुरू करूंगा और 2 से वृद्धि करूंगा (उदाहरण के लिए, 2, 4, 6, 8)। मैं फिर यूनियन का उपयोग करके 2 डेटाफ्रेम को गठबंधन करूंगा। फिर मैं अपने अनुक्रम से क्रमबद्ध बिंदु बनाने के लिए हर दूसरी पंक्ति को क्रमबद्ध करूंगा। मैं इसके लिए sqldf का उपयोग करने जा रहा हूं क्योंकि यही वह है जिसे मैं सहज महसूस करता हूं। एक और अधिक प्रभावी तरीका हो सकता है।

orig_df$sequence <- c(sequence = seq(1, length.out = nrow(orig_df), by=2)) 
dest_df$sequence <- c(sequence = seq(2, length.out = nrow(orig_df), by=2)) 

library("sqldf") 
q <- " 
SELECT * FROM orig_df 
UNION ALL 
SELECT * FROM dest_df 
ORDER BY sequence 
" 
poly_df <- sqldf(q) 

नई dataframe इस Notice how the origin locations are interwoven between the destination

और अंत में की तरह दिखता है, आप अपने नक्शे बना सकते हैं:

library("leaflet") 
leaflet() %>% 
    addTiles() %>% 

    addPolylines(
    data = poly_df, 
    lng = ~lon, 
    lat = ~lat, 
    weight = 3, 
    opacity = 3 
) 

And finally it should look like this मुझे आशा है कि यह किसी को जो इस तरह कुछ करने के लिए लग रही है में मदद करता है भविष्य में

1

लाइनों के उद्देश्य के आधार पर, दूसरा महान विकल्प gcIntermediate() है। यह पृथ्वी के वक्रता के आधार पर एक सर्विड स्पेटियललाइन ऑब्जेक्ट का उत्पादन करता है। हालांकि दिशाओं के लिए अच्छा नहीं है। स्पेटियललाइन क्लासेस ऑब्जेक्ट्स बहुत अच्छी तरह से कागजात के साथ काम करते हैं। उत्कृष्ट उदाहरण के लिए here देखें। मैंने एक संशोधित फॉर्म पोस्ट किया है, जो पॉल रेनर्स से डेटा फ्रेम से शुरू होता है।

library(leaflet) 
library(geosphere) 

mydf <- data.frame(InitialLat = c(62.469722,48.0975), # initial df 
       InitialLong = c(6.187194, 16.3108), 
       NewLat = c(51.4749, 51.4882), 
       NewLong = c(-0.221619, -0.302621)) 

p1 <- as.matrix(mydf[,c(2,1)]) # it's important to list lng before lat here 
p2 <- as.matrix(mydf[,c(4,3)]) # and here 

gcIntermediate(p1, p2, 
      n=100, 
      addStartEnd=TRUE, 
      sp=TRUE) %>% 
leaflet() %>% 
addTiles() %>% 
addPolylines()