类似于this example,我已经在一个闪亮的应用程序中添加了leaflet 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) {
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(),这样当反应式数据源发生变化时,整个地图就不会被重新绘制。很遗憾,使用以下代码片段
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的主要目的是不重新渲染?如果这是正确的,有没有其他方法可以做到这一点?
发布于 2019-02-24 11:47:08
它可能类似于下面的内容,尽管会有更多更干净的方法。
我所做的是使用leafletProxy从points_reactive()函数添加多段线层,同时将group设置为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')
}
)
}发布于 2018-10-18 14:21:00
文档说:影响renderLeaflet表达式的活动输入和表达式将导致从头开始重新绘制整个地图,并重置地图位置和缩放级别。
听起来你必须自己更深入地挖掘Leaflet或触发leafletProxy,并通过使用两个数据源来确保数据源不会更改……(也许"Proxy“在这里用词不当。)
看看这些插件中是否有一个可以提供帮助:https://leafletjs.com/plugins#dynamiccustom-data-loading
https://stackoverflow.com/questions/43194575
复制相似问题