タイルごとに繰り返されるポリゴンラベル


10

スタンドアロンのGeoWebCacheを使用して、リモートのGeoServerからタイルを提供しています。私の問題は、ポリゴンの重心に1回だけではなく、ポリゴンラベルがタイルのそれぞれに追加されることです。

この問題を説明する投稿を見つけました:http :
//osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

最初の返答は可能な解決策に言及しました:

「全体として、私はとにかく、GeoServerから小さな画像を要求する代わりに、タイルレンダリングエンジン(GeoWebCache、MapProxy、TileCache)を使用して、タイルレンダリングエンジンにタイルスライスを実行させることをお勧めします。GeoServer(複数の小さい画像の代わりに1つの大きい画像)、これにより、全体的なタイルキャッシュの作成時間が短縮されます。」

問題は、GeoWebCacheのドキュメントを参照してもその方法を見つけることができず、上記の投稿ではそれを実装する方法が説明されていないことです。

また、GeoWebCacheの「Tiled」ドキュメントにリンクする回答を含む投稿を見つけましたが、私のコードはすでに必要なすべての属性を使用していますが、ラベルは何度も表示されます。

var Layer_1874 = new OpenLayers.Layer.WMS(
    'Grundkort',
    '/wms10.ashx'
    , {
        format: 'image/png',
        srs: 'EPSG:25832',
        layers: 'ballerupkommune_grundkort_bk',
        tiled: true,
        tilesOrigin: '698804,6173460'
    }
    , {
        displayInLayerSwitcher: true,
        isBaseLayer: true,
        transitionEffect: 'resize',
        displayOutsideMaxExtent: true,
        visibility: false
    }
);

誰かがアイデアを持っていますか?


使用しているSLDファイルを見せていただけますか?これは、WMSレイヤーでのラベルの表示方法を制御します。
katahdin 2012年

回答:


16

以下は、フィーチャのジオメトリの中心にラベルを配置するSLDルールの例です。これは、「centroid」と呼ばれるogc:Functionを使用してラベルを配置します。SLD関数の詳細については、GeoServerのドキュメントをご覧ください。いくつかの例がここに示されています

<sld:Rule>
      <MaxScaleDenominator>5000</MaxScaleDenominator>
      <sld:TextSymbolizer>
        <sld:Geometry>
          <ogc:Function name="centroid">
            <ogc:PropertyName>the_geom</ogc:PropertyName>
          </ogc:Function>
        </sld:Geometry>
        <sld:Label>
          <ogc:PropertyName>LOT_NAME</ogc:PropertyName>
        </sld:Label>
        <sld:Font>
          <sld:CssParameter name="font-family">Arial</sld:CssParameter>
          <sld:CssParameter name="font-size">11</sld:CssParameter>
          <sld:CssParameter name="font-style">normal</sld:CssParameter>
          <sld:CssParameter name="font-weight">bold</sld:CssParameter>
        </sld:Font>
        <sld:LabelPlacement>
          <sld:PointPlacement>
            <sld:AnchorPoint>
              <sld:AnchorPointX>
                <ogc:Literal>0.0</ogc:Literal>
              </sld:AnchorPointX>
              <sld:AnchorPointY>
                <ogc:Literal>0.5</ogc:Literal>
              </sld:AnchorPointY>
            </sld:AnchorPoint>
            <sld:Rotation>
              <ogc:Literal>0</ogc:Literal>
            </sld:Rotation>
          </sld:PointPlacement>
        </sld:LabelPlacement>
        <sld:Halo>
          <sld:Radius>
            <ogc:Literal>1.0</ogc:Literal>
          </sld:Radius>
          <sld:Fill>
            <sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
          </sld:Fill>
        </sld:Halo>
        <sld:VendorOption name="conflictResolution">true</sld:VendorOption>
        <sld:VendorOption name="goodnessOfFit">0</sld:VendorOption>
        <sld:VendorOption name="autoWrap">60</sld:VendorOption>
      </sld:TextSymbolizer>
    </sld:Rule>

また、SLDクックブックは優れたリファレンスです。あなたをつまずかせることができる1つのことは、SLDでのタグの順序です。上記のTextSymbolizerルールの場合、スキーマ定義を調べることで必要な順序を確認できます。心配しないでください、それはあまり怖くないです!その.xsdファイルで「textsymbolizer」を検索するだけで、「sequence」タグを簡単に見つけることができます。ここで、要素の参照が私の例の順序と一致していることがわかります。(注:テキストシンボライザーの「塗りつぶし」属性は使用しませんでした。私の塗りつぶしはハロにのみ適用されます。)


1

衝突解決を使用してラベルを計算する(ラベルを邪魔にならないように移動するか、優先度の低いラベルを削除して重複しないようにする)には、描画中のラベルと衝突する可能性のあるすべてのラベル、衝突する可能性のあるすべてのラベルなどについて知る必要があります。 。したがって、一般に、すべてのフィーチャを調べてすべてのラベルを一度に計算するか、各ブロック内で計算されたラベルを使用してマップをブロックに分割する必要があります。

デフォルトでは、GeoWebCacheは「メタタイル」と呼ばれる4x4のタイルブロックを使用します。キャッシュにないタイルをリクエストすると、GWCはメタタイル全体をバックエンドからの1つの大きな画像としてリクエストし、メタタイルをキャッシュするタイルにスライスします。レイヤーを設定するときに、メタタイル係数を調整できます。メタタイルが大きいほど、ラベルの見栄えがよくなりますが、キャッシュミスの待ち時間が長くなります。バックエンドでラベル衝突解決を使用していない場合は、メタタイルを1x1に設定できます。

GWCに、メタタイルの周囲に溝を追加するように指示することもできます。これは、カットされる余分なスペースです。ラベルが別の場所に配置されたり、メタタイル境界の反対側で完全に削除されたりする可能性があるため、ラベル衝突解決をオンにしている場合、これを行うのは危険です。完全に固定されたラベルがあり、衝突を回避するために抑制されない場合は、幅の広いガターを使用して、ラベルがタイルの境界を越えることができます。GeoServerはより大きなタイルをレンダリングする必要があるため、これにはパフォーマンスコストがかかります。

レイヤー構成の[タイルレイヤー]タブでメタタイリングとガターを設定できます。または、新しいレイヤーに使用されるデフォルトを[キャッシュのデフォルト]ページで設定できます。

競合の解決を無効にするにconflictResolutionは、スタイルでベンダーオプションを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.