¿Cómo colorear polígonos con un relleno completamente transparente usando MapServer?

11

¿Es posible rellenar polígonos para que sean completamente transparentes en MapServer? Quiero tener un fondo negro que sea ligeramente opaco, y donde haya un polígono quiero que quede completamente claro sin relleno. Establezco mi fondo de la siguiente manera:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Intenté crear una clase que sea blanca para llenar el polígono, y experimenté con la opacidad usando TRANSPARENCYvalores de 0 a 100, pero no resulta en un 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 

Esto da como resultado el siguiente tipo de imagen:

ingrese la descripción de la imagen aquí

En lugar de que el polígono tenga un relleno blanco; Quiero que tenga un relleno sin color. Encontré una sugerencia en línea para definir el color de esta manera:

COLOR -1 -1 -1

Pero tampoco funcionó. En esta parte de la documentación, se describe lo siguiente:

"PALETTE = / path / to / palette.txt" se utiliza para definir la ruta absoluta donde se pueden encontrar los colores de la paleta. Este archivo debe contener 256 entradas de tripletes r, g, b para modos de imagen RGB, o r, g, b, un cuadruplete para modos de imagen RGBA. El formato esperado es un triplete (o cuadruplete) por línea, cada valor separado por comas y cada triplete / cuadruplete en una sola línea. Si desea utilizar la transparencia con una paleta, es importante tener estos dos colores en el archivo de paleta: 0,0,0,0 y 255,255,255,255.

Después de leer esto, también intenté usar COLOR 0 0 0 0pero esto arroja un error:

Identificador desconocido. Error de análisis cerca de (0) :( línea 71)

No entiendo cómo me refiero a un color definido, PALETTE=/path/to/palette.txtpero esta parece ser una forma posible de lograrlo.

djq
fuente
Una forma de evitar el dolor de cabeza podría ser convertir los polígonos en líneas.
nadya
¿Cómo podría no rellenar el polígono de esa manera?
djq
2
Quiero decir, crear el archivo de forma de línea que representa los contornos del polígono usando cualquier software SIG, y agregar estas líneas a Mapserver en lugar de los polígonos. Las líneas no pueden tener relleno en absoluto.
nadya
No me importa si las líneas aparecen o no; Solo quiero un claro relleno de polígono.
DJ
1
No hay necesidad de convertir polígonos en líneas: puede definir 'TIPO de línea' para la capa en el archivo MAP también para la geometría del polígono
user1702401

Respuestas:

4

Mapserver ha introducido recientemente el concepto de capas de máscara (una máscara se comporta como una máscara en Photoshop al combinarse con la capa a la que se aplica).

El RFC describe lo que hacen y cómo se pueden usar. Al leer su respuesta, parece que podría usar una capa de máscara para obtener el efecto 'ojo de cerradura' que está buscando.

No estoy seguro de si esta característica llegó al 6.2 que se lanzó hace un par de semanas.

unicoletti
fuente
4

Por lo tanto, desea "penetrar" el fondo negro por sus polígonos transparentes para ver el fondo inferior. No estoy seguro de que sea posible con MapServer, pero puedo sugerir otro truco.

Puede crear un polígono muy grande que cubra toda su área e incluso más extendido, utilizando cualquier software SIG. Luego puede borrar sus polígonos de este polígono de área, y luego este polígono perforado puede colocarlo en MapServer y hacerlo negro, en lugar del fondo negro. Los agujeros correspondientes a sus polígonos serán "transparentes".

nadya
fuente
1

Tenía estas líneas en mi archivo .map y la transparencia inferior a 100 estaba 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 eso ayude.

nadya
fuente
¿Esto resultó en un polígono completamente transparente? Intenté experimentar con valores de TRANSPARENCY0 a 100 y parecía que solo ajustaba la opacidad. Me doy cuenta de que esto no estaba claro en mi pregunta inicialmente: lo revisé.
DJ
Entonces, quieres tener solo el contorno del polígono y todo transparente dentro, ¿verdad? Probablemente entendí mal y sugerí transparencia general.
nadya
Perdón por la doble confusión; simplemente limpie el relleno de polígono; Las líneas no importan.
djq
1
@djq TRANSPARENCY fue depricated en la versión 5.0. La capa OPACITY es la propiedad correcta para usar.
DavidF
1

A continuación se muestra una imagen de muestra que muestra una capa de máscara transparente. Si hace que la máscara sea mucho más grande, entonces su usuario no notará los bordes exteriores. Similar a lo que sugirió @nadya, puedes:

  1. Crea un polígono rectangular grande
  2. Crear polígonos para cada uno de los "recortes"
  3. Resta los polígonos más pequeños del más grande (la herramienta Diferencia en QGIS funciona muy bien para esto)

máscara transparente

En este punto, tendrás una máscara terminada. Sin embargo, si desea agregar etiquetas a los espacios recortados, deberá agregar (utilizando una herramienta de Unión) los polígonos más pequeños de nuevo a la máscara. Luego, con un archivo SLD en Mapserver, puede diseñar la máscara como gris transparente, y aplicar estilo a los recortes como completamente transparente, y aplicar las etiquetas allí. Aquí hay un archivo SLD de muestra (esto fue construido para 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>

Tenga en cuenta que los polígonos necesitarían tener la propiedad "TIPO" con valores "internos" o "externos" para que esto funcione correctamente.

katahdin
fuente
Gracias por su respuesta: ¿está relacionado el SLD para geoservidor? No veo la similitud entre este y MapServer.
djq
Mapserver también puede usar SLD. Aquí hay un ejemplo, y aquí están los documentos en SLD para Mapserver. SLD es un estándar OGC, pero, por desgracia, no se implementa exactamente de la misma manera en Geoserver y Mapserver. Sin embargo, espero que el ejemplo anterior funcione, incluso el filtro .
katahdin