MapServer kullanarak tamamen şeffaf bir dolgu ile çokgenler nasıl renklendirilir?


11

MapServer'da çokgenleri tamamen şeffaf olacak şekilde doldurmak mümkün mü? Biraz opak bir siyah arka plana sahip olmak istiyorum ve çokgenin olduğu her yerde, dolgusuz tamamen net olmasını istiyorum. Arka planımı şu şekilde ayarladım:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Çokgen doldurmak için beyaz bir sınıf oluşturmaya çalıştım ve TRANSPARENCY0 - 100 değerleri kullanarak opaklık ile denedim ama net bir çokgen ile sonuçlanmaz:

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

Bu, aşağıdaki görüntü türüyle sonuçlanır:

resim açıklamasını buraya girin

Beyaz dolgulu çokgen yerine; Renksiz bir dolgu olmasını istiyorum. Rengi şu şekilde tanımlamak için çevrimiçi bir öneri buldum:

COLOR -1 -1 -1

ama aynı zamanda işe yaramadı. Belgelerin bu bölümünde aşağıdakiler açıklanmaktadır:

Palet renklerinin bulunabileceği mutlak yolu tanımlamak için “PALETTE = / path / to / palette.txt” kullanılır. Bu dosya, RGB imagemodes için 256 r, g, b üçlüsü veya RGBA imagemodes için dörtlü r, g, b üçlüsü içermelidir. Beklenen biçim, satır başına bir üçlü (veya dörtlü), her değer virgülle ayrılmış ve her üçlü / dörtlü tek bir satırda. Bir paletle saydamlığı kullanmak istiyorsanız, palet dosyasında şu iki rengin olması önemlidir: 0,0,0,0 ve 255,255,255,255.

Bunu okuduktan sonra da kullanmayı denedim COLOR 0 0 0 0ama bu bir hata veriyor:

Bilinmeyen tanımlayıcı. (0) :( satır 71) yakınında ayrıştırma hatası

Tanımlanmış bir rengi nasıl ifade ettiğimi anlamıyorum PALETTE=/path/to/palette.txtama bu bunu başarmanın olası bir yolu gibi görünüyor.


Baş ağrısından kaçınmanın bir yolu, çokgenleri çizgilere dönüştürmek olabilir.
nadya

çokgenin bu şekilde doldurulmamasını nasıl sağlayabilirim?
djq

2
Yani, herhangi bir GIS yazılımı kullanarak çokgen anahatlarını temsil eden çizgi şekil dosyasını oluşturmak ve bu satırları çokgenler yerine Mapserver'a eklemek. Çizgilerin hiç dolgusu olamaz.
nadya

Çizgilerin görünüp görünmediğini umursamıyorum; Sadece net bir çokgen dolgusu istiyorum.
djq

1
Çokgenleri çizgilere dönüştürmeye gerek yoktur - MAP dosyasındaki katman için de çokgen geometrisi için 'TYPE çizgisini' tanımlayabilirsiniz
user1702401

Yanıtlar:


4

Mapserver son zamanlarda maske katmanları kavramını tanıttı (maske, uygulandığı katmanla harmanlanarak Photoshop'ta bir maske gibi davranır).

RFC yaptıkları ve nasıl kullanılabilir açıklar. Cevabınızı okuyarak, aradığınız 'anahtar deliği' efektini elde etmek için bir maske katmanı kullanabileceğiniz anlaşılıyor.

Bu özelliğin birkaç hafta önce yayınlanan 6.2'ye girip girmediğinden emin değilim.


4

Bu nedenle, alt arka planı görmek için siyah arka plana şeffaf çokgenlerinizden "nüfuz etmek" istersiniz. MapServer ile mümkün olduğundan emin değilim, ama başka bir hile önerebilirim.

Herhangi bir GIS yazılımını kullanarak tüm alanınızı kapsayan ve daha da genişletilmiş çok büyük bir çokgen oluşturabilirsiniz. Daha sonra çokgenlerinizi bu alan çokgenden silebilirsiniz ve daha sonra bu delikli çokgeni MapServer üzerine koyabilir ve siyah arka plan yerine siyah yapabilirsiniz. Çokgenlerinize karşılık gelen delikler "şeffaf" olacaktır.


1

Bu satırları .map dosyamda vardı ve 100'den düşük şeffaflık çalışıyordu.

  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

Umarım yardımcı olur.


Bu tamamen şeffaf bir çokgene neden oldu? TRANSPARENCY0 - 100 arasındaki değerleri denemeye çalıştım ve opaklığı ayarlamış gibi görünüyordu. Bunun benim sorumda net bir şekilde anlaşılmadığını fark ettim - revize ettim.
djq

Yani, çokgenin ana hatlarını ve her şeyin şeffaf olmasını istiyorsun, değil mi? Muhtemelen yanlış anladım ve genel şeffaflığı önerdim.
nadya

Çifte karışıklık için özür dilerim; sadece çokgen dolgusunu temizle; çizgiler önemli değil.
djq

1
@djq TRANSPARENCY, 5.0 sürümünde belirtilmiştir. Katman OPACITY, kullanılacak doğru özelliktir.
DavidF

1

Aşağıda, şeffaf maske katmanını gösteren örnek bir resim bulunmaktadır. Maskeyi çok daha büyük yaparsanız, kullanıcı dış kenarları fark etmez. @Nadya'nın önerdiğine benzer şekilde şunları yapabilirsiniz:

  1. Büyük bir dikdörtgen çokgen oluşturun
  2. "Kesik çizgiler" in her biri için çokgenler oluşturun
  3. Küçük çokgenleri büyük olandan çıkarın (QGIS içindeki Fark aracı bunun için iyi çalışır)

şeffaf maske

Bu noktada bitmiş bir maskeye sahip olacaksınız. Ancak, boşaltma alanlarına etiket eklemek istiyorsanız, daha küçük çokgenleri maskeye geri eklemeniz gerekir (Bir Birlik aracı kullanarak). Ardından, Mapserver'da bir SLD dosyasıyla maskeyi saydam gri olarak biçimlendirebilir ve kesiklere tamamen şeffaf olarak stil uygulayabilir ve etiketleri buraya uygulayabilirsiniz. Örnek bir SLD dosyası (bu Geoserver için oluşturulmuştur):

<?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>

Bunun düzgün çalışması için çokgenlerin "iç" veya "dış" değerlerine sahip "TYPE" özelliğine sahip olması gerektiğini unutmayın.


Cevabınız için teşekkürler - Geoserver için SLD hiç alakalı mu? MapServer ile benzerliğini görmüyorum.
djq

Harita sunucusu SLD'yi de kullanabilir. İşte bir örnek, ve burada Mapserver için SÖB üzerinde docs bulunmaktadır. SLD bir OGC standardıdır, ancak, ne yazık ki, Geoserver ve Mapserver'da tam olarak aynı şekilde uygulanmaz. Ancak, yukarıdaki örneğin çalışmasını bekliyorum - hatta filtre .
katahdin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.