Comment colorer des polygones avec un remplissage complètement transparent en utilisant MapServer?

11

Est-il possible de remplir des polygones pour qu'ils soient complètement transparents dans MapServer? Je veux avoir un fond noir légèrement opaque, et partout où il y a un polygone, je veux qu'il soit complètement clair sans remplissage. J'ai défini mon parcours de la manière suivante:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

J'ai essayé de créer une classe qui est blanche pour remplir le polygone et j'ai expérimenté l'opacité en utilisant TRANSPARENCYdes valeurs de 0 à 100 mais cela ne donne pas un polygone clair:

CLASS
      NAME "light"  
      EXPRESSION ([max_cost] == 2000)     
      STYLE       
        OUTLINECOLOR 255 255 255
        COLOR 255 255 255
        SIZE       1
        WIDTH      2.0        
      END
END 

Il en résulte le type d'image suivant:

entrez la description de l'image ici

Au lieu du polygone ayant un remplissage blanc; Je veux qu'il ait un remplissage sans couleur. J'ai trouvé une suggestion en ligne pour définir la couleur comme ceci:

COLOR -1 -1 -1

mais cela n'a pas fonctionné non plus. Dans cette partie de la documentation, les éléments suivants sont décrits:

«PALETTE = / path / to / palette.txt» est utilisé pour définir le chemin absolu où les couleurs de la palette peuvent être trouvées. Ce fichier doit contenir 256 entrées de triplets r, g, b pour les modes d'imagerie RVB ou r, g, b, un quadruplet pour les modes d'imagerie RGBA. Le format attendu est un triplet (ou quadruplet) par ligne, chaque valeur séparée par des virgules, et chaque triplet / quadruplet sur une seule ligne. Si vous souhaitez utiliser la transparence avec une palette, il est important d'avoir ces deux couleurs dans le fichier de palette: 0,0,0,0 et 255,255,255,255.

Après avoir lu ceci, j'ai également essayé d'utiliser COLOR 0 0 0 0mais cela génère une erreur:

Identifiant inconnu. Erreur d'analyse près de (0) :( ligne 71)

Je ne comprends pas comment je fais référence à une couleur définie, PALETTE=/path/to/palette.txtmais cela semble être un moyen possible d'y parvenir.

djq
la source
Une façon d'éviter les maux de tête pourrait être de convertir des polygones en lignes.
nadya
Comment pourrais-je ne pas remplir le polygone de cette façon?
djq
2
Je veux dire, pour créer le fichier de formes de lignes représentant les contours de polygones à l'aide de n'importe quel logiciel SIG, et ajouter ces lignes à Mapserver au lieu des polygones. Les lignes ne peuvent pas du tout être remplies.
nadya
Cela ne me dérange pas si les lignes apparaissent ou non; Je veux juste un remplissage polygonal clair.
djq
1
Il n'est pas nécessaire de convertir les polygones en lignes - vous pouvez définir "TYPE ligne" pour la couche dans le fichier MAP également pour la géométrie des polygones
user1702401

Réponses:

4

Mapserver a récemment introduit le concept de calques de masque (un masque se comporte comme un masque dans Photoshop en se mélangeant avec le calque auquel il est appliqué).

Le RFC décrit ce qu'ils font et comment ils peuvent être utilisés. En lisant votre réponse, il semble que vous pourriez utiliser un calque de masque pour obtenir l'effet de «trou de serrure» que vous recherchez.

Je ne sais pas si cette fonctionnalité est entrée dans la version 6.2 qui a été publiée il y a quelques semaines.

unicoletti
la source
4

Donc, vous voulez "pénétrer" le fond noir par vos polygones transparents pour voir le fond inférieur. Je ne suis pas sûr que ce soit possible avec MapServer, mais je peux suggérer une autre astuce.

Vous pouvez créer un très grand polygone couvrant toute votre zone et encore plus étendu, en utilisant n'importe quel logiciel SIG. Ensuite, vous pouvez effacer vos polygones de ce polygone de zone, puis ce polygone troué que vous pouvez placer sur MapServer et le rendre noir, au lieu du fond noir. Les trous correspondant à vos polygones vont être "transparents".

Nadya
la source
1

J'avais ces lignes dans mon fichier .map et la transparence inférieure à 100 fonctionnait.

  LAYER 
    NAME         core_areas
    DATA         core_areas.shp
    STATUS       ON
    TYPE         POLYGON
    TRANSPARENCY 100
    SIZEUNITS pixels
    PROJECTION
       "init=epsg:32629"
    END # projection
    CLASS
      STYLE
        COLOR        20 150 90
        OUTLINECOLOR 7 56 41
        WIDTH        1
      END # STYLE
    NAME "Core areas"
    END # CLASS
  END # Layer

