2016-04-11 15 views
5

Mới đây và tương đối mới với R, vì vậy hãy tha thứ cho apriori và cho tôi biết những gì tôi đang làm sai trong bài đăng này để tránh làm phiền người khác trong tương lai:Không thể lặp lại gói tờ rơi của R để tạo nhiều bản đồ

Tôi đang cố tạo một chuỗi (Sep-1971 đến Apr-1972) của bản đồ tờ rơi. Cuối cùng, tôi muốn crunch chúng vào sáng bóng và có một người dùng chơi/tạm dừng một hình ảnh động (sáng bóng looping hoạt hình trượt).

Không có thời gian và vòng lặp nào phù hợp với tôi. Số gia tăng đã làm việc khi tôi kiểm tra số i của mình sau khi chạy mã, các chức năng của tờ rơi không. Không có vòng lặp, "Dynamic Leaflet Fails" của tôi (xem bên dưới trong phần mã) đã làm việc và mở một bản đồ.

Bạn không thể tạo tờ rơi tuần tự?

#set working directory 
require(leaflet) 
require(dplyr) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(Latitude <-c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), Longitude <- c(
129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), start <- c(as.Date(
"15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972", format = "%d-%b-%Y"))) 

#"Dynamic" leaflet Fails1: While+For combo 
i<- as.Date("1971-09-14") 
while (i < as.Date("1972-05-01")) { for(star in start){ 
if (star > i) { 
leaflet(power) %>% addTiles() %>% 
    addCircleMarkers(lng = ~Longitude, lat = ~Latitude) 
}} 
i <- i+60} 

#"Dynamic" leaflet Fails2: For+break combo 
lap <- seq(as.Date("1971-09-14"), as.Date("1972-05-01"), by = "month") 
for(i in lap) { 
leaflet (data = power[power$start > i,]) %>% 
addTiles() %>% 
addCircleMarkers(lng = ~Longitude, lat = ~Latitude) 
if (i > as.Date("1951-01-01")) 
{  break }} 
+0

Do tờ rơi đó tạo bản đồ động, bạn nên xây dựng một bản đồ nơi bạn có thể điều chỉnh ngày bắt đầu. 'shiny' làm cho nó khá dễ dàng. Nếu không, nếu bạn đang sử dụng tờ rơi để tạo bản đồ tĩnh (không phải là một ý tưởng tuyệt vời), hãy xây dựng một chức năng vẽ sơ đồ hoặc ít nhất là lưu trữ các bản đồ bạn đang xây dựng để bạn có thể làm gì đó với chúng. – alistaire

+0

Cảm ơn alistaire! Sự khác biệt giữa bản đồ tờ rơi tĩnh (đơn) và tĩnh là gì? Nếu có một, tôi đang thiếu một cái gì đó rất lớn. Như tôi thấy, tờ rơi sẽ không để cho bóng sáng can thiệp vào các điều chỉnh, nhưng tôi có thể sai và tôi đang mở để gợi ý. Với tất cả những điều này, tôi đang cố gắng tạo ra sth như thế này: (https://seth127.shinyapps.io/slider/) nhưng tôi không thể tìm thấy mã từ bất kỳ dự án nào trước đây, nơi hoạt hình và tờ rơi lặp sáng bóng được kết hợp. Nếu bạn có một gợi ý làm thế nào để đi về điều này, xin vui lòng khai sáng cho tôi! – Naibaf

+0

Uh! -3 về nỗ lực nghiên cứu. Trở lại trải nghiệm và trái tim tôi tan vỡ. Trong tất cả các mức độ nghiêm trọng, tôi đã đưa ra rất nhiều thử nghiệm và lỗi và lướt web, có lẽ nhiều hơn những gì bài viết của tôi dường như có liên quan. Chia sẻ bộ não của bạn với tôi, plz – Naibaf

Trả lời

12

Đây là cách nhanh chóng để thêm leaflet-timeline theo cách bạn đề xuất. Vì một lý do nào đó, trình tự thời gian không hiển thị hoàn hảo trong Trình xem RStudio, nhưng nó có vẻ hoạt động chính xác trong Chrome. Tôi đã nhận xét nội tuyến trong mã để mô tả các bước.

library(htmlwidgets) 
library(htmltools) 
library(leaflet) 
library(geojsonio) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(
    "Latitude" = c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), 
    "Longitude" = c(129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), 
    "start" = do.call(
    "as.Date", 
    list(
     x = c("15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972"), 
     format = "%d-%b-%Y" 
    ) 
) 
) 

# set start same as end 
# adjust however you would like 
power$end <- power$start 


# use geojsonio to convert our data.frame 
# to GeoJSON which timeline expects 
power_geo <- geojson_json(power,lat="Latitude",lon="Longitude") 

# create a leaflet map on which we will build 
leaf <- leaflet() %>% 
    addTiles() 

