如何使用MapServer使用完全透明的填充为多边形着色?


11

是否可以填充多边形,以便它们在MapServer中完全透明?我想要一个稍微不透明的黑色背景,并且无论哪里有多边形,我都希望它完全透明且没有填充。我通过以下方式设置背景:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

我尝试创建一个白色来填充多边形的类,并尝试使用TRANSPARENCY0-100范围内的值进行不透明度,但它不会产生清晰的多边形:

CLASS
      NAME "light"  
      EXPRESSION ([max_cost] == 2000)     
      STYLE       
        OUTLINECOLOR 255 255 255
        COLOR 255 255 255
        SIZE       1
        WIDTH      2.0        
      END
END 

这将导致以下类型的图像:

在此处输入图片说明

而不是用白色填充的多边形;我希望它没有颜色。我在网上找到了一条建议来定义这种颜色:

COLOR -1 -1 -1

但它也没有用。在文档的此部分中,描述了以下内容:

“ PALETTE = / path / to / palette.txt”用于定义可以找到调色板颜色的绝对路径。对于RGB图像模式,此文件必须包含256个r,g,b三元组条目,对于RGBA图像模式必须包含r,g,b,a四元组。预期的格式是每行一个三联体(或四联体),每个值用逗号分隔,并且每个三联体/四联体在一行上。如果要对调色板使用透明度,则在调色板文件中具有以下两种颜色很重要:0,0,0,0和255,255,255,255。

阅读此内容后,我也尝试使用,COLOR 0 0 0 0但这会引发错误:

未知的标识符。(0)附近的解析错误:(第71行)

我不明白如何使用“定义颜色”,PALETTE=/path/to/palette.txt但这似乎是实现此目的的一种可能方法。


避免头痛的一种方法是将多边形转换为线。
nadya 2012年

这样我怎么不填充多边形呢?
djq 2012年

2
我的意思是,使用任何GIS软件创建代表多边形轮廓的线shapefile,并将这些线添加到Mapserver中,而不是添加到多边形中。行根本不能填满。
nadya 2012年

我不在乎线条是否出现;我只想要一个清晰的多边形填充。
djq 2012年

1
无需将多边形转换为线-您可以为MAP文件中的图层定义“ TYPE line”,也可以为多边形几何定义
user1702401 2012年

Answers:


4

Mapserver最近引入了遮罩层的概念(遮罩的行为与Photoshop中的遮罩非常相似,因为它与所应用的图层混合在一起)。

RFC描述他们做什么,他们如何使用。通过阅读答案,似乎可以使用遮罩层来获得所需的“锁眼”效果。

我不确定此功能是否已纳入几周前发布的6.2中。


4

因此,您想通过透明多边形“穿透”黑色背景以查看下部背景。我不确定MapServer是否可以,但是我可以建议另一个技巧。

您可以使用任何GIS软件创建一个覆盖您所有区域甚至更大范围的非常大的多边形。然后,您可以从该区域多边形中删除多边形,然后将该有孔多边形放置在MapServer上并将其设为黑色,而不是黑色背景。对应于多边形的孔将是“透明的”。


1

我的.map文件中包含这些行,并且透明度低于100的文件正在运行。

  LAYER 
    NAME         core_areas
    DATA         core_areas.shp
    STATUS       ON
    TYPE         POLYGON
    TRANSPARENCY 100
    SIZEUNITS pixels
    PROJECTION
       "init=epsg:32629"
    END # projection
    CLASS
      STYLE
        COLOR        20 150 90
        OUTLINECOLOR 7 56 41
        WIDTH        1
      END # STYLE
    NAME "Core areas"
    END # CLASS
  END # Layer

希望能帮助到你。


这是否导致了一个完全透明的多边形?我尝试使用TRANSPARENCY0-100的值进行实验,它似乎只是在调整不透明度。我意识到这在我最初的问题中并不明确-我对其进行了修订。
djq 2012年

