Jak pokolorować wielokąty z całkowicie przezroczystym wypełnieniem za pomocą MapServer?

11

Czy można wypełnić wielokąty, aby były całkowicie przezroczyste w MapServer? Chcę mieć czarne tło, które jest nieco nieprzezroczyste, i gdziekolwiek jest wielokąt, chcę, aby było całkowicie czyste bez wypełnienia. Ustawiam swoje tło w następujący sposób:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Próbowałem utworzyć klasę, która jest biała do wypełnienia wielokąta, i eksperymentowałem z kryciem przy użyciu TRANSPARENCYwartości od 0 do 100, ale nie daje to wyraźnego wielokąta:

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

Wynikiem tego jest następujący typ obrazu:

wprowadź opis zdjęcia tutaj

Zamiast wielokąta z białym wypełnieniem; Chcę, żeby miał wypełnienie bez koloru. Znalazłem jedną sugestię online, aby zdefiniować taki kolor:

COLOR -1 -1 -1

ale to też nie działało. W tej części dokumentacji opisano następujące elementy:

„PALETTE = / path / to / palette.txt” służy do zdefiniowania ścieżki bezwzględnej, w której można znaleźć kolory palety. Ten plik musi zawierać 256 pozycji trypletów r, g, b dla trybów graficznych RGB lub r, g, b, kwadrupletów dla trybów graficznych RGBA. Oczekiwany format to jeden triplet (lub kwadruplet) na linię, każda wartość oddzielona przecinkami, a każda triplet / kwadruplet w jednym wierszu. Jeśli chcesz używać przezroczystości z paletą, ważne jest, aby mieć dwa kolory w pliku palety: 0,0,0,0 i 255,255,255,255.

Po przeczytaniu tego również próbowałem użyć, COLOR 0 0 0 0ale powoduje to błąd:

Nieznany identyfikator. Błąd analizowania w pobliżu (0) :( linia 71)

Nie rozumiem, w jaki sposób odnoszę się do określonego koloru, PALETTE=/path/to/palette.txtale wydaje się, że jest to jeden z możliwych sposobów na osiągnięcie tego.

djq
źródło
Jednym ze sposobów uniknięcia bólu głowy może być przekształcenie wielokątów w linie.
nadya
jak mogłem w ten sposób nie wypełniać wielokąta?
djq
2
Mam na myśli, aby utworzyć plik kształtu linii reprezentujący kontury wielokątów za pomocą dowolnego oprogramowania GIS i dodać te linie do Mapserver zamiast wielokątów. Linie nie mogą być wcale wypełnione.
nadya
Nie mam nic przeciwko, czy linie się pojawią, czy nie; Chcę tylko wyraźnego wypełnienia wielokąta.
djq
1
Nie ma potrzeby konwertowania wielokątów na linie - można zdefiniować „linię TYPE” dla warstwy w pliku MAP, również dla geometrii wielokątów
użytkownik1702401,

Odpowiedzi:

4

Mapserver niedawno wprowadził pojęcie warstw maski (maska ​​zachowuje się podobnie do maski w Photoshopie, mieszając się z warstwą, na którą jest nakładana).

RFC opisuje to, co robią i jak można je wykorzystać. Po przeczytaniu odpowiedzi wydaje się, że można użyć warstwy maski, aby uzyskać efekt dziurki od klucza, którego szukasz.

Nie jestem pewien, czy ta funkcja znalazła się w wersji 6.2 wydanej kilka tygodni temu.

unicoletti
źródło
4

Dlatego chcesz „przeniknąć” czarne tło przez przezroczyste wielokąty, aby zobaczyć dolne tło. Nie jestem pewien, czy jest to możliwe dzięki MapServer, ale mogę zasugerować inną sztuczkę.

Za pomocą dowolnego oprogramowania GIS możesz stworzyć bardzo duży wielokąt obejmujący cały twój obszar, a nawet bardziej rozbudowany. Następnie możesz wymazać swoje wielokąty z tego wielokąta obszaru, a następnie ten wielokątny wielobok można umieścić na MapServer i uczynić go czarnym, zamiast czarnego tła. Otwory odpowiadające twoim wielokątom będą „przezroczyste”.

nadya
źródło
1

Miałem te linie w pliku .map i przezroczystość poniżej 100 działała.

  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

Mam nadzieję, że to pomoże.

nadya
źródło
Czy w ten sposób powstał całkowicie przezroczysty wielokąt? Próbowałem eksperymentować z wartościami TRANSPARENCYod 0 do 100 i wydawało się, że po prostu dostosowuje krycie. Zdaję sobie sprawę, że w moim pytaniu nie było to jasne - poprawiłem je.
djq
Chcesz mieć tylko zarys wielokąta i wszystko przezroczyste w środku, prawda? Prawdopodobnie źle zrozumiałem i zasugerowałem ogólną przejrzystość.
nadya
Przepraszam za podwójne zamieszanie; po prostu wyczyść wypełnienie wielokąta; linie nie mają znaczenia.
djq
1
@djq TRANSPARENCY został depricated w wersji 5.0. Warstwa OPACITY jest poprawną właściwością do użycia.
DavidF,
1

Poniżej znajduje się przykładowy obraz przedstawiający przezroczystą warstwę maski. Jeśli powiększysz maskę, użytkownik nie zauważy zewnętrznych krawędzi. Podobnie do sugestii @nadya, możesz:

  1. Utwórz duży prostokątny wielokąt
  2. Twórz wielokąty dla każdego z „wycięć”
  3. Odejmij mniejsze wielokąty od większych (narzędzie Różnice w QGIS działa do tego dobrze)

przezroczysta maska

W tym momencie będziesz mieć gotową maskę. Jeśli jednak chcesz dodać etykiety do wyciętych przestrzeni, musisz dodać (za pomocą narzędzia Unii) mniejsze wielokąty z powrotem do maski. Następnie, korzystając z pliku SLD w Mapserver, możesz stylizować maskę jako przezroczystą szarość, a styl wycinków jako całkowicie przezroczystą i zastosować tam etykiety. Oto przykładowy plik SLD (ten został zbudowany dla 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>

Zauważ, że wielokąty musiałyby mieć właściwość „TYPE” z wartościami „wewnętrzna” lub „zewnętrzna”, aby działało to poprawnie.

katahdin
źródło
Dzięki za odpowiedź - czy SLD dla geoserver w ogóle jest związany? Nie widzę podobieństwa między nim a MapServer.
djq,
Mapserver może również korzystać z SLD. Oto przykład, a oto dokumenty na SLD dla Mapserver. SLD jest standardem OGC, ale niestety nie jest zaimplementowany dokładnie w ten sam sposób w Geoserver i Mapserver. Jednak oczekuję, że powyższy przykład zadziała - nawet filtr .
katahdin