Leaflet多边形模糊轮廓线

4
我正在寻找一种方法来实现叶片多边形的模糊/渐变轮廓。这可以帮助使国家轮廓更简单(当前,当您缩放到表示国家的svg时,它会变得丑陋/不准确)。
我考虑将CSS属性附加到svg上,类似于此:http://www.w3schools.com/svg/svg_fegaussianblur.asp,但显然用于leaflet多边形的svg子元素<g>不接受此操作。
我还查看了svg的<defs>(请参见此处:http://geoexamples.blogspot.be/2014/01/d3-map-styling-tutorial-ii-giving-style.html),但不知道如何将其应用于leaflet。 http://leafletjs.com/examples/quick-start-example.html example illustration
1个回答

4

首先,您需要将实际的 filter 元素放入地图的 svg 元素中,否则将过滤器分配给 pathg 是无效的,因为过滤器将未定义。因此,您需要在 JavaScript 中执行此操作。但是,在 CSS 中通过类名分配过滤器似乎是不可能的,因为它只能与 CSS 的 url() 函数一起使用,这种方法无法适用于嵌入在 Leaflet 的叠加面板中的动态 SVG。但是,您可以在 JavaScript 中进行分配:

// Get the SVG element from the overlayPane
var svg = map.getPanes().overlayPane.firstChild,
    // Create filter element
    svgFilter = document.createElementNS('http://www.w3.org/2000/svg', 'filter'),
    // Create blur element
    svgBlur = document.createElementNS('http://www.w3.org/2000/svg', 'feGaussianBlur');

// Set ID attribute of filter
svgFilter.setAttribute('id', 'blur');

// Give room to blur to prevent clipping
svgFilter.setAttribute('x', '-100%');
svgFilter.setAttribute('y', '-100%');
svgFilter.setAttribute('width', '500%');
svgFilter.setAttribute('height', '500%');

// Set deviation attribute of blur
svgBlur.setAttribute('stdDeviation', 3);

// Append blur element to filter element 
svgFilter.appendChild(svgBlur);
// Append filter element to SVG element
svg.appendChild(svgFilter);

之后,您可以在多边形、线段等上使用过滤器:

// Creating a polygon and adding to the map
var polygon = L.polygon([[10, 10],[-10,10], [-10,-10],[10,-10]]).addTo(map);

// Set filter attribute on the polygon
polygon._path.setAttribute('filter', 'url(#blur)');

好的,这里是一个Plunker上的工作示例:http://plnkr.co/edit/JTNgeXuiBaL8LIbmkVjz?p=preview


谢谢!这非常接近我想要实现的效果。我稍微修改了你的 plunker: http://plnkr.co/edit/xmjgwxSAo4TJx7ZfgAhr?p=preview只有一个问题:当你滚动时,<g> 的边缘变得非常锐利。有什么办法让它“溢出” <g> 的边缘? - nauti
是的,我猜测<g>没有实际的宽度或样式,而只是svg子元素的容器,这里是一个路径。因此,如果可能的话,溢出应该应用于路径元素。但是添加overflow="visible"似乎没有任何效果。 - nauti
经过一些研究,我现在知道溢出不起作用:“溢出属性适用于建立新视口(见下文)的元素、<pattern>元素和<marker>元素。对于所有其他元素,该属性没有效果。”https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/overflow 我认为解决方案在于filterUnits,请参见http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion 我已经通过设置过滤器的widthheight取得了一些成功,但我认为关键是xy坐标。请参见更新的plunk:http://plnkr.co/edit/JTNgeXuiBaL8LIbmkVjz?p=preview - iH8
就是这样!http://plnkr.co/edit/tis1feSfRnt3VZ8g9qOf?p=preview 添加了这两行代码svgFilter.setAttribute('x', '-100%');和svgFilter.setAttribute('y', '-100%'); 就解决了问题。 - nauti
做得好 :) 我会将其编辑到答案中,以便其他有相同问题的用户找到它。很高兴现在它能正常工作了,我点了个赞,好问题! - iH8
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接