# add leaflet-timeline as a dependency 
# to get the js and css 
leaf$dependencies[[length(leaf$dependencies)+1]] <- htmlDependency(
    name = "leaflet-timeline", 
    version = "1.0.0", 
    src = c("href" = "http://skeate.github.io/Leaflet.timeline/"), 
    script = "javascripts/leaflet.timeline.js", 
    stylesheet = "stylesheets/leaflet.timeline.css" 
) 

# use the new onRender in htmlwidgets to run 
# this code once our leaflet map is rendered 
# I did not spend time perfecting the leaflet-timeline 
# options 
leaf %>% 
    setView(44.0665,23.74667,2) %>% 
    onRender(sprintf(
    ' 
function(el,x){ 
    var power_data = %s; 

    var timeline = L.timeline(power_data, { 
     pointToLayer: function(data, latlng){ 
     var hue_min = 120; 
     var hue_max = 0; 
     var hue = hue_min; 
     return L.circleMarker(latlng, { 
      radius: 10, 
      color: "hsl("+hue+", 100%%, 50%%)", 
      fillColor: "hsl("+hue+", 100%%, 50%%)" 
     }); 
     }, 
     steps: 1000, 
     duration: 10000, 
     showTicks: true 
    }); 
    timeline.addTo(HTMLWidgets.find(".leaflet")); 
} 
    ', 
    power_geo 
)) 
+1

instantportfolio, bạn là một thuật sĩ và một quý ông thực sự. Tôi đã chọn 'power $ end <- power $ start + 90' để thực sự nhìn thấy các điểm đánh dấu và tôi sẽ chơi với nó một số chi tiết. Cảm ơn bạn rât nhiêu. – Naibaf

+0

@timelyportfolio. câu trả lời chính xác. Bạn sẽ làm gì để biến màu có điều kiện thành một biến? – MLavoie

+0

nếu tôi hiểu chính xác bạn có thể thêm vào 'sprintf' với 'jsonlite :: toJSON' một bản đồ màu. Vì vậy, 'var colors =% s' và sau đó là' jsonlite :: toJSON (danh sách (var1 = list (color = "...", fillColor = "...", ...), auto_unbox = TRUE) 'và cuối cùng thêm tìm kiếm trong JavaScript Khó để giải thích trong bình luận – timelyportfolio

7

Phiên bản cập nhật của bài đăng của @ timelyportfolio từ năm ngoái. Tôi cần thêm một hàm timelineControl để làm cho nó hoạt động. Tôi cũng cần gọi hàm getMap() của phần tử tờ rơi để có được các hàm liên kết với đối tượng bản đồ.

library(htmlwidgets) 
library(htmltools) 
library(leaflet) 
library(geojsonio) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(
    "Latitude" = c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), 
    "Longitude" = c(129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), 
    "start" = do.call(
     "as.Date", 
     list(
      x = c("15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972"), 
      format = "%d-%b-%Y" 
     ) 
    ) 
) 

# set start same as end 
# adjust however you would like 
power$end <- power$start + 30 


# use geojsonio to convert our data.frame 
# to GeoJSON which timeline expects 
power_geo <- geojson_json(power,lat="Latitude",lon="Longitude", pretty = T) 

# create a leaflet map on which we will build 
leaf <- leaflet() %>% 
    addTiles() 

# add leaflet-timeline as a dependency 
# to get the js and css 
leaf$dependencies[[length(leaf$dependencies)+1]] <- htmlDependency(
    name = "leaflet-timeline", 
    version = "1.0.0", 
    src = c("href" = "http://skeate.github.io/Leaflet.timeline/"), 
    script = "javascripts/leaflet.timeline.js", 
    stylesheet = "stylesheets/leaflet.timeline.css" 
) 

# use the new onRender in htmlwidgets to run 
# this code once our leaflet map is rendered 
# I did not spend time perfecting the leaflet-timeline 
# options 
leaf %>% 
    setView(44.0665,23.74667,2) %>% 
    onRender(sprintf(
     ' 
     function(el,x){ 
     var power_data = %s; 

     var timelineControl = L.timelineSliderControl({ 
      formatOutput: function(date) { 
      return new Date(date).toString(); 
      } 
     }); 

     var timeline = L.timeline(power_data, { 
     pointToLayer: function(data, latlng){ 
     var hue_min = 120; 
     var hue_max = 0; 
     var hue = hue_min; 
     return L.circleMarker(latlng, { 
     radius: 10, 
     color: "hsl("+hue+", 100%%, 50%%)", 
     fillColor: "hsl("+hue+", 100%%, 50%%)" 
     }); 
     }, 
     steps: 1000, 
     duration: 10000, 
     showTicks: true 
     }); 
     timelineControl.addTo(HTMLWidgets.find(".leaflet").getMap()); 
     timelineControl.addTimelines(timeline); 
     timeline.addTo(HTMLWidgets.find(".leaflet").getMap()); 
     } 
     ', 
     power_geo 
    )) 
+0

@timelyportfolio: Điều này là tuyệt vời nhưng giả sử bạn có một data.frame phức tạp hơn, làm thế nào để bạn chỉ ra biến nào chứa thông tin dòng thời gian? Có một đối số cho điều này trong ' geojson_json() '? –

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