Etichetta poligonale ripetuta per ogni piastrella


10

Sto usando il GeoWebCache autonomo per servire i riquadri da un GeoServer remoto. Il mio problema è che l'etichetta poligonale viene aggiunta a ciascuna delle tessere servite, anziché una sola volta nel centroide del poligono.

Ho trovato un post che discute il problema:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

La prima risposta menzionava una possibile soluzione:

"Tutto sommato, suggerisco di utilizzare comunque un motore di rendering dei riquadri (GeoWebCache, MapProxy, TileCache), invece di richiedere una piccola immagine da GeoServer e fare in modo che il motore di rendering dei riquadri esegua il taglio delle tessere in seguito. Avrai meno richieste a GeoServer ( 1 immagine grande anziché più immagini piccole), in questo modo si accelera il tempo complessivo di creazione della cache del riquadro ".

Il problema è che non sono riuscito a trovare come farlo facendo riferimento alla documentazione di GeoWebCache e il post sopra menzionato non spiega il modo di implementarlo.

Ho anche trovato un post con una risposta che si collega alla documentazione "affiancata" di GeoWebCache , ma il mio codice utilizza già tutti gli attributi necessari e l'etichetta viene visualizzata più volte:

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

Qualcuno ha un'idea?


Puoi mostrarci il file SLD che stai utilizzando? Ciò controlla la modalità di visualizzazione delle etichette su un livello WMS.
katahdin,

Risposte:


16

Di seguito è riportato un esempio di una regola SLD che posiziona un'etichetta al centro della geometria di una feature. Questo utilizza ogc: Funzione chiamata "centroide" per posizionare l'etichetta. Puoi leggere ulteriori informazioni sulle funzioni SLD nei documenti GeoServer e alcuni esempi sono riportati qui .

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

Inoltre, il libro di cucina SLD è un ottimo riferimento. Una cosa che può farti inciampare è l'ordinamento dei tag nel SLD. Per la regola di TextSymbolizer sopra puoi vedere l'ordine richiesto guardando nella definizione dello schema. Non ti preoccupare, non è troppo spaventoso! Basta cercare "textymbolizer" in quel file .xsd, e dovresti trovare facilmente il tag "sequenza". Lì troverai che i riferimenti agli elementi corrispondono all'ordine nel mio esempio. (Nota: non ho usato l'attributo "riempimento" del simbolizzatore di testo, il mio riempimento si applica solo all'alone.)


1

Il calcolo delle etichette con la risoluzione delle collisioni (allontanando le etichette o rimuovendo quelle con priorità inferiore in modo che non si sovrappongano) richiede la conoscenza di ogni etichetta che potrebbe scontrarsi con l'etichetta che si sta disegnando, ogni etichetta che potrebbe scontrarsi con esse e così via . Quindi, in generale, è necessario calcolare tutte le etichette in una sola volta osservando tutte le funzionalità oppure suddividere la mappa in blocchi con etichette calcolate all'interno di ciascun blocco.

Per impostazione predefinita, GeoWebCache utilizza un blocco di riquadri 4x4 chiamato "metatile". Quando richiedi un riquadro che non si trova nella cache, GWC richiederà l'intero metatile come una grande immagine dal backend e quindi suddividerà il metatile in riquadri che memorizza nella cache. È possibile regolare il fattore metatile durante l'impostazione di un livello. I metatili più grandi offrono etichette più belle, ma aumentano la latenza di un errore nella cache. Se non si utilizza la risoluzione della collisione delle etichette sul back-end, è possibile impostare il metatiling su 1x1.

Puoi anche dire a GWC di aggiungere una grondaia attorno alla metatile, che è spazio extra che verrà tagliato. È rischioso farlo se si dispone di una risoluzione della collisione dell'etichetta poiché un'etichetta può essere posizionata in modo diverso o addirittura rimossa interamente dall'altro lato di un confine metatile. Se si dispone di etichette totalmente fisse in posizione e non vengono mai represse per evitare collisioni, è possibile utilizzare una grondaia ampia per consentire alle etichette di oltrepassare i confini delle piastrelle. Ciò avrà un costo in termini di prestazioni poiché GeoServer dovrà eseguire il rendering di un riquadro più grande.

È possibile impostare metatiling e grondaia nella scheda Layer tile della configurazione layer, oppure è possibile impostare il valore predefinito che verrà utilizzato per i nuovi layer nella pagina Default cache.

Per disabilitare la risoluzione dei conflitti, puoi utilizzare l' conflictResolutionopzione fornitore nei tuoi stili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.