Як розфарбувати багатокутники повністю прозорою заливкою за допомогою 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 = / шлях / до / palette.txt" використовується для визначення абсолютного шляху, де можна знайти кольори палітри. Цей файл повинен містити 256 записів r, g, b трійки для RGB imagemode, або 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

2
Я маю на увазі, щоб створити форму форми ліній, що представляє контури полігону, використовуючи будь-яке програмне забезпечення ГІС, і додати ці рядки до Mapserver замість полігонів. Рядки взагалі не можуть бути заповнені.
nadya

Я не проти, якщо рядки з’являються чи ні; Я просто хочу чіткого заповнення полігону.
djq

1
Не потрібно перетворювати багатокутники на лінії - ви можете визначити "TYPE line" для шару у файлі MAP також для геометрії полігона
user1702401

Відповіді:


4

Mapserver нещодавно представив концепцію шарів маски (маска веде себе так само, як маска у Photoshop, змішуючись із шаром, на який вона наноситься).

RFC описує те , що вони роблять і як вони можуть бути використані. Читаючи свою відповідь, схоже, ви могли б скористатися шаром маски, щоб отримати ефект «замкової щілини», який ви шукаєте.

Я не впевнений, що ця функція перетворилася на 6.2, який був випущений пару тижнів тому.


4

Отже, ви хочете "проникнути" на чорний фон прозорими багатокутниками, щоб побачити нижній фон. Я не впевнений, що це можливо з MapServer, але я можу запропонувати інший трюк.

Ви можете створити дуже великий багатокутник, який охоплюватиме всю вашу територію та ще більше розширюватись, використовуючи будь-яке програмне забезпечення GIS. Тоді ви можете стерти свої багатокутники з полігону цієї області, а потім цей отвір багатокутника ви можете поставити на 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

Отже, ви хочете мати лише контур багатокутника і все прозоре всередині, правда? Я, мабуть, неправильно зрозумів і запропонував загальну прозорість.
nadya

Вибачте за подвійну плутанину; просто чітке заповнення полігону; лінії не мають значення.
djq

1
@djq TRANSPARENCY було випущено версією 5.0. Рівень OPACITY шару - це правильна властивість.
DavidF

1

Нижче наведено зразкове зображення, що показує прозорий шар маски. Якщо ви зробите маску набагато більшою, то користувач не помітить зовнішніх країв. Подібно до того, що запропонував @nadya, ви можете:

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

прозора маска

У цей момент у вас буде готова маска. Однак, якщо ви хочете додати мітки до вирізаних пробілів, вам потрібно буде додати (за допомогою інструменту Union) менші багатокутники назад до маски. Потім, використовуючи файл 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" зі значеннями "внутрішній" або "зовнішній", щоб це нормально працювало.


Дякуємо за вашу відповідь - чи пов’язаний взагалі SLD для геосервера? Я не бачу подібності між ним та MapServer.
djq

Mapserver також може використовувати SLD. Ось приклад, і ось документи на SLD для Mapserver. SLD - стандарт OGC, але, на жаль, він не реалізований точно так само в Geoserver та Mapserver. Однак я очікую, що приклад, який працює вище, спрацює - навіть фільтр .
катахдін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.