R:连接地图上的点 [英] R: Connecting Dots on a Map

查看:48
本文介绍了R:连接地图上的点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用R编程语言。

我使用";小册子";库为这5个城市绘制了以下地图:

library(dplyr)
library(leaflet)

map_data <- data.frame("Lat" = c(43.6426, 43.6424, 43.6544, 43.6452, 43.6629), "Long" = c(-79.3871, -79.3860, -79.3807, -79.3806,-79.3957 ), type = c(1,2,3,4,5))

map_data$type = as.factor(map_data$type)



leaflet(map_data) %>%
    addTiles() %>% addCircleMarkers(stroke = FALSE, label = ~type,fillOpacity = 0.8, labelOptions = labelOptions(direction = "center",style = list('color' = "white"),noHide = TRUE, offset=c(0,0), fill = TRUE, opacity = 1, weight = 10, textOnly = TRUE))

在我创建的这张上面的地图上,我现在要根据这些点的&qot;编号";(例如,将1与2连接,2与3连接,3与4连接,4与5连接,5与1连接),将";所有这些";点";(即城市)连接到地图上(例如,将1与2连接,将2与3连接,将4与5连接,将5与1连接),并输出路线的";总距离(";Total Distance";)。我发现上一篇帖子说明了如何做到这一点:How to show path and distance on map with leaflet, shiny apps?

我尝试修改此帖子中的代码以适应我的问题:

library(osrm)

route = osrmRoute(c(-79.3871, -79.3860, -79.3807, -79.3806,-79.3957 ), c(43.6426, 43.6424, 43.6544, 43.6452, 43.6629),  overview = 'full')


route_summary = osrmRoute(c(-79.3871, -79.3860, -79.3807, -79.3806,-79.3957 ), c(43.6426, 43.6424, 43.6544, 43.6452, 43.6629), overview = FALSE)

leaflet() %>% addTiles() %>% 
    addCircleMarkers(c(-79.3871, -79.3860, -79.3807, -79.3806,-79.3957 ), c(43.6426, 43.6424, 43.6544, 43.6452, 43.6629), stroke = FALSE, label = ~type,fillOpacity = 0.8, 
                     labelOptions = labelOptions(direction = "center",style = list('color' = "white"),noHide = TRUE, offset=c(0,0), fill = TRUE, opacity = 1, weight = 10, textOnly = TRUE)) %>% 
    addPolylines(route$lon,route$lat, 
                 label = paste(round(route_summary[1]/60), 'hr - ', round(route_summary[2]), 'km'), 
                 labelOptions = labelOptions(noHide = TRUE))

但这将返回以下错误:

Error in UseMethod("metaData") : 
  no applicable method for 'metaData' applied to an object of class "NULL"

有人能向我演示如何解决此问题吗?

我希望使用";LEAFLE&QOOT;而不是使用&RSHHINY&QOOT;来完成此操作。最后,我希望最终地图看起来像这样(这应该表示一个旅行商问题中的一条单一路径&&q;):

谢谢!

注意:我开始认为问题可能是";osrmRoute()";函数可能无法工作超过2个点?

推荐答案

一种方式是您进行接口调用:

https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md

我只概述一下您是如何做到的:

数据

df <- data.frame(
  lon = c(-79.3871, -79.3860, -79.3807, -79.3806,-79.3957), 
  lat = c(43.6426, 43.6424, 43.6544, 43.6452, 43.6629)
)

url调用

root <- "http://router.project-osrm.org/route/v1/driving/"

options <- c(
  continue_straight = "true",
  overview = "full",
  annotations = "true",
  steps = "true"
) 
  
coords <- df %>% 
  slice(c(seq_len(n()), 1)) %>%
  pmap_chr(str_c, sep = ",") %>% str_c(collapse = ";")
options <- options %>%
  imap_chr(~str_c(.y, "=", .x)) %>%
  str_c(collapse = "&") %>%
  str_c("?", .)

res <- rjson::fromJSON(file = str_c(root, coords, options))

请注意,我已将第一个点添加为第六行以形成圆形路线。

地图

res$routes[[1]]$geometry %>%
  googlePolylines::decode() %>%
  .[[1]] %>%
  leaflet() %>%
  addTiles() %>%
  addPolylines(lng = ~lon, lat = ~lat) %>%
  addCircleMarkers(
    data = df,
    stroke = FALSE, 
    label = seq_len(nrow(df)),
    fillOpacity = 0.8, 
    labelOptions = labelOptions(
      direction = "center",
      style = list('color' = "white"),
      noHide = TRUE, 
      offset=c(0,0), 
      fill = TRUE, 
      opacity = 1, 
      weight = 10, 
      textOnly = TRUE
    )
  )   

距离

res$routes[[1]]$distance

这是以米为单位(文档)

这篇关于R:连接地图上的点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