Como colorir polígonos com um preenchimento completamente transparente usando o MapServer?

11

É possível preencher polígonos para que sejam completamente transparentes no MapServer? Quero ter um fundo preto ligeiramente opaco e, onde quer que haja um polígono, quero que fique completamente claro, sem preenchimento. Defino meu histórico da seguinte maneira:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Tentei criar uma classe branca para preencher o polígono e experimentei a opacidade usando TRANSPARENCYvalores de 0 a 100, mas isso não resulta em um polígono claro:

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

Isso resulta no seguinte tipo de imagem:

insira a descrição da imagem aqui

Em vez de o polígono ter um preenchimento branco; Quero que ele seja preenchido sem cor. Encontrei uma sugestão online para definir a cor assim:

COLOR -1 -1 -1

mas também não funcionou. Nesta parte da documentação, é descrito o seguinte:

"PALETTE = / path / to / palette.txt" é usado para definir o caminho absoluto onde as cores da paleta podem ser encontradas. Este arquivo deve conter 256 entradas de trigêmeos r, g, b para imagemodes RGB, ou r, g, b, a quádruplos para imagemodes RGBA. O formato esperado é um tripleto (ou quádruplo) por linha, cada valor separado por vírgulas e cada tripleto / quádruplo em uma única linha. Se você deseja usar a transparência com uma paleta, é importante ter essas duas cores no arquivo da paleta: 0,0,0,0 e 255,255,255,255.

Depois de ler isso, eu também tentei usar, COLOR 0 0 0 0mas isso gera um erro:

Identificador desconhecido. Erro de análise próximo a (0) :( linha 71)

Não entendo como me refiro a uma cor definida, PALETTE=/path/to/palette.txtmas essa parece ser uma maneira possível de conseguir isso.

djq
fonte
Uma maneira de evitar dor de cabeça pode ser converter polígonos em linhas.
Nadya
como eu poderia não preencher o polígono dessa maneira?
DJQ
2
Quero dizer, criar o arquivo shapefile de linha que representa os contornos do polígono usando qualquer software GIS e adicionar essas linhas ao Mapserver em vez dos polígonos. As linhas não podem ter preenchimento.
Nad4
Não me importo se as linhas aparecerem ou não; Eu só quero um preenchimento de polígono claro.
perfil completo de djq
1
Não há necessidade de converter polígonos para linhas - você pode definir 'linha TYPE' para a camada no arquivo MAP também para geometria de polígono
user1702401

Respostas:

4

O Mapserver introduziu recentemente o conceito de camadas de máscara (uma máscara se comporta como uma máscara no Photoshop misturando-se com a camada à qual é aplicada).

O RFC descreve o que eles fazem e como podem ser usados. Ao ler sua resposta, parece que você pode usar uma camada de máscara para obter o efeito 'buraco da fechadura' que está procurando.

Não tenho certeza se esse recurso chegou ao 6.2 lançado algumas semanas atrás.

unicoletti
fonte
4

Portanto, você deseja "penetrar" no plano de fundo preto pelos polígonos transparentes para ver o plano de fundo inferior. Não tenho certeza de que isso seja possível com o MapServer, mas posso sugerir outro truque.

Você pode criar um polígono muito grande, cobrindo toda a sua área e ainda mais, usando qualquer software GIS. Em seguida, você pode apagar seus polígonos desse polígono da área e, em seguida, colocar esse polígono com orifício no MapServer e torná-lo preto, em vez do fundo preto. Os furos correspondentes aos seus polígonos serão "transparentes".

nadya
fonte
1

Eu tinha essas linhas no meu arquivo .map e a transparência menor que 100 estava funcionando.

  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

Espero que ajude.

nadya
fonte
Isso resultou em um polígono completamente transparente? Tentei experimentar com valores de TRANSPARENCY0 a 100 e parecia ajustar a opacidade. Sei que isso não ficou claro na minha pergunta inicialmente - eu a revisei.
perfil completo de djq
Então, você quer ter apenas o contorno do polígono e tudo transparente por dentro, certo? Provavelmente eu não entendi e sugeri transparência geral.
Nadya
Desculpe pela dupla confusão; limpe o preenchimento de polígono; linhas não importam.
DJQ
1
@djq TRANSPARENCY foi privado na versão 5.0. A camada OPACITY é a propriedade correta a ser usada.
davidf
1

Abaixo está uma imagem de amostra mostrando uma camada de máscara transparente. Se você aumentar a máscara, seu usuário não perceberá as bordas externas. Semelhante ao que @nadya sugeriu, você pode:

  1. Crie um polígono retangular grande
  2. Crie polígonos para cada um dos "recortes"
  3. Subtraia os polígonos menores do maior (a ferramenta Diferença no QGIS funciona bem para isso)

máscara transparente

Nesse ponto, você terá uma máscara finalizada. No entanto, se você deseja adicionar etiquetas aos espaços recortados, precisará adicionar (usando uma ferramenta União) os polígonos menores de volta à máscara. Em seguida, com um arquivo SLD no Mapserver, você pode estilizar a máscara como cinza transparente, estilizar os recortes como completamente transparentes e aplicar os rótulos nela. Aqui está um arquivo SLD de amostra (criado para o 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>

Observe que os polígonos precisariam ter a propriedade "TYPE" com os valores "interno" ou "externo" para que isso funcionasse corretamente.

katahdin
fonte
Obrigado pela sua resposta - o SLD for geoserver está relacionado? Não vejo a semelhança entre ele e o MapServer.
DJQ
O Mapserver também pode usar o SLD. Aqui está um exemplo e aqui estão os documentos do SLD for Mapserver. SLD é um padrão OGC, mas, infelizmente, não é implementado exatamente da mesma maneira no Geoserver e no Mapserver. No entanto, espero que o exemplo acima funcione - mesmo o filtro .
Katahdin