【问题标题】:Is it possible to use rMaps to draw a route on a map in R?是否可以使用 rMaps 在 R 中的地图上绘制路线?
【发布时间】:2014-05-04 14:50:57
【问题描述】:

我正在尝试使用 rmaps http://rmaps.github.io/ 将车辆遵循的路线绘制到地图上。在我的理想世界中,地图应该: * 具有交互性(即可缩放、可滚动) * 存储和显示元数据(例如,当你点击一个标记时得到一个弹出窗口) * 显示车辆行驶的实际路径(使用路径点之间的直线,甚至可能沿着道路行驶)。 * 可嵌入到闪亮的网页中

通过 rMaps 向 Leaflet 地图添加标记非常容易。我只是想知道是否可以添加其他结构,例如 Leaflet.js 中可用的结构,例如 Polyline 和 Polygon。如果没有,是否计划在未来发布此类功能?

我在这里查看了传单的 rMaps 代码:https://github.com/ramnathv/rMaps/blob/master/R/Leaflet.R 而且我没有看到任何我认识的东西。 geoJson 有一个函数,我不知道怎么用。

【问题讨论】:

    标签: r map leaflet shiny polyline


    【解决方案1】:

    我一直在研究同样的问题。您可以在此处 (https://github.com/perliedman/leaflet-routing-machine) 找到一个“leaflet-routing-machine”插件,该插件具有计算航路点之间路线的功能。他们的演示很酷!

    我一直在尝试使用 rMaps 和这个传单插件绘制两个位置之间的路线。我仍在努力让我的代码正常工作(我想我遗漏了一些东西),但这是到目前为止的样子。

    library(rMaps)
    library(leaflet)
    
    map = Leaflet$new()
    map$setView(c(50.6067, 3.6254), 6)
    map$tileLayer(provider="MapQuestOpen.OSM")
    map$marker(c(48.8588,2.3469), bindPopup = 'Pickup Location')
    map$marker(c(52.3546,4.9039), bindPopup = 'Dropoff Location')
    map
    
    map$addAssets(jshead = c("leaflet-routing-machine.min.js"))
    map$setTemplate(afterScript = sprintf("
       <script>
       L.Routing.control({
           waypoints: [
               L.latLng(48.8588,2.3469),
               L.latLng(52.3546,4.9039)
           ],
           geocoder: L.Control.Geocoder.nominatim(),
           plan: L.Routing.plan(null, {
               waypointIcon: function(i) {
                    return new L.Icon.Label.Default({ labelText: String.fromCharCode(65 + i)});
               }
           })
       }).addTo(map);
       </script>
     "))
    map
    

    至少,我认为如果你看看这个插件可能会有所帮助,虽然我还没有完全弄清楚如何绘制路线!

    【讨论】:

      【解决方案2】:

      为了添加一个 poligon(例如一个圆圈),您应该:

      1. 转到实际地图的 html 页面的位置(您应该在浏览器中看到该位置)并右键单击打开它,最好使用记事本 ++
      2. 寻找:

        var map = L.map(spec.dom, { 全屏控制:真 }).setView(spec.center, spec.zoom);

        if (spec.provider){
          L.tileLayer.provider(spec.provider).addTo(map)    
        } else {
        L.tileLayer(spec.urlTemplate, spec.layerOpts).addTo(map)
        }
        

      然后您可以使用以下代码添加一个漂亮的圆圈,(不要忘记保存文件):

      L.circle([29.7601927,-95.3693896],7200,{color:'red'}).addTo(map).bindPopup('some thing').addTo(map)
      

      如需了解更多信息,请参阅 http://leafletjs.com/reference.html 中的传单 API

      顺便说一句,rmaps 只是 R 和传单的接口,如果你想创建真正疯狂的东西,你应该习惯打开 html 文件并从传单 API 添加 java 脚本代码,人们创造了令人惊叹的插件,还有更多只是添加多边形,很酷的例子见:

      http://leafletjs.com/plugins.html

      我也很喜欢这个:

      http://threatwiki.thesentinelproject.org/iranvisualization

      只是添加一些关于 rMaps 如何工作的额外信息(rCharts 也是如此)

      1. rMaps 所做的只是创建 javascript 代码,地图的构建由您的 Web 浏览器完成,这意味着如果您将转到安装 rmaps 的库并将其复制到另一台计算机没有 R,html 文件将完美运行,这意味着您可以创建一个 rMap,然后在 html 文件中手动添加任何 rMaps 不支持的传单 API 中的元素,正如我所解释的(我展示了如何为“圆”做这件事)。

      2. 对于闪亮的应用程序,您无法手动添加内容,因此您必须确保 rmap 支持 API 中的元素。为了了解支持 API 的哪些元素,首先创建一个地图:

        地图

      然后查看“地图”的所有元素,并将其与传单 API 进行比较。 例如,您可以在 API 中找到标记创建命令:

      http://leafletjs.com/reference.html#marker(来自小册子 API),由以下人员创建:

      L.marker([51.5, -0.09]).bindPopup('Hi. I am a popup').addTo(map);
      

      在 rMaps 中有一个等价物:

      map$marker(
        c(51.5, -0.09),
        bindPopup = 'Hi. I am a popup'
      )
      

      你感兴趣的leaflet API中的每个元素一步一步去,如果不存在,你可以在Github中请求ramnath添加它https://github.com/ramnathv/rMaps/pulls, 或由您自己创建一个在 R 代码中执行此操作的函数。

      【讨论】:

      • 谢谢,这是非常有用的建议。我需要学习Javascript。我还需要了解如何让 R/Shiny 动态更新 Javascript,但这是另一个问题。如果我找到方法,我会在这里发布。
      • 仅在 HTML 文件中使用传单 API,您不必学习 JavaScript(尽管我确实建议这样做),您可以坚持使用传单的示例,在 API 中或教程。
      猜你喜欢
      • 2010-10-05
      • 2021-12-13
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 2014-02-25
      相关资源
      最近更新 更多