Étiquette de polygone répétée pour chaque tuile


10

J'utilise le GeoWebCache autonome pour servir des tuiles à partir d'un GeoServer distant. Mon problème est que l'étiquette de polygone est ajoutée à chacune des tuiles servies, au lieu d'une seule fois dans le centre de gravité du polygone.

J'ai trouvé un article qui traite du problème:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

La première réponse mentionnait une solution possible:

"Dans l'ensemble, je suggère d'utiliser un moteur de rendu de tuiles (GeoWebCache, MapProxy, TileCache) de toute façon, au lieu de demander une petite image à GeoServer et de demander au moteur de rendu de tuiles de découper les tuiles par la suite. Vous aurez envoyé moins de demandes à GeoServer ( 1 grande image au lieu de plusieurs petites images), ce qui accélère le temps global de création du cache de tuiles. "

Le problème est que je n'ai pas pu trouver comment le faire en me référant à la documentation GeoWebCache, et l'article mentionné ci-dessus n'explique pas la façon de l'implémenter.

J'ai également trouvé un message avec une réponse qui renvoie à la documentation "Mosaïque" de GeoWebCache , mais mon code utilise déjà tous les attributs nécessaires et le libellé apparaît toujours plusieurs fois:

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

Quelqu'un a une idée?


Pouvez-vous nous montrer le fichier SLD que vous utilisez? Cela contrôle la façon dont les étiquettes sont affichées sur une couche WMS.
katahdin

Réponses:


16

Ci-dessous, un exemple de règle SLD qui place une étiquette au centre de la géométrie d'une entité. Cela utilise la fonction ogc: appelée "centroïde" pour placer l'étiquette. Vous pouvez en savoir plus sur les fonctions SLD dans les documents GeoServer , et quelques exemples sont donnés ici .

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

De plus, le livre de recettes SLD est une excellente référence. Une chose qui peut vous tromper est la commande de balises dans le SLD. Pour la règle TextSymbolizer ci-dessus, vous pouvez voir l'ordre requis en consultant la définition du schéma. Ne vous inquiétez pas, ce n'est pas trop effrayant! Il vous suffit de rechercher "textymbolizer" dans ce fichier .xsd, et vous devriez facilement trouver la balise "sequence". Vous y trouverez que les références d'élément correspondent à la commande dans mon exemple. (Remarque: je n'ai pas utilisé l'attribut "fill" du symboliseur de texte, mon remplissage s'applique uniquement au halo.)


1

Pour calculer les étiquettes avec une résolution de collision (déplacer les étiquettes à l'écart ou supprimer celles de priorité inférieure afin qu'elles ne se chevauchent pas), il faut connaître chaque étiquette qui pourrait entrer en collision avec l'étiquette que vous dessinez, chaque étiquette qui pourrait entrer en collision avec elles, etc. . Donc, en général, vous devez soit calculer toutes les étiquettes à la fois en regardant chaque entité, soit diviser la carte en blocs avec des étiquettes calculées dans chaque bloc.

Par défaut, GeoWebCache utilise un bloc de tuiles 4x4 appelé "métatile". Lorsque vous demandez une tuile qui n'est pas dans le cache, GWC demandera l'intégralité de la métatile comme une grande image à partir du backend, puis découpera la métatile en tuiles qu'elle met en cache. Vous pouvez ajuster le facteur métatile lors de la configuration d'un calque. Des métatiles plus grands donnent des étiquettes plus belles, mais augmentent la latence d'un échec de cache. Si vous n'utilisez pas la résolution de collision d'étiquettes sur le back-end, vous pouvez définir le métatilage sur 1x1.

Vous pouvez également dire à GWC d'ajouter une gouttière autour du métatile, qui est un espace supplémentaire qui sera coupé. Il est risqué de le faire si vous avez une résolution de collision d'étiquettes car une étiquette peut être positionnée différemment ou même être supprimée entièrement de l'autre côté d'une frontière métatile. Si vous avez des étiquettes qui sont totalement fixes et qui ne sont jamais supprimées pour éviter la collision, vous pouvez utiliser une large gouttière pour permettre aux étiquettes de traverser les limites des carreaux. Cela aura un coût de performance car GeoServer devra rendre une tuile plus grande.

Vous pouvez définir la métatilation et la gouttière dans l'onglet Couche de tuiles de la configuration de couche, ou la valeur par défaut qui sera utilisée pour les nouvelles couches peut être définie sur la page Caching Defaults.

Pour désactiver la résolution des conflits, vous pouvez utiliser l' conflictResolutionoption fournisseur dans vos styles.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.