因此,您只需要多边形的轮廓和内部所有透明的东西,对吗?我可能会误解并建议总体透明。
nadya 2012年

抱歉给我带来双重困惑;只需清除多边形填充;线无所谓。
djq 2012年

1
@djq TRANSPARENCY在5.0版中已被贬低。图层OPACITY是要使用的正确属性。
DavidF 2012年

1

下面是显示透明遮罩层的示例图像。如果您将遮罩做得更大,那么您的用户将不会注意到外部边缘。与@nadya建议的类似,您可以:

  1. 创建一个大的矩形多边形
  2. 为每个“切口”创建多边形
  3. 从较大的多边形中减去较小的多边形(QGIS中的“差异”工具对此非常有效)

透明面膜

此时,您将拥有一个成品的口罩。但是,如果要向剪切空间添加标签,则需要(使用联合工具)将较小的多边形添加回蒙版。然后,使用Mapserver中的SLD文件,可以将遮罩样式设置为透明的灰色,将样式设置为完全透明的样式,然后在此处应用标签。这是一个示例SLD文件(这是为Geoserver构建的):

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <NamedLayer>
    <Name>yards</Name>
    <UserStyle>
      <Name>yards</Name>
      <Title>Polygon Style</Title>
      <FeatureTypeStyle>
        <Name>name</Name>
        
        <Rule>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>TYPE</ogc:PropertyName>
              <ogc:Literal>outer</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#555555</CssParameter>
              <CssParameter name="fill-opacity">0.5</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke-width">0</CssParameter>
            </Stroke>
          </PolygonSymbolizer>  
        </Rule>
        
        <Rule>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>TYPE</ogc:PropertyName>
              <ogc:Literal>inner</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#555555</CssParameter>
              <CssParameter name="fill-opacity">0</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-opacity">0</CssParameter>
              <CssParameter name="stroke-width">0</CssParameter>
            </Stroke>
          </PolygonSymbolizer>  
        </Rule>
        
        <Rule>
          <MinScaleDenominator>10000</MinScaleDenominator>
          <TextSymbolizer>
            <Geometry>
              <ogc:Function name="centroid">
                <ogc:PropertyName>the_geom</ogc:PropertyName>
              </ogc:Function>
            </Geometry>
            <Label>
              <ogc:PropertyName>SITE</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Arial</CssParameter>
              <CssParameter name="font-size">11</CssParameter>
              <CssParameter name="font-style">normal</CssParameter>
              <CssParameter name="font-weight">bold</CssParameter>
            </Font>
            <LabelPlacement>
              <PointPlacement>
                <AnchorPoint>
                  <AnchorPointX>
                    <ogc:Literal>0.0</ogc:Literal>
                  </AnchorPointX>
                  <AnchorPointY>
                    <ogc:Literal>0.5</ogc:Literal>
                  </AnchorPointY>
                </AnchorPoint>
                <Rotation>
                  <ogc:Literal>0</ogc:Literal>
                </Rotation>
              </PointPlacement>
            </LabelPlacement>
            <Halo>
              <Radius>
                <ogc:Literal>1</ogc:Literal>
              </Radius>
              <Fill>
                <CssParameter name="fill">#FFFFFF</CssParameter>
              </Fill>
            </Halo>
            <VendorOption name="conflictResolution">true</VendorOption>
            <VendorOption name="goodnessOfFit">0</VendorOption>
          </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

请注意,多边形必须具有“ TYPE”属性,其值必须为“ inner”或“ outer”才能正常工作。


感谢您的回答-地理服务器的SLD是否与之相关?我看不到它与MapServer之间的相似之处。
djq 2012年

Mapserver也可以使用SLD。是一个示例,是SLD for Mapserver上的文档。SLD是OGC标准,但是,遗憾的是,它在Geoserver和Mapserver中的实现方式并不完全相同。但是,我希望上面的示例能够正常工作-甚至filter
katahdin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.