J'espère que ça aide.

Nadya
la source
Cela a-t-il abouti à un polygone complètement transparent? J'ai essayé d'expérimenter avec des valeurs de TRANSPARENCY0 à 100 et cela semblait juste ajuster l'opacité. Je me rends compte que ce n'était pas clair dans ma question au départ - je l'ai révisé.
djq
Donc, vous voulez avoir juste le contour du polygone et tout transparent à l'intérieur, non? J'ai probablement mal compris et suggéré la transparence générale.
nadya
Désolé pour la double confusion; juste effacer le remplissage du polygone; les lignes n'ont pas d'importance.
djq
1
@djq TRANSPARENCY a été déprécié à la version 5.0. Layer OPACITY est la propriété correcte à utiliser.
DavidF
1

Ci-dessous, un exemple d'image montrant un calque de masque transparent. Si vous agrandissez le masque, votre utilisateur ne remarquera pas les bords extérieurs. Semblable à ce que @nadya a suggéré, vous pouvez:

  1. Créer un grand polygone rectangulaire
  2. Créez des polygones pour chacune des "découpes"
  3. Soustrayez les petits polygones du plus grand (l'outil Différence dans QGIS fonctionne bien pour cela)

masque transparent

À ce stade, vous aurez un masque fini. Cependant, si vous souhaitez ajouter des étiquettes aux espaces de découpe, vous devrez ajouter (à l'aide d'un outil Union) les plus petits polygones au masque. Ensuite, avec un fichier SLD dans Mapserver, vous pouvez styliser le masque en gris transparent, styliser les découpes comme complètement transparent et y appliquer les étiquettes. Voici un exemple de fichier SLD (il a été créé pour Geoserver):

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <NamedLayer>
    <Name>yards</Name>
    <UserStyle>
      <Name>yards</Name>
      <Title>Polygon Style</Title>
      <FeatureTypeStyle>
        <Name>name</Name>
        
        <Rule>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>TYPE</ogc:PropertyName>
              <ogc:Literal>outer</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#555555</CssParameter>
              <CssParameter name="fill-opacity">0.5</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke-width">0</CssParameter>
            </Stroke>
          </PolygonSymbolizer>  
        </Rule>
        
        <Rule>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>TYPE</ogc:PropertyName>
              <ogc:Literal>inner</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#555555</CssParameter>
              <CssParameter name="fill-opacity">0</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-opacity">0</CssParameter>
              <CssParameter name="stroke-width">0</CssParameter>
            </Stroke>
          </PolygonSymbolizer>  
        </Rule>
        
        <Rule>
          <MinScaleDenominator>10000</MinScaleDenominator>
          <TextSymbolizer>
            <Geometry>
              <ogc:Function name="centroid">
                <ogc:PropertyName>the_geom</ogc:PropertyName>
              </ogc:Function>
            </Geometry>
            <Label>
              <ogc:PropertyName>SITE</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Arial</CssParameter>
              <CssParameter name="font-size">11</CssParameter>
              <CssParameter name="font-style">normal</CssParameter>
              <CssParameter name="font-weight">bold</CssParameter>
            </Font>
            <LabelPlacement>
              <PointPlacement>
                <AnchorPoint>
                  <AnchorPointX>
                    <ogc:Literal>0.0</ogc:Literal>
                  </AnchorPointX>
                  <AnchorPointY>
                    <ogc:Literal>0.5</ogc:Literal>
                  </AnchorPointY>
                </AnchorPoint>
                <Rotation>
                  <ogc:Literal>0</ogc:Literal>
                </Rotation>
              </PointPlacement>
            </LabelPlacement>
            <Halo>
              <Radius>
                <ogc:Literal>1</ogc:Literal>
              </Radius>
              <Fill>
                <CssParameter name="fill">#FFFFFF</CssParameter>
              </Fill>
            </Halo>
            <VendorOption name="conflictResolution">true</VendorOption>
            <VendorOption name="goodnessOfFit">0</VendorOption>
          </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

Notez que les polygones devraient avoir la propriété "TYPE" avec les valeurs "intérieure" ou "extérieure" pour que cela fonctionne correctement.

katahdin
la source
Merci pour votre réponse - le SLD pour geoserver est-il lié? Je ne vois pas la similitude entre elle et MapServer.
djq
Mapserver peut également utiliser SLD. Voici un exemple, et voici les documents sur SLD pour Mapserver. SLD est un standard OGC, mais, hélas, il n'est pas implémenté exactement de la même manière dans Geoserver et Mapserver. Cependant, je m'attends à ce que l'exemple ci-dessus fonctionne - même le filtre .
katahdin