วิธีการเติมสีหลายเหลี่ยมด้วยการเติมแบบโปร่งใสอย่างสมบูรณ์โดยใช้ 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 triplets สำหรับ RGB imagemode หรือ r, g, b, quadruplet สำหรับ RGBA imagemode รูปแบบที่คาดหวังคือหนึ่ง triplet (หรือ quadruplet) ต่อบรรทัดแต่ละค่าคั่นด้วยเครื่องหมายจุลภาคและแต่ละ triplet / quadruplet บนบรรทัดเดียว หากคุณต้องการใช้ความโปร่งใสด้วยจานสีคุณจำเป็นต้องมีสองสีในไฟล์ palette: 0,0,0,0 และ 255,255,255,255

หลังจากอ่านข้อความนี้ฉันก็ลองใช้ดูCOLOR 0 0 0 0แต่มันก็มีข้อผิดพลาดเกิดขึ้น:

ตัวระบุที่ไม่รู้จัก การแยกวิเคราะห์ข้อผิดพลาดใกล้ (0) :( บรรทัดที่ 71)

ฉันไม่เข้าใจว่าฉันหมายถึงสีที่กำหนดไว้อย่างไรPALETTE=/path/to/palette.txtแต่นี่เป็นวิธีที่เป็นไปได้ในการบรรลุเป้าหมาย


วิธีหนึ่งในการหลีกเลี่ยงอาการปวดหัวอาจเป็นการแปลงรูปหลายเหลี่ยมเป็นเส้น
nadya

ฉันจะไม่มีรูปหลายเหลี่ยมในแบบนั้นได้อย่างไร?
djq

2
ฉันหมายถึงการสร้าง line shapefile ที่เป็นตัวแทนของรูปหลายเหลี่ยมโดยใช้ซอฟต์แวร์ GIS ใด ๆ และเพิ่มบรรทัดเหล่านี้ไปยัง 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 Layer 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" ที่มีค่า "inner" หรือ "outer" เพื่อให้ทำงานได้อย่างถูกต้อง


ขอบคุณสำหรับคำตอบของคุณ - SLD สำหรับ geoserver เกี่ยวข้องกันหรือไม่? ฉันไม่เห็นความคล้ายคลึงกันระหว่างมันกับ MapServer
djq

Mapserver สามารถใช้ SLD ได้เช่นกัน นี่คือตัวอย่างและนี่คือเอกสารสำหรับ SLD สำหรับ Mapserver SLD เป็นมาตรฐาน OGC แต่ก็ไม่ได้มีการใช้งานเหมือนกันใน Geoserver และ Mapserver แต่ผมคาดหวังว่าตัวอย่างข้างต้นไปทำงาน - แม้ตัวกรอง
katahdin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.