Rótulo de polígono repetido para cada bloco


10

Estou usando o GeoWebCache independente para servir blocos de um GeoServer remoto. Meu problema é que o rótulo de polígono é adicionado a cada um dos blocos exibidos, em vez de apenas uma vez no centróide do polígono.

Encontrei uma postagem que discute o problema:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

A primeira resposta mencionou uma possível solução:

"Em suma, sugiro usar um mecanismo de renderização de blocos (GeoWebCache, MapProxy, TileCache) de qualquer maneira, em vez de solicitar uma imagem pequena do GeoServer e fazer com que o mecanismo de renderização de blocos faça o fatiamento de blocos posteriormente. Você precisará enviar menos solicitações ao GeoServer ( 1 imagem grande em vez de várias imagens pequenas), o que acelera o tempo geral de criação do cache do bloco. "

O problema é que não consegui descobrir como fazer isso consultando a documentação do GeoWebCache, e o post acima mencionado não explica como implementá-lo.

Eu também encontrei um post com uma resposta que aponta para a documentação do GeoWebCache "Tiled" , mas meu código já usa todos os atributos necessários e ainda o rótulo aparece várias vezes:

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
    }
);

Alguém tem uma ideia?


Você pode nos mostrar o arquivo SLD que você está usando? Isso controla como os rótulos são exibidos em uma camada WMS.
Katahdin #

Respostas:


16

Abaixo está um exemplo de uma regra SLD que coloca um rótulo no centro da geometria de um recurso. Isso usa a função ogc: chamada "centróide" para colocar o rótulo. Você pode ler mais sobre as funções SLD nos documentos do GeoServer , e alguns exemplos são dados aqui .

<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>

Além disso, o SLD Cookbook é uma ótima referência. Uma coisa que pode te atrapalhar é a ordem das tags no SLD. Para a regra TextSymbolizer acima, você pode ver a ordem necessária, procurando na definição de esquema. Não se preocupe, não é muito assustador! Basta procurar por "symbolsymbolizer" nesse arquivo .xsd, e você deve encontrar facilmente a tag "sequence". Lá você encontrará que as referências do elemento correspondem à ordem no meu exemplo. (Nota: eu não usei o atributo "fill" do simbolizador de texto, meu preenchimento se aplica apenas ao halo.)


1

Computar etiquetas com resolução de colisão (mover etiquetas para fora do caminho ou remover etiquetas de menor prioridade para que não se sobreponham) requer conhecer todas as etiquetas que possam colidir com a etiqueta que você está desenhando, todas as etiquetas que possam colidir com elas etc. . Portanto, em geral, você precisa calcular todos os rótulos de uma só vez examinando todos os recursos ou dividir o mapa em blocos com rótulos computados em cada bloco.

Por padrão, o GeoWebCache usa um bloco de blocos 4x4 chamado "metátil". Quando você solicita um bloco que não está no cache, o GWC solicita todo o metil como uma imagem grande do back-end e, em seguida, divide o metil em blocos que ele armazena em cache. Você pode ajustar o fator metátil ao configurar uma camada. Metatiles maiores fornecem rótulos com melhor aparência, mas aumentam a latência de uma falta de cache. Se você não estiver usando a resolução de colisão de etiqueta no back-end, poderá definir a metatilação para 1x1.

Você também pode pedir ao GWC para adicionar uma sarjeta ao redor do metátil, que é um espaço extra que será cortado. É arriscado fazer isso se você tiver uma resolução de colisão de etiqueta, pois ela pode ser posicionada de maneira diferente ou mesmo removida totalmente do outro lado de um limite metátil. Se você possui etiquetas totalmente fixas na posição e nunca são suprimidas para evitar colisões, use uma calha larga para permitir que as etiquetas ultrapassem os limites dos ladrilhos. Isso terá um custo de desempenho, pois o GeoServer terá que renderizar um bloco maior.

Você pode definir metatiling e sarjeta na guia Camada lado a lado da configuração da camada, ou o padrão que será usado para novas camadas pode ser definido na página Padrões de armazenamento em cache.

Para desativar a resolução de conflitos, você pode usar a conflictResolutionopção de fornecedor em seus estilos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.