MapServerを使用して完全に透明な塗りつぶしでポリゴンに色を付ける方法は?


11

MapServerで完全に透明になるようにポリゴンを塗りつぶすことは可能ですか?わずかに不透明な黒い背景が必要です。ポリゴンがある場合は、塗りつぶさずに完全にクリアにする必要があります。背景を次のように設定します。

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

私はポリゴンを塗りつぶすために白のクラスを作成しようとしました。0〜100のTRANSPARENCY値を使用して不透明度を実験しましたが、結果として透明なポリゴンにはなりません。

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イメージモードの場合はr、g、bトリプレットの256エントリ、またはRGBAイメージモードの場合はr、g、b、a 4連符のエントリが含まれている必要があります。予想される形式は、行ごとに1つのトリプレット(または4連符)、各値はコンマで区切られ、各トリプレット/ 4連符は1行になります。パレットで透明度を使用する場合は、パレットファイルに0、0、0、0および255、255、255、255の2つの色を含めることが重要です。

これを読んだ後、私も使用しようとしましたCOLOR 0 0 0 0が、これはエラーをスローします:

不明な識別子。(0):(行71)付近の解析エラー

定義色の参照方法がわかりませんPALETTE=/path/to/palette.txtが、これを実現する方法の1つと思われます。


頭痛を避ける1つの方法は、ポリゴンを線に変換することです。
ナディア

どうすればポリゴンを塗りつぶせないのでしょうか?
djq

2
つまり、GISソフトウェアを使用してポリゴンアウトラインを表すラインシェープファイルを作成し、これらのラインをポリゴンではなくMapserverに追加します。行に塗りつぶしを含めることはできません。
ナディア

行が表示されるかどうかは気にしません。明確な多角形の塗りつぶしが必要です。
djq

1
ラインにポリゴンに変換する必要はありません-あなたはまた、ポリゴンジオメトリのMAPファイルにレイヤーの「TYPEライン」を定義することができます
user1702401

回答:


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

それで、ポリゴンの輪郭とすべてを透明にしたいですか?私はおそらく誤解し、一般的な透明性を示唆しました。
ナディア

二重の混乱でごめんなさい。ポリゴンの塗りつぶしをクリアするだけです。行は関係ありません。
djq

1
@djq TRANSPARENCYは、バージョン5.0で廃止されました。レイヤーの不透明度は、使用する正しいプロパティです。
DavidF

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」プロパティが必要になることに注意してください。


ご回答いただきありがとうございます-ジオサーバーのSLDはまったく関連していますか?私はそれとMapServerの類似性を見ていません。
djq

MapserverもSLDを使用できます。ここに例があり、MapserverのSLDに関するドキュメントがあります。SLDはOGC標準ですが、残念ながら、GeoserverとMapserverでまったく同じ方法で実装されているわけではありません。ただし、上記の例が機能することを期待しています - フィルターもです。
カタディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.