Как закрасить полигоны с полностью прозрачной заливкой, используя MapServer?

11

Можно ли заполнить полигоны так, чтобы они были полностью прозрачными в MapServer? Я хочу, чтобы черный фон был слегка непрозрачным, и везде, где есть многоугольник, я хочу, чтобы он был полностью прозрачным без заливки. Я установил свой фон следующим образом:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Я попытался создать класс, который будет белым, чтобы заполнить многоугольник, и экспериментировал с непрозрачностью, используя TRANSPARENCYзначения от 0 до 100, но это не привело к чистому многоугольнику:

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

Это приводит к следующему типу изображения:

введите описание изображения здесь

Вместо многоугольника, имеющего белую заливку; Я хочу, чтобы он имел заливку без цвета. Я нашел одно предложение онлайн, чтобы определить цвет следующим образом:

COLOR -1 -1 -1

но это тоже не сработало. В этой части документации описано следующее:

«PALETTE = / path / to / palette.txt» используется для определения абсолютного пути, где можно найти цвета палитры. Этот файл должен содержать 256 записей триплетов r, g, b для режимов изображения RGB или r, g, b - четверки для режимов изображения RGBA. Ожидаемый формат - один триплет (или квадруплет) на строку, каждое значение разделено запятыми, а каждый триплет / четверка на одной строке. Если вы хотите использовать прозрачность с палитрой, важно иметь эти два цвета в файле палитры: 0,0,0,0 и 255,255,255,255.

Прочитав это, я также попытался использовать, COLOR 0 0 0 0но это выдает ошибку:

Неизвестный идентификатор. Ошибка разбора около (0) :( строка 71)

Я не понимаю, как я отношусь к определению цвета, PALETTE=/path/to/palette.txtно это кажется одним из возможных способов достижения этого.

djq
источник
Одним из способов избежать головной боли может быть преобразование полигонов в линии.
Надя
как я мог не заполнить многоугольник таким образом?
DJQ
2
Я имею в виду создание шейп-файла линии, представляющего контуры многоугольника, с использованием любого программного обеспечения ГИС, и добавление этих линий в Mapserver вместо полигонов. Строки не могут заполняться вообще.
Надя
Я не против, появляются ли линии или нет; Я просто хочу чистую заливку многоугольника.
DJQ
1
Нет необходимости конвертировать полигоны в линии - вы можете определить «линию ТИПА» для слоя в файле MAP, а также для геометрии полигона
user1702401

Ответы:

4

Mapserver недавно представил концепцию слоев маски (маска в Photoshop ведет себя подобно маске в сочетании со слоем, к которому она применяется).

RFC описывает то , что они делают и как они могут быть использованы. Прочитав ваш ответ, вы можете использовать слой маски, чтобы получить эффект «замочной скважины», который вы ищете.

Я не уверен, попала ли эта функция в 6.2, которая была выпущена пару недель назад.

unicoletti
источник
4

Итак, вы хотите «проникнуть» в черный фон с помощью прозрачных полигонов, чтобы увидеть нижний фон. Я не уверен, что это возможно с MapServer, но я могу предложить другой трюк.

Вы можете создать очень большой многоугольник, охватывающий всю вашу область и даже более расширенный, используя любое программное обеспечение ГИС. Затем вы можете стереть полигоны из этого многоугольника области, а затем этот многоугольник с отверстиями, который вы можете поместить в MapServer и сделать его черным, а не черным фоном. Отверстия, соответствующие вашим полигонам, будут «прозрачными».

надя
источник
1

У меня были эти строки в моем файле .map, и прозрачность ниже 100 работала.

  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

Надеюсь, поможет.

надя
источник
Это привело к полностью прозрачному многоугольнику? Я попытался поэкспериментировать со значениями TRANSPARENCYот 0 до 100, и казалось, что он просто регулирует непрозрачность. Я понимаю, что это не было ясно в моем вопросе изначально - я пересмотрел это.
DJQ
Итак, вы хотите иметь только контур многоугольника и все прозрачное внутри, верно? Я, вероятно, неправильно понял и предложил общую прозрачность.
Надя
Извините за двойную путаницу; просто очистить полигональную заливку; линии не имеют значения.
DJQ
1
@djq ПРОЗРАЧНОСТЬ была исключена из версии 5.0. Слой OPACITY - правильное свойство для использования.
DavidF
1

Ниже приведен пример изображения с прозрачным слоем маски. Если вы сделаете маску намного больше, то ваш пользователь не заметит внешние края. Подобно тому, что предложил @nadya, вы можете:

  1. Создать большой прямоугольный многоугольник
  2. Создавайте полигоны для каждого из «вырезов»
  3. Вычтите меньшие полигоны из большего (для этого отлично работает инструмент Разница в QGIS)

прозрачная маска

На этом этапе у вас будет готовая маска. Однако, если вы хотите добавить метки к вырезанным полям, вам нужно будет добавить (с помощью инструмента «Объединение») меньшие полигоны обратно в маску. Затем, используя файл SLD в Mapserver, вы можете стилизовать маску как прозрачную серую, стилизовать вырезы как полностью прозрачные и нанести туда метки. Вот пример файла SLD (он был построен для 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>

Обратите внимание, что для правильной работы полигонов необходимо иметь свойство «TYPE» со значениями «inner» или «external».

Katahdin
источник
Спасибо за ваш ответ - вообще связан ли SLD для геосервера? Я не вижу сходства между ним и MapServer.
djq
Mapserver также может использовать SLD. Вот пример, и вот документы по SLD для Mapserver. SLD - это стандарт OGC, но, увы, он не реализован точно так же, как в Geoserver и Mapserver. Тем не менее, я ожидаю, что приведенный выше пример будет работать - даже фильтр .
катахдин