首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >leaflet插件和leafletProxy

leaflet插件和leafletProxy
EN

Stack Overflow用户
提问于 2017-04-04 05:25:58
回答 2查看 822关注 0票数 11

类似于this example,我已经在一个闪亮的应用程序中添加了leaflet TextPath插件。这样做效果很好:

代码语言:javascript
复制
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) {
                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)

})

根据docs,我现在想使用leafletProxy(),这样当反应式数据源发生变化时,整个地图就不会被重新绘制。很遗憾,使用以下代码片段

代码语言:javascript
复制
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的主要目的是不重新渲染?如果这是正确的,有没有其他方法可以做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2019-02-24 11:47:08

它可能类似于下面的内容,尽管会有更多更干净的方法。

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

代码语言:javascript
复制
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')

  }
)
}
票数 1
EN

Stack Overflow用户

发布于 2018-10-18 14:21:00

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

听起来你必须自己更深入地挖掘Leaflet或触发leafletProxy,并通过使用两个数据源来确保数据源不会更改……(也许"Proxy“在这里用词不当。)

看看这些插件中是否有一个可以提供帮助:https://leafletjs.com/plugins#dynamiccustom-data-loading

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43194575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档