Làm cách nào để tô màu các đa giác với màu hoàn toàn trong suốt bằng MapServer?


11

Có thể điền vào đa giác để chúng hoàn toàn trong suốt trong MapServer không? Tôi muốn có một nền đen hơi mờ và bất cứ nơi nào có đa giác tôi muốn nó hoàn toàn rõ ràng mà không cần điền. Tôi đặt nền của mình theo cách sau:

   IMAGECOLOR     0 0 0
   TRANSPARENT OFF

Tôi đã thử tạo một lớp có màu trắng để điền vào đa giác và đã thử nghiệm độ mờ bằng cách sử dụng TRANSPARENCYcác giá trị từ 0 - 100 nhưng nó không dẫn đến một đa giác rõ ràng:

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

Đây là kết quả trong loại hình ảnh sau đây:

nhập mô tả hình ảnh ở đây

Thay vì đa giác có một màu trắng; Tôi muốn nó có một màu không có. Tôi tìm thấy một gợi ý trực tuyến để xác định màu như thế này:

COLOR -1 -1 -1

nhưng nó cũng không hoạt động. Trong phần này của tài liệu, phần sau đây được mô tả:

PAL PALETTE = / path / to / palette.txt Được sử dụng để xác định đường dẫn tuyệt đối nơi có thể tìm thấy màu bảng màu. Tệp này phải chứa 256 mục nhập của bộ ba r, g, b cho hình ảnh RGB hoặc r, g, b, một bộ tứ cho hình ảnh RGBA. Định dạng dự kiến ​​là một bộ ba (hoặc bộ tứ) trên mỗi dòng, mỗi giá trị được phân tách bằng dấu phẩy và mỗi bộ ba / bộ tứ trên một dòng. Nếu bạn muốn sử dụng độ trong suốt với bảng màu, điều quan trọng là phải có hai màu này trong tệp bảng màu: 0,0,0,0 và 255,255,255,255.

Sau khi đọc nó, tôi cũng đã thử sử dụng COLOR 0 0 0 0nhưng điều này gây ra lỗi:

Định danh không xác định. Lỗi phân tích cú pháp gần (0) :( dòng 71)

Tôi không hiểu làm thế nào tôi đề cập đến một màu xác định trong PALETTE=/path/to/palette.txtnhưng đây dường như là một cách có thể để đạt được điều này.


Một cách để tránh đau đầu có thể là chuyển đổi đa giác thành dòng.
nadya

Làm thế nào tôi có thể không điền vào đa giác theo cách đó?
djq

2
Ý tôi là, để tạo shapefile dòng đại diện cho các phác thảo đa giác bằng bất kỳ phần mềm GIS nào và thêm các dòng này vào Mapserver thay vì đa giác. Các dòng không thể điền vào tất cả.
nadya

Tôi không phiền nếu các dòng xuất hiện hay không; Tôi chỉ muốn điền vào đa giác rõ ràng.
djq

1
Không cần phải chuyển đổi đa giác thành các dòng - bạn có thể định nghĩa 'dòng TYPE' cho lớp trong tệp MAP cũng cho hình học đa giác
user1702401

Câu trả lời:


4

Mapserver gần đây đã giới thiệu khái niệm về các lớp mặt nạ (mặt nạ hoạt động khá giống mặt nạ trong Photoshop bằng cách trộn với lớp mà nó được áp dụng).

Các RFC mô tả những gì họ làm và làm thế nào họ có thể được sử dụng. Bằng cách đọc câu trả lời của bạn, có vẻ như bạn có thể sử dụng một lớp mặt nạ để có được hiệu ứng 'lỗ khóa' mà bạn đang tìm kiếm.

Tôi không chắc liệu tính năng này có xuất hiện trong bản 6.2 được phát hành vài tuần trước hay không.


4

Vì vậy, bạn muốn "thâm nhập" nền đen bằng các đa giác trong suốt của bạn để xem nền dưới. Tôi không chắc chắn rằng nó có thể với MapServer, nhưng tôi có thể đề xuất một mẹo khác.

Bạn có thể tạo một đa giác rất lớn bao gồm tất cả các khu vực của bạn và thậm chí mở rộng hơn, bằng cách sử dụng bất kỳ phần mềm GIS nào. Sau đó, bạn có thể xóa đa giác của mình khỏi đa giác khu vực này, và sau đó đa giác holed này bạn có thể đặt trên MapServer và làm cho nó thành màu đen, thay vì nền đen. Các lỗ tương ứng với đa giác của bạn sẽ "trong suốt".


1

Tôi đã có những dòng này trong tệp .map của mình và độ trong suốt thấp hơn 100 đang hoạt động.

  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

Hy vọng nó giúp.


Có phải kết quả này trong một đa giác hoàn toàn trong suốt? Tôi đã thử trải nghiệm với các giá trị TRANSPARENCYtừ 0 - 100 và dường như chỉ điều chỉnh độ mờ. Tôi nhận ra điều này không rõ ràng trong câu hỏi của tôi một cách thân mật - tôi đã sửa đổi nó.
djq

Vì vậy, bạn muốn có chỉ là phác thảo của đa giác và mọi thứ trong suốt, phải không? Tôi có lẽ hiểu lầm và đề nghị minh bạch chung.
nadya

Xin lỗi vì sự nhầm lẫn kép; chỉ cần điền đa giác rõ ràng; dòng không quan trọng.
djq

1
@djq TRANSPARENCY đã được mô tả ở phiên bản 5.0. Lớp OPACITY là thuộc tính chính xác để sử dụng.
DavidF

1

Dưới đây là một hình ảnh mẫu cho thấy một lớp mặt nạ trong suốt. Nếu bạn làm cho mặt nạ lớn hơn nhiều, thì người dùng của bạn sẽ không chú ý đến các cạnh bên ngoài. Tương tự như những gì @nadya đề xuất, bạn có thể:

  1. Tạo một đa giác hình chữ nhật lớn
  2. Tạo đa giác cho mỗi "điểm cắt"
  3. Trừ các đa giác nhỏ hơn từ đa giác lớn hơn (công cụ Sự khác biệt trong QGIS hoạt động độc đáo cho việc này)

mặt nạ trong suốt

Lúc này bạn sẽ có một mặt nạ hoàn thành. Tuy nhiên, nếu bạn muốn thêm nhãn vào khoảng trắng, thì bạn sẽ cần thêm (sử dụng công cụ Union) các đa giác nhỏ hơn trở lại mặt nạ. Sau đó, với tệp SLD trong Mapserver, bạn có thể định kiểu mặt nạ là màu xám trong suốt và tạo kiểu cho phần hoàn toàn trong suốt và áp dụng các nhãn ở đó. Đây là tệp SLD mẫu (tệp này được tạo cho 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>

Lưu ý rằng đa giác sẽ cần phải có thuộc tính "TYPE" với các giá trị "bên trong" hoặc "bên ngoài" để điều này hoạt động chính xác.


Cảm ơn câu trả lời của bạn - SLD cho geoserver có liên quan gì không? Tôi không thấy sự tương đồng giữa nó và MapServer.
djq

Mapserver cũng có thể sử dụng SLD. Đây là một ví dụ và đây là các tài liệu về SLD cho Mapserver. SLD là một tiêu chuẩn OGC, nhưng, than ôi, nó không được triển khai chính xác theo cách tương tự trong Geoserver và Mapserver. Tuy nhiên, tôi hy vọng ví dụ trên hoạt động - ngay cả bộ lọc .
katahdin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.