传单插件和leafletProxy

时间:2017-04-03 21:25:58

标签: r shiny leaflet

我已将传单TextPath插件添加到闪亮的应用程序中,类似于this example。这非常有效:

leafletProxy()

根据docs我现在想使用leafletProxy("fullscreen_map", data = points) %>% onRender("function(el, x, data) { data = HTMLWidgets.dataframeToD3(data); data = data.map(function(val) { return [val.lat, val.lon]; }); var layer = L.polyline(data); layer.on('mouseover', function () { this.setText(' ► ', {repeat: true, attributes: {fill: 'blue'}}); }); layer.on('mouseout', function () { this.setText(null); }); layer.addTo(this); }", data = points) ,这样每当反应数据源发生变化时,整个地图都不会被重绘。唉,使用以下代码片段

onRender

无效。我假设这是因为leafletProxy仅在新渲染发生且{{1}}的整点不重新渲染时被调用?如果这是正确的,有没有办法用其他方法做到这一点?

2 个答案:

答案 0 :(得分:0)

文档说:影响renderLeaflet表达式的有效输入和表达式将导致从头开始重新绘制整个地图,并重置地图位置和缩放级别。

听起来您将不得不自己深入研究Leaflet或触发leafletProxy,并通过使用两个数据源来确保数据源不会发生变化(也许“ Proxy”在这里用词不当。)< / p>

查看一下以下插件之一是否可以帮助您:https://leafletjs.com/plugins#dynamiccustom-data-loading

答案 1 :(得分:0)

可能会有类似下面的内容,尽管会有更多更清洁的方法。

我所做的是使用leafletProxy从points_reactive()函数添加折线,同时将组设置为reactive。我曾经听过地图的layeradd事件,如果添加了一个带有reactive组的图层,则添加了textPath。

output$fullscreen_map <- renderLeaflet({
  points <- points_reactive()

  points %>%
    leaflet() %>% 
    addTiles() %>%
    fitBounds(~min(lon), ~min(lat), ~max(lon), ~max(lat)) %>%
    registerPlugin(textPathPlugin) %>%
    onRender("function(el, x, data) {
              var mymap = this;

              mymap.on('layeradd',
                function(e) {
                  console.log(e);
                  var layer = e.layer;

                  if (layer.groupname == 'reactive') {
                    layer.on('mouseover', function () {
                      this.setText('  ►  ', {repeat: true, attributes: {fill: 'blue'}});
                    });
                    layer.on('mouseout', function () {
                      this.setText(null);
                    });
                  }
                }
              );

            }", data = points)

  })

  observeEvent(input$clickme,{
               points <- points_reactive()

               leafletProxy('fullscreen_map') %>%
                 addPolylines(lng=points$lon, lat=points$lat, group='reactive')

  }
)
}