使用 SVG 声明性地划线与复合线符号

Declaratively stroke a line with a composite line symbol using SVG

是否可以创建线符号定义,以便可以使用复合笔画来描绘路径?我需要用下面的符号画线,我不想创建两条路径来做这件事。

可以在功能规范的 "Recreational Boundary" 下找到该规范,此处:CanTopo map symbology definitions

基本上,笔划必须是一条黑色虚线,下方有一条偏移较粗的绿线,位于多段线的 'inside' 上。

您可以使用形态过滤器和一些幻想来做到这一点。此过滤器适用于

  • 以绿色虚线和红色填充开始
  • 然后创建一个红色填充设置为透明的图层(只是描边)
  • 以及描边设置为透明的图层(仅填充)
  • 然后采用划线路径并扩大它直到间隙重叠:)
  • 添加模糊和不透明度剪辑以获得漂亮的路径(形态学结果通常是像素化的,需要一些帮助才能看起来不错)
  • 将原来的绿色描边路径改成黑色
  • 将新的黑色笔画路径叠加在我们从形态学产生的粗绿线上
  • 用原始填充裁剪结果,所以我们在主线的边缘而不是中间得到破折号。

总而言之,最好使用两条路径。但如果你必须... :)

<svg width="2000px" height="2000px" viewBox="0 0 4000 4000">
  <defs>
    <filter id="dual-line" primitiveUnits="userSpaceOnUse">
      <feColorMatrix result="just-stroke" type="matrix" values="0 0 0 0 0
                                           0 1 0 0 0 
                                           0 0 1 0 0 
                                           -1 0 0 1 0"/>
      
       <feColorMatrix in="SourceGraphic" result="just-fill" type="matrix" 
                                   values="0 0 0 0 1
                                           0 0 0 0 0 
                                           0 0 0 0 0 
                                           0 0 0 1 0"/>     
      
  
       <feMorphology in="just-stroke" operator="dilate" radius="10"/>
       <feGaussianBlur stdDeviation="6"/>
      <feComponentTransfer result="pre-outer">
        <feFuncA type="table" tableValues="0 0 0 0.95 .95 .95 .95 .95  1">
      </feComponentTransfer>
        
        <feColorMatrix result="blackstroke" in="just-stroke" type="matrix" values=" 0 0 0 0 0
                                                                0 0 0 0 0
                                                                0 0 0 0 0 
                                                                0 0 0 1 0"/>
        
       <feComposite operator="over" in2="pre-outer" in="blackstroke"/>
        <feComposite operator="in" in2="just-fill"/>
   
    </filter>
    </defs>
<g filter="url(#dual-line)">
  <path d="M100 800 C 400 100, 650 100, 950 800 S 1500 1500, 100 800" stroke-width="5" stroke="green" fill="red" stroke-dasharray="25, 5, 3, 5"/>
</g>
</svg>