传单-多色图案填充

tre*_*con 2 svg fill leaflet

我需要在多边形要素中实现多色填充。填充将根据要素属性有条件地格式化。

假设我需要一个具有三色图案的多边形,如下所示:

let fillPalette = ['orange', 'green', 'blue'];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这在传单中怎么可能呢?

简而言之div,这可以通过以下 CSS 函数轻松实现:

background: repeating-linear-gradient(
  -45deg,
  orange,
  orange 10px,
  green 10px,
  green 20px,
  blue 20px,
  blue 30px
);
Run Code Online (Sandbox Code Playgroud)

然而,Leaflet 使用 SVG/Canvas。

我知道以下插件:

不幸的是,第一个似乎不支持多色图案,第二个仅支持图像。

有任何想法吗?

tre*_*con 5

对于任何感兴趣的人,这是我想出的解决方案:

当我们创建多边形时,我们将fillColor值设置为指向我们稍后定义的线性渐变。

let polygon = L.polygon(coords, {fillColor: 'url(#stripes)', fillOpacity: 1})
Run Code Online (Sandbox Code Playgroud)

条纹是使用线性渐变创建的没有颜色混合,如下所示:

let fillPalette = ['orange', 'green', 'blue'];

let gradientString = `<linearGradient id="stripes" x1="0%" y1="0%" x2="100%" y2="100%">
   <stop offset=0 stop-color=${fillPalette[0]} />
   <stop offset=33% stop-color=${fillPalette[0]} />
   <stop offset=33% stop-color=${fillPalette[1]} />
   <stop offset=66% stop-color=${fillPalette[1]} />
   <stop offset=66% stop-color=${fillPalette[2]} />
   <stop offset=100% stop-color=${fillPalette[2]} />
</linearGradient>`
Run Code Online (Sandbox Code Playgroud)

然后我们需要在 SVG 中定义上述线性渐变。SVG 可以按如下方式操作:

let svg = document.getElementsByTagName('svg')[0];
let svgDefs = document.createElementNS("http://www.w3.org/2000/svg", 'defs');
svgDefs.insertAdjacentHTML('afterbegin', gradientString);
svg.appendChild(svgDefs);
Run Code Online (Sandbox Code Playgroud)

这是一个工作小提琴https://jsfiddle.net/oyu60f1t/