Come colorare i poligoni con un riempimento completamente trasparente usando MapServer?


11

È possibile riempire i poligoni in modo che siano completamente trasparenti in MapServer? Voglio avere uno sfondo nero leggermente opaco, e ovunque ci sia un poligono, voglio che sia completamente chiaro senza riempimento. Ho impostato il mio sfondo nel modo seguente:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Ho provato a creare una classe che è bianca per riempire il poligono e ho sperimentato l'opacità usando TRANSPARENCYvalori compresi tra 0 e 100 ma non risulta in un poligono chiaro:

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

Ciò si traduce nel seguente tipo di immagine:

inserisci qui la descrizione dell'immagine

Invece del poligono che ha un riempimento bianco; Voglio che abbia un riempimento senza colore. Ho trovato un suggerimento online per definire il colore in questo modo:

COLOR -1 -1 -1

ma non ha funzionato. In questa parte della documentazione, viene descritto quanto segue:

"PALETTE = / path / to / palette.txt" viene utilizzato per definire il percorso assoluto in cui è possibile trovare i colori della tavolozza. Questo file deve contenere 256 voci di triplette r, g, b per i modi di immagine RGB o quadruplet r, g, b, a per i modi di immagine RGBA. Il formato previsto è una tripletta (o quadruplet) per riga, ogni valore separato da virgole e ogni triplet / quadruplet su una singola riga. Se si desidera utilizzare la trasparenza con una tavolozza, è importante avere questi due colori nel file della tavolozza: 0,0,0,0 e 255,255,255,255.

Dopo aver letto questo, ho anche provato a usare COLOR 0 0 0 0ma questo genera un errore:

Identificatore sconosciuto. Errore di analisi vicino (0) :( riga 71)

Non capisco come mi riferisco a un colore definito PALETTE=/path/to/palette.txtma questo sembra un modo possibile per raggiungere questo obiettivo.


Un modo per evitare il mal di testa potrebbe essere la conversione di poligoni in linee.
nadya,

come potrei non riempire il poligono in quel modo?
djq

2
Voglio dire, per creare lo shapefile della linea che rappresenta i contorni dei poligoni usando qualsiasi software GIS, e aggiungere queste linee a Mapserver invece che ai poligoni. Le righe non possono essere riempite affatto.
nadya,

Non mi importa se le linee appaiono o no; Voglio solo un chiaro riempimento poligonale.
djq

1
Non è necessario convertire i poligoni in linee - è possibile definire 'TYPE line' per layer nel file MAP anche per geometria poligonale
user1702401

Risposte:


4

Mapserver ha recentemente introdotto il concetto di livelli maschera (una maschera si comporta come una maschera in Photoshop fondendosi con il livello a cui è applicata).

La RFC descrive cosa fanno e come possono essere utilizzati. Leggendo la tua risposta sembra che potresti usare un livello maschera per ottenere l'effetto "buco della serratura" che stai cercando.

Non sono sicuro che questa funzionalità sia diventata la 6.2 che è stata rilasciata un paio di settimane fa.


4

Quindi, vuoi "penetrare" lo sfondo nero con i tuoi poligoni trasparenti per vedere lo sfondo inferiore. Non sono sicuro che sia possibile con MapServer, ma posso suggerire un altro trucco.

Puoi creare un poligono molto grande che copre tutta la tua area e anche di più, utilizzando qualsiasi software GIS. Quindi puoi cancellare i tuoi poligoni da questo poligono di area, e quindi questo poligono forato puoi mettere su MapServer e renderlo nero, anziché lo sfondo nero. I fori corrispondenti ai tuoi poligoni saranno "trasparenti".


1

Avevo queste righe nel mio file .map e la trasparenza inferiore a 100 funzionava.

  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

Spero che sia d'aiuto.


Ciò ha comportato un poligono completamente trasparente? Ho provato a sperimentare valori compresi TRANSPARENCYtra 0 e 100 e sembrava regolare semplicemente l'opacità. Mi rendo conto che questo non era chiaramente chiaro nella mia domanda: l'ho rivisto.
djq

Quindi, vuoi avere solo il contorno del poligono e tutto trasparente all'interno, giusto? Probabilmente ho frainteso e suggerito la trasparenza generale.
nadya,

Ci scusiamo per la doppia confusione; basta cancellare il riempimento poligonale; le linee non contano.
djq

1
@djq TRASPARENZA è stato deprecato alla versione 5.0. L'OPACITÀ di livello è la proprietà corretta da usare.
DavidF,

1

Di seguito un'immagine di esempio che mostra un livello maschera trasparente. Se ingrandisci la maschera, il tuo utente non noterà i bordi esterni. Simile a quanto suggerito da @nadya, puoi:

  1. Crea un grande poligono rettangolare
  2. Crea poligoni per ciascuno dei "ritagli"
  3. Sottrai i poligoni più piccoli da quello più grande (lo strumento Differenza in QGIS funziona bene per questo)

maschera trasparente

A questo punto avrai una maschera finita. Tuttavia, se desideri aggiungere etichette agli spazi ritagliati, dovrai aggiungere (usando uno strumento Unione) i poligoni più piccoli alla maschera. Quindi, con un file SLD in Mapserver, puoi modellare la maschera come grigio trasparente e modellare i ritagli come completamente trasparenti e applicare le etichette lì. Ecco un file SLD di esempio (creato per 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>

Si noti che i poligoni dovrebbero avere la proprietà "TYPE" con valori "interno" o "esterno" per funzionare correttamente.


Grazie per la risposta: lo SLD per geoserver è assolutamente correlato? Non vedo la somiglianza tra esso e MapServer.
djq

Mapserver può usare anche SLD. Ecco un esempio ed ecco i documenti su SLD per Mapserver. SLD è uno standard OGC, ma purtroppo non è implementato esattamente allo stesso modo in Geoserver e Mapserver. Tuttavia, mi aspetto che l'esempio sopra funzioni, persino il filtro .
katahdin,
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.