Wie färbe ich Polygone mit MapServer mit einer vollständig transparenten Füllung?

11

Ist es möglich, Polygone so zu füllen, dass sie in MapServer vollständig transparent sind? Ich möchte einen schwarzen Hintergrund haben, der leicht undurchsichtig ist, und wo immer es ein Polygon gibt, möchte ich, dass dieser ohne Füllung völlig klar ist. Ich stelle meinen Hintergrund folgendermaßen ein:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Ich habe versucht, eine Klasse zu erstellen, die weiß ist, um das Polygon zu füllen, und mit Deckkraft unter Verwendung TRANSPARENCYvon Werten von 0 bis 100 experimentiert, aber es ergibt sich kein klares Polygon:

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

Dies führt zu folgendem Bildtyp:

Geben Sie hier die Bildbeschreibung ein

Anstelle des Polygons mit einer weißen Füllung; Ich möchte, dass es eine Füllung ohne Farbe hat. Ich habe online einen Vorschlag gefunden, um die Farbe folgendermaßen zu definieren:

COLOR -1 -1 -1

aber es hat auch nicht funktioniert. In diesem Teil der Dokumentation wird Folgendes beschrieben:

"PALETTE = / path / to / palette.txt" wird verwendet, um den absoluten Pfad zu definieren, in dem Palettenfarben gefunden werden können. Diese Datei muss 256 Einträge von r-, g-, b-Tripletts für RGB-Bildmodi oder r, g, b, vierfache für RGBA-Bildmodi enthalten. Das erwartete Format ist ein Triplett (oder Quadruplett) pro Zeile, wobei jeder Wert durch Kommas getrennt ist und jedes Triplett / Quadruplett in einer einzelnen Zeile. Wenn Sie Transparenz mit einer Palette verwenden möchten, ist es wichtig, diese beiden Farben in der Palettendatei zu haben: 0,0,0,0 und 255,255,255,255.

Nachdem ich dies gelesen habe, habe ich auch versucht, es zu verwenden, COLOR 0 0 0 0aber dies wirft einen Fehler aus:

Unbekannte Kennung. Analysefehler in der Nähe von (0) :( Zeile 71)

Ich verstehe nicht, wie ich mich auf eine definierte Farbe beziehe, PALETTE=/path/to/palette.txtaber dies scheint eine Möglichkeit zu sein, dies zu erreichen.

djq
quelle
Eine Möglichkeit, Kopfschmerzen zu vermeiden, könnte darin bestehen, Polygone in Linien umzuwandeln.
Nadya
Wie könnte ich das Polygon auf diese Weise nicht ausfüllen?
DJQ
2
Ich meine, das Linien-Shapefile, das die Polygon-Konturen darstellt, mit einer beliebigen GIS-Software zu erstellen und diese Linien anstelle der Polygone zu Mapserver hinzuzufügen. Zeilen können überhaupt nicht gefüllt sein.
Nadya
Es macht mir nichts aus, ob die Linien erscheinen oder nicht; Ich möchte nur eine klare Polygonfüllung.
DJQ
1
Es ist nicht erforderlich, Polygone in Linien zu konvertieren. Sie können 'TYPE line' für die Ebene in der MAP-Datei auch für die Polygongeometrie definieren
user1702401

Antworten:

4

Mapserver hat kürzlich das Konzept der Maskenebenen eingeführt (eine Maske verhält sich in Photoshop wie eine Maske, indem sie mit der Ebene gemischt wird, auf die sie angewendet wird).

Der RFC beschreibt, was sie tun und wie sie verwendet werden können. Wenn Sie Ihre Antwort lesen, können Sie anscheinend eine Maskenebene verwenden, um den gewünschten Schlüssellocheffekt zu erzielen.

Ich bin mir nicht sicher, ob diese Funktion es in die 6.2 geschafft hat, die vor ein paar Wochen veröffentlicht wurde.

Unicoletti
quelle
4

Sie möchten also den schwarzen Hintergrund mit Ihren transparenten Polygonen "durchdringen", um den unteren Hintergrund zu sehen. Ich bin nicht sicher, ob es mit MapServer möglich ist, aber ich kann einen anderen Trick vorschlagen.

Mit jeder GIS-Software können Sie ein sehr großes Polygon erstellen, das Ihren gesamten Bereich abdeckt und noch erweitert wird. Dann können Sie Ihre Polygone aus diesem Bereichspolygon löschen und dann dieses durchlöcherte Polygon auf MapServer setzen und es anstelle des schwarzen Hintergrunds schwarz machen. Die Löcher, die Ihren Polygonen entsprechen, werden "transparent" sein.

Nadya
quelle
1

Ich hatte diese Zeilen in meiner .map-Datei und die Transparenz unter 100 funktionierte.

  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

Ich hoffe es hilft.

Nadya
quelle
Hat dies zu einem vollständig transparenten Polygon geführt? Ich habe versucht, mit Werten TRANSPARENCYvon 0 bis 100 zu experimentieren, und es schien nur die Deckkraft anzupassen. Mir ist klar, dass dies in meiner Frage zunächst nicht klar war - ich habe es überarbeitet.
DJQ
Sie möchten also nur den Umriss des Polygons und alles, was innen transparent ist, richtig? Ich habe es wahrscheinlich missverstanden und allgemeine Transparenz vorgeschlagen.
Nadya
Entschuldigung für die doppelte Verwirrung; nur klare Polygonfüllung; Linien spielen keine Rolle.
DJQ
1
@djq TRANSPARENCY wurde in Version 5.0 beraubt. Layer OPACITY ist die richtige Eigenschaft.
DavidF
1

Unten sehen Sie ein Beispielbild, das eine transparente Maskenebene zeigt. Wenn Sie die Maske viel größer machen, werden die Außenkanten Ihres Benutzers nicht bemerkt. Ähnlich wie bei @nadya vorgeschlagen, können Sie:

  1. Erstellen Sie ein großes rechteckiges Polygon
  2. Erstellen Sie Polygone für jeden der "Ausschnitte"
  3. Subtrahieren Sie die kleineren Polygone vom größeren (das Differenz-Tool in QGIS funktioniert hierfür gut).

transparente Maske

Zu diesem Zeitpunkt haben Sie eine fertige Maske. Wenn Sie jedoch den Ausschnitten Beschriftungen hinzufügen möchten, müssen Sie die kleineren Polygone (mit einem Vereinigungswerkzeug) wieder zur Maske hinzufügen. Anschließend können Sie mit einer SLD-Datei in Mapserver die Maske als transparentes Grau und die Ausschnitte als vollständig transparent gestalten und die Beschriftungen dort anbringen. Hier ist eine SLD-Beispieldatei (diese wurde für Geoserver erstellt):

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

Beachten Sie, dass die Polygone die Eigenschaft "TYPE" mit den Werten "inner" oder "extern" haben müssen, damit dies ordnungsgemäß funktioniert.

Katahdin
quelle
Vielen Dank für Ihre Antwort - hängt das SLD für Geoserver überhaupt zusammen? Ich sehe keine Ähnlichkeit zwischen MapServer und MapServer.
DJQ
Mapserver kann auch SLD verwenden. Hier ist ein Beispiel und hier sind die Dokumente zu SLD für Mapserver. SLD ist ein OGC-Standard, wird jedoch in Geoserver und Mapserver leider nicht genau auf die gleiche Weise implementiert. Ich erwarte jedoch, dass das obige Beispiel funktioniert - sogar der Filter .
Katahdin