Etiqueta de polígono repetida para cada mosaico

10

Estoy usando el GeoWebCache independiente para servir mosaicos desde un GeoServer remoto. Mi problema es que la etiqueta del polígono se agrega a cada uno de los mosaicos servidos, en lugar de solo una vez en el centroide del polígono.

Encontré una publicación que analiza el problema:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

La primera respuesta mencionó una posible solución:

"En general, sugiero usar un motor de representación de mosaicos (GeoWebCache, MapProxy, TileCache) de todos modos, en lugar de solicitar una imagen pequeña de GeoServer y hacer que el motor de representación de mosaicos realice el corte de mosaicos después. Deberá enviar menos solicitudes a GeoServer ( 1 imagen grande en lugar de varias imágenes pequeñas), por lo que esto acelera el tiempo total de creación de caché de mosaicos ".

El problema es que no pude encontrar cómo hacerlo haciendo referencia a la documentación de GeoWebCache, y la publicación mencionada anteriormente no explica la forma de implementar eso.

También encontré una publicación con una respuesta que enlaza con la documentación "en mosaico" de GeoWebCache , pero mi código ya utiliza todos los atributos necesarios y la etiqueta aparece varias veces:

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

Alguien tiene una idea?

Ambran
fuente
¿Puede mostrarnos el archivo SLD que está utilizando? Eso controla cómo se muestran las etiquetas en una capa WMS.
katahdin

Respuestas:

16

A continuación se muestra un ejemplo de una regla SLD que coloca una etiqueta en el centro de la geometría de una entidad. Esto utiliza la función ogc: llamada "centroide" para colocar la etiqueta. Puede leer más sobre las funciones SLD en los documentos de GeoServer , y aquí se dan algunos ejemplos .

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

Además, el libro de cocina SLD es una gran referencia. Una cosa que puede hacerte tropezar es ordenar las etiquetas en el SLD. Para la regla TextSymbolizer anterior, puede ver el orden requerido al buscar en la definición del esquema. ¡No te preocupes, no da demasiado miedo! Simplemente busque "textymbolizer" en ese archivo .xsd, y debería encontrar fácilmente la etiqueta "secuencia". Allí encontrará que las referencias de elementos coinciden con el orden en mi ejemplo. (Nota: no utilicé el atributo "relleno" del simbolizador de texto, mi relleno solo se aplica al halo).

katahdin
fuente
1

Calcular etiquetas con resolución de colisión (quitar etiquetas o quitar las de menor prioridad para que no se superpongan) requiere conocer cada etiqueta que podría chocar con la etiqueta que está dibujando, cada etiqueta que podría chocar con ellas, etc. . Por lo tanto, en general, debe calcular todas las etiquetas a la vez observando cada característica o dividir el mapa en bloques con etiquetas calculadas dentro de cada bloque.

De forma predeterminada, GeoWebCache utiliza un bloque de 4x4 de mosaicos llamado "metatile". Cuando solicita un mosaico que no está en la memoria caché, GWC solicitará el metatile completo como una imagen grande del backend y luego lo dividirá en mosaicos que almacena en caché. Puede ajustar el factor de metatile al configurar una capa. Los metatiles más grandes dan etiquetas de mejor aspecto, pero aumentan la latencia de un error de caché. Si no está utilizando la resolución de colisión de etiquetas en el back-end, puede establecer la metatilización en 1x1.

También puede decirle a GWC que agregue una canaleta alrededor del metatile, que es un espacio adicional que se cortará. Es arriesgado hacer esto si tiene una resolución de colisión de etiquetas activada, ya que una etiqueta puede colocarse de manera diferente o incluso eliminarse por completo al otro lado de un límite de metatile. Sin embargo, si tiene etiquetas que están totalmente fijadas en su posición y nunca se suprimen para evitar colisiones, puede usar una canaleta ancha para permitir que las etiquetas crucen los límites de los mosaicos. Esto tendrá un costo de rendimiento ya que GeoServer tendrá que representar un mosaico más grande.

Puede establecer la metatilización y la canaleta en la pestaña Capa de mosaico de la configuración de la capa, o el valor predeterminado que se utilizará para las nuevas capas se puede establecer en la página Valores predeterminados de almacenamiento en caché.

Para deshabilitar la resolución de conflictos, puede usar la conflictResolutionopción de proveedor en sus estilos.

smithkm
fuente