Bagaimana mewarnai poligon dengan isian yang benar-benar transparan menggunakan MapServer?

11

Apakah mungkin untuk mengisi poligon sehingga benar-benar transparan di MapServer? Saya ingin memiliki latar belakang hitam yang sedikit buram, dan di mana pun ada poligon, saya ingin semuanya menjadi jelas tanpa isi. Saya mengatur latar belakang saya dengan cara berikut:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Saya sudah mencoba membuat kelas yang berwarna putih untuk mengisi poligon, dan bereksperimen dengan opacity menggunakan TRANSPARENCYdengan nilai dari 0 - 100 tetapi tidak menghasilkan poligon yang jelas:

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

Ini menghasilkan jenis gambar berikut:

masukkan deskripsi gambar di sini

Alih-alih poligon memiliki isian putih; Saya ingin memiliki isi tanpa warna. Saya menemukan satu saran online untuk mendefinisikan warna seperti ini:

COLOR -1 -1 -1

tetapi juga tidak berhasil. Di bagian dokumentasi ini, berikut ini dijelaskan:

"PALETTE = / path / to / palette.txt" digunakan untuk menentukan jalur absolut tempat warna palet dapat ditemukan. File ini harus berisi 256 entri r, g, b triplet untuk RGB imagemodes, atau r, g, b, quadruplets untuk RGBA imagemodes. Format yang diharapkan adalah satu triplet (atau quadruplet) per baris, setiap nilai dipisahkan oleh koma, dan setiap triplet / quadruplet pada satu baris. Jika Anda ingin menggunakan transparansi dengan palet, penting untuk memiliki dua warna ini dalam file palet: 0,0,0,0 dan 255,255,255,255.

Setelah membaca ini, saya juga mencoba menggunakan COLOR 0 0 0 0tetapi ini menimbulkan kesalahan:

Pengidentifikasi tidak dikenal. Kesalahan parsing dekat (0) :( baris 71)

Saya tidak mengerti bagaimana saya merujuk pada warna define PALETTE=/path/to/palette.txttetapi ini sepertinya satu cara yang mungkin untuk mencapai ini.

djq
sumber
Salah satu cara untuk menghindari sakit kepala bisa dengan mengubah poligon menjadi garis.
nadya
bagaimana mungkin saya tidak mengisi poligon dengan cara itu?
djq
2
Maksud saya, untuk membuat garis shapefile mewakili garis besar poligon menggunakan perangkat lunak SIG, dan menambahkan garis-garis ini ke Mapserver bukan poligon. Garis tidak dapat diisi sama sekali.
nadya
Saya tidak keberatan jika garis muncul atau tidak; Saya hanya ingin isi poligon yang jelas.
djq
1
Tidak perlu mengonversi poligon menjadi garis - Anda dapat menentukan 'JENIS garis' untuk lapisan dalam file MAP juga untuk geometri poligon
pengguna1702401

Jawaban:

4

Mapserver baru-baru ini memperkenalkan konsep lapisan topeng (topeng berperilaku cukup seperti topeng di Photoshop dengan memadukan dengan lapisan yang diterapkannya).

The RFC menggambarkan apa yang mereka lakukan dan bagaimana mereka dapat digunakan. Dengan membaca jawaban Anda, sepertinya Anda bisa menggunakan layer mask untuk mendapatkan efek 'lubang kunci' yang Anda cari.

Saya tidak yakin apakah fitur ini masuk ke versi 6.2 yang dirilis beberapa minggu lalu.

unicoletti
sumber
4

Jadi, Anda ingin "menembus" latar belakang hitam dengan poligon transparan Anda untuk melihat latar belakang yang lebih rendah. Saya tidak yakin apakah itu mungkin dengan MapServer, tetapi saya dapat menyarankan trik lain.

Anda dapat membuat poligon sangat besar yang mencakup semua area Anda dan bahkan lebih diperluas, menggunakan perangkat lunak SIG apa pun. Kemudian Anda bisa menghapus poligon Anda dari poligon area ini, dan kemudian poligon holed ini Anda bisa memakai MapServer dan membuatnya hitam, bukan latar belakang hitam. Lubang yang sesuai dengan poligon Anda akan menjadi "transparan".

nadya
sumber
1

Saya memiliki baris-baris ini dalam file .map saya dan transparansi di bawah 100 berfungsi.

  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

Semoga ini bisa membantu.

nadya
sumber
Apakah ini menghasilkan poligon yang sepenuhnya transparan? Saya mencoba bereksperimen dengan nilai TRANSPARENCYdari 0 - 100 dan sepertinya hanya menyesuaikan opacity. Saya menyadari ini tidak jelas dalam pertanyaan saya secara awal - saya merevisinya.
djq
Jadi, Anda hanya ingin memiliki garis besar poligon dan semua yang transparan di dalamnya, bukan? Saya mungkin salah paham dan menyarankan transparansi umum.
nadya
Maaf atas kebingungan ganda; cukup isi poligon kosong; garis tidak masalah.
djq
1
@djq TRANSPARANSI diturunkan pada versi 5.0. Layer OPACITY adalah properti yang benar untuk digunakan.
DavidF
1

Di bawah ini adalah contoh gambar yang menunjukkan lapisan topeng transparan. Jika Anda membuat topeng lebih besar, maka pengguna Anda tidak akan melihat tepi luarnya. Mirip dengan apa yang disarankan @nadya, Anda dapat:

  1. Buat poligon persegi panjang besar
  2. Buat poligon untuk masing-masing "cut-out"
  3. Kurangi poligon yang lebih kecil dari yang lebih besar (alat Perbedaan di QGIS berfungsi dengan baik untuk ini)

topeng transparan

Pada titik ini Anda akan memiliki topeng jadi. Namun, jika Anda ingin menambahkan label ke ruang cut-out, maka Anda perlu menambahkan (menggunakan alat Union) poligon yang lebih kecil kembali ke topeng. Kemudian, dengan file SLD di Mapserver, Anda bisa menata topeng sebagai abu-abu transparan, dan menata cut-out sepenuhnya transparan, dan menerapkan label di sana. Berikut ini contoh file SLD (ini dibuat untuk 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>

Perhatikan bahwa poligon harus memiliki properti "TYPE" dengan nilai "inner" atau "outer" agar ini berfungsi dengan baik.

katahdin
sumber
Terima kasih atas jawaban Anda - apakah SLD untuk geoserver terkait? Saya tidak melihat kesamaan antara itu dan MapServer.
djq
Mapserver juga dapat menggunakan SLD. Berikut adalah contoh, dan di sini adalah dokumentasi pada SLD untuk Mapserver. SLD adalah standar OGC, tetapi, sayangnya, ini tidak diimplementasikan dengan cara yang persis sama di Geoserver dan Mapserver. Namun, saya berharap contoh di atas berfungsi - bahkan filter .
katahdin