Mapnik xml配置

資源

官方幫助:Mapnik configuration XML

基礎

Map對象包含Style對象、Layer對象。然後Style對象包含Rule對象,Layer對象通過StyleName指定使用的Style對象。Layer對象本身包含DataSource對象,DataSource對象用來設置圖層的數據源。

<Map background-color="white" srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.1502,0.247,0.8421,-20.4894 +units=m +no_defs">
  <Style name="TidalWater_FullColour">
    <Rule>
      <MinScaleDenominator>1000</MinScaleDenominator>
      <MaxScaleDenominator>25000</MaxScaleDenominator>
      <PolygonSymbolizer fill="#D5F4F8"/>
    </Rule>
  </Style>
  <Layer>
    <StyleName>TidalWater_FullColour</StyleName>
    <Datasource>
      <Parameter name="file">./OS-VectorMap-District/st/ST_TidalWater.shp</Parameter>
      <Parameter name="type">shape</Parameter>
    </Datasource>
  </Layer>
</Map>

思維導圖

在這裏插入圖片描述

XML基礎配置

Map對象

Mapnik XML配置的Master對象

屬性 說明
background-color
地圖背景顏色
例如#000000,不透明度由8位數值的最後兩位數控制。#00000000表示透明背景,默認值爲#000000FF。
background-image
地圖背景圖片
可在Mapnik2中使用,可以使用一張圖片來設置背景色,代替顏色填充。
buffer-size
緩衝區大小
font-directory
字體目錄
maximum-extent
最大顯示範圍
設置(投影)地圖的最大顯示範圍,比如-20037508.34, -20037508.34, 20037508.34, 20037508.34
minimum-version
最低版本
聲明要與樣式表一起使用的mapnik的最小版本
srs
座標系
地圖渲染的座標系,比如‘+proj=latlong+datum=WGS84’,座標系可以參考epsg

子節點:

子節點名稱 說明
<DataSource>
數據源
<FileSource>
文件源
<FontSet>
字體集
爲後備字體定義字體集(如果在第一個字體中找不到字符,則在列表中找到之前繼續執行)
<Include>
用於包裝通過XInclude包含的文件中的所有上下文的容器標記
<Layer>
圖層
<Style>
樣式

Style對象

包含許多Rule對象的集合。用來定義對象的渲染方式,一個Mapnik的配置文件可以有不限制數量的樣式對象。Layer對象引用來Style對象來渲染地理數據。

屬性 說明
filter-mode
過濾模式
默認是all,會應用所有的rule對象;還可以設置first,當一個Rule對象匹配成功後則停止。
name
名稱
每個配置文件都需要是唯一的Style對象的名稱。樣式由Layer通過相應的StyleName參數引用
opacity
不透明度
樣式級別不透明度:1表示完全不透明,而0表示完全透明,.5表示50%透明

子節點:

屬性 說明
<Rule>
Rule對象
定義渲染的規則

Rule對象

可以指定特定縮放級別顯示指定的符號。

屬性 說明
name
名稱
Rule對象的名稱,可選參數
title
標題

子節點:

子節點名稱 說明
<MinScaleDenominator>
最小比例尺
此規則適用的最小地圖比例尺, [ScaleAndPpi scale] >= minScaleDenominator - 1e-6時可見
<MaxScaleDenominator>
最大比例尺
此規則使用的最大地圖比例尺, [ScaleAndPpi scale] < MaxScaleDenominator + 1e-6時可見
<Filter>
屬性過濾條件
支持比較運算符:大於&gt、大於等於&gt;=,小於&lt,小於等於&lt;=,等於=
支持邏輯運算符:andornot
支持正則匹配,.match
<ElseFilter/>
其他過濾條件
包含<ElseFilter /> 標籤的Rule對象,.在當前Rule的匹配中,如果沒有可以匹配到的(符合最大最小比例尺或過濾條件)規則,就會執行ElseFilter過濾條件。
<PointSymbolizer>
點符號
<LineSymbolizer>
線符號
<LinePatternSymbolizer>
線圖案符號
<MarkersSymbolizer>
點符號
<ShieldSymbolizer>
盾牌符號
<PolygonSymbolizer>
面符號
<PolygonPatternSymbolizer>
面圖案符號
<TextSymbolizer>
文本符號
<RasterSymbolizer>
柵格符號
<BuildingSymbolizer>
建築符號
指定渲染多邊形的僞3D效果,爲它們提供類似建築物的外觀
<GroupSymbolizer>
組符號
指定多個道路防護罩或其他標籤的渲染,組合後當成一個點對象對一個要素進行渲染。
<DebugSymbolizer>
調試符號

補充:
在這裏插入圖片描述

Layer對象

圖層對象通過設置StyleName來引用Style。

屬性 說明
cache-features 默認爲off,設置這個參數爲on,當圖層有多個樣式附加到圖層上市將會觸發mapnik嘗試緩存這些要素到內存中。(mapnik>2版本生效)
clear-label-cache Default “off”. Setting this to “on” clears the internal placement detector list, causing the items of this layer, and from this layer on, to be rendered without taking previous rendered items into account (‘clear collision avoidance list’)
minzoom 最小縮放級別,默認0.0
maxzoom 最大縮放級別,默認1.797693134862316e+308
name 圖層的名稱
srs 默認繼承自Map.srs。引用Proj.4格式的座標系,例如 +proj=latlong +datum=WGS84
status 狀態,默認是on,on代表打開圖層,off代表關閉圖層。也可以是0和1
title 默認爲""
queryable 默認 false

子節點:

子節點名稱 說明
<Datasource> 要渲染的數據源
<StyleName> 定義的樣式的名字,必須包含與Style.name屬性完全相同的字符串。

DataSource對象

屬性 說明
name 數據源模板的名稱
base 指定繼承的數據源模板
type 支持的類型有:
shape: ESRI shapefile
postgis: Postgis table or query
pgraster: Postgis table or query (containing or returning raster)
raster:Tiled or stripped TIFF
gdal: GDAL supported raster dataset (not build by default)
ogr:OGR supported vector datasource (not build by default)
osm: OpenStreetMap (not build by default)
estimate_extent boolean,告訴Mapnik估計圖層的範圍(true)或(false)
extent 如果estimate_extent設置爲false,請手動輸入範圍。

base:

<Map>
  <Datasource name="shapes">
   <Paramaeter name="base">/home/foo/shapes</Parameter>
  </Datasource>
  <Layer name="lay">
    <Datasource base="shapes">
      <Parameter name="file">places</Parameter>
    </Datasource>
  </Layer>
</Map>

XML符號配置

PointSymbolizer(點符號)

使用png,tiff,svg圖形符號來渲染點。可以使用ShiedSymbolizer將文本標籤和圖形符號組合起來。如果你想改變符號的offset(偏移量)請使用MarkerSymbolizer
在這裏插入圖片描述

屬性 說明
file
文件
圖片路徑
width
(removed)
默認4px
height
(removed)
默認4px
type
(removed)
png tiff svg 默認值none
allow-overlap
允許重疊
允許文本和點圖片疊加,true/false,默認值false
opacity
不透明度
0.0 - 1.0
transform
轉換
SVG transform
ignore-placement
允許後面的點/盾牌符號疊加此符號。默認值false
comp-op Compositing,默認值none

LineSymbolizer(線符號)

屬性 說明
stroke 線的顏色,CSS顏色,比如‘green’#A3D979,默認值爲black
stroke-width 線的寬度,單位是像素,默認是1.0
stroke-opacity 線不透明度,0代表完全透明,1代表不透明,.5代表50%透明
stroke-linejoin miter(尖角)、round(圓角)、bevel(斜角),默認值爲miter
stroke-linecap round(向線條的每個末端添加圓形線帽)、butt(向線條的每個末端添加平直的邊緣)、square(向線條的每個末端添加正方形線帽),默認值是butt
stroke-dasharray 一對長度值[a,b],其中(a)是短劃線長度,(b)是間隙長度。也支持兩個以上的值(例如,不是用筆劃開始線,而是用間隙開始)。
comp-op Compositing
smooth 值在0.0-1.0之間。1表示完全平滑的線,0表示沒有變化。默認是值0.0

LinePatternSymbolizer(線圖案符號)

指定重複的png,tiff或svg符號的渲染以創建一條線,如下圖所示的懸崖。
在這裏插入圖片描述

屬性 說明
file 圖片文件的路徑,默認爲none,要求mapnik>=2.0
base base path where to search for file
width
(removed)
默認4px
height
(removed)
默認4px
type
(removed)
png tiff,默認none
comp-op Compositing

MarkersSymbolizer

指定將tiff,png或svg圖像渲染爲方向標記。可以用作PointSymbolizer的替代方案,以更好地控制圖像的定位。
在這裏插入圖片描述

屬性 說明
allow-overlap 允許符號疊加其它符號,默認是false
spacing 點與點之間的間隔距離,默認是100pixel
max-error 標記可以從指定位置移動以避免碰撞的最大量。該值是“間隔”的一部分,例如spacing = 100,max_error = 0.2然後標記可以移動的最大值是20像素,如果這還不夠,則根本不繪製
file 用於標記的SVG文件
transform SVG transform
opacity 不透明度,默認1.0
fill 點符號填充顏色,比如#FFFFFF,默認是blue
stroke 外邊線顏色,CSS顏色 - 顏色值,例如“green”或#A3D979。默認值是black
stroke-width 外邊線寬度
stroke-opacity 外邊線不透明度
width 標記像素的寬度,默認10px
height 標記像素的高度,默認10px
placement “point”, “interior”(內部), “line”, “vertex-first” (mapnik >= 3), “vertex-last” (mapnik >= 3)。
默認值:line (mapnik <=2.0.x) point (mapnik >= 2.1)
ignore-placement “true” or “false”,默認false
marker-type “arrow”(箭頭) “ellipse”(橢圓)
默認值:“arrow” if line placement, “ellipse” if point placement

ShieldSymbolizer(盾牌符號)

指定在某一點渲染png,tiff或svg圖形符號和標籤文本。
實際上,這是TextSymbolizer和PointSymbolizer的(工作)組合。如果您嘗試分開使用TextSymbolizerPointSymbolizer,您將經常看到沒有文本的點和/或沒有點的文本。
在這裏插入圖片描述
支持TextSymbolizer的所有配置選項,一下是額外的配置選項。

屬性 說明
base 基本符號模板
file 用於盾牌背景的文件
opacity 用於盾牌的圖像的不透明度,默認1
text-opacity 放置在盾牌頂部的文字的不透明度
unlock-image 如果爲true,盾牌圖像不會移動,默認爲false
shield-dx 盾牌圖像和文字的水平偏移量,默認爲0
shield-dy 盾牌圖像和文字的垂直偏移量,默認爲0
transform Transform image

base
Add <FileSource name="foo">/home/bar/baz/</FileSource> to the beginning of your stylesheet and then use <ShieldSymbolizer base="foo" name="bridge" /> to refer to /home/bar/baz/bridge.
dx,dy
dx,dy僅用來移動文本,對shield無效。

屬性 說明
shield-dx
shield-dy
Move shield only
dx,dy With unlock_image = true: move text only.
With unlock_image = false: move text and shield
unlock_image True: Shield base point is always the input line/point (usecase: labeling bus stations).
False: Shield base point is the center of the text (i.e. depends on dx,dy,vertical-alignment, horizontal-alignment) (usecase: highway shields)

placement
placement =“line”僅表示ShieldSymbolizer沿着一條線放置,而對於TextSymbolizer,它也會旋轉文本。添加spacing參數以使ShieldSymbolizer沿線重複,否則placement =“line”placement =“point”將看起來相同

PolygonSymbolizer(面填充符號)

屬性 說明
fill css顏色,默認是“grey”,填充顏​​色以指定多邊形,默認爲rgba(128,128,128,1),表示灰色且完全不透明(alpha = 1),與rgb(128,128,128)相同。
fill-opacity 多邊形的不透明度(指定alpha的另一種方法)。可與rgba顏色組合使用,並將與顏色的現有alpha分量相乘
gamma 0.0-1.0之間,多邊形邊緣的抗鋸齒級別 - 基本上是伽瑪1(默認)意味着完全抗鋸齒,而較小的伽瑪降低了抗鋸齒級別,導致更多鋸齒狀的多邊形邊緣。如果您希望背景顏色不“透過”,則可能需要降低伽馬值。
comp-op Compositing

PolygonPatternSymbolizer(面圖案填充符號)

渲染由多邊形包圍的區域,用重複的tiff,png或svg圖像填充它。PolygonSymbolizer的替代方案。
在這裏插入圖片描述

屬性 說明
file 圖片文件的路徑,默認爲none
width
(removed)
默認4px
height
(removed)
默認4px
type
(removed)
png tiff,默認none
comp-op Compositing

TextSymbolizer

RasterSymbolizer

BuildingSymbolizer

渲染多邊形的僞3D效果,爲它們提供類似建築物的外觀。
在這裏插入圖片描述

屬性 說明
fill css colour,默認gray
fill-opacity 填充不透明度,默認值爲1.0
height float (static value or expression)
<BuildingSymbolizer fill="#000000" height="8" fill-opacity="1" /

Height表達式:

<BuildingSymbolizer fill="#000000" height="[height_db]" fill-opacity="1" />

GroupSymbolizer

DebugSymbolizer(略)

示例

  1. 面符號疊加標註
    在這裏插入圖片描述
    <PolygonSymbolizer fill="#FF00FF" fill-opacity="0.5"/>
    <LineSymbolizer stroke-width=".5" stroke="#FFFF00"/>
    <TextSymbolizer face-name="Unifont Medium" fill="black" placement="interior" size="20">[f_name]</TextSymbolizer>
    
  2. 麪條件渲染,如下我對面圖層定義了三個過濾條件gid>=0,gid>=20,gid>=50,然後疊加了外邊線和文本標註符號。
    在這裏插入圖片描述
    <Style name="t_201906111017107533">
         <Rule>
             <Filter>[gid]&gt;=0</Filter>
             <PolygonSymbolizer fill="#00FFFF" />
         </Rule>
         <Rule>
             <Filter>[gid]&gt;=20</Filter>
             <PolygonSymbolizer fill="#97a9e9"/>
         </Rule>
         <Rule>
             <Filter>[gid]&gt;=50</Filter>
             <PolygonSymbolizer fill="#f0aaf0"/>
         </Rule>
         <Rule>
             <LineSymbolizer stroke-width=".5" stroke="#FFFF00"/>
             <TextSymbolizer face-name="Unifont Medium" fill="black" placement="interior" size="20">[f_name]</TextSymbolizer>
         </Rule>
     </Style>
    

PostGIS配置

PostGIS配置優化

  1. Datasource那塊的table參數使用查詢而不是表名,不要將所有的列都查詢出來
    這種方式會查詢所有的列

    <Parameter name="table">planet_osm_point</Parameter>
    

    查詢需要的列,減少查詢列的數量

    (select way,place from planet_osm_point where place is not null) as foo
    
  2. 控制要遍歷查詢行的數量,可以設置過濾條件

     <Parameter name="table">(select * from planet_osm_point where place is not null) as foo</Parameter>
    

    如果你指向渲染rivers, canals, drains, and streams

    (SELECT * from planet_osm_line where waterway in ('river','canal','drain','stream')) as foo
    

    如果你指向渲染road tunnels

    (SELECT * from planet_osm_line where highway is not null and tunnel in ('yes','true','1')) as foo
    
  3. 將Filtering過濾條件移動到PostGIS的where語句中

  4. 簡化過濾條件,優化SQL

  5. 創建索引
    創建索引可以使查詢更快

     CREATE INDEX idx_buildings_the_geom ON buildings USING gist(the_geom);
    

    如果過濾或者排序指定的字段,可以堆這個字段配置索引

     CREATE INDEX idx_buildings_code ON buildings USING btree(code);
    
  6. Use asynchronous PostGIS datasource

  7. 一般的Postgresql保持數據庫優化。
    你應該打開autovacuum。如果您有正在更新的數據源(例如OpenStreetMap數據),則需要定期對數據庫進行ANALYZEREINDEX。您應該不時運行此SQL命令維護

    ANALYZE; REINDEX;
    

    根據您的需要,您可能還希望定期對數據進行CLUSTER

  8. 使用extent參數
    如果沒有設置extent參數,mapnik執行查詢的sql大概如下:

    SELECT ST_XMin(ext),ST_YMin(ext),ST_XMax(ext),ST_YMax(ext)
    FROM (SELECT ST_Extent(geom) as ext from planet_osm_line) as tmp
    

    這回導致每次查詢都會去數據庫中從整個結果中遍歷查詢。有三個參數可以避免整個問題:
    extent_from_subquery

    <Parameter name="extent_from_subquery">true</Parameter>
    

    優點:準確估計範圍
    缺點:性能僅在小結果集上獲得
    先決條件:

    • table參數使用子查詢(而不是隻是用一個表名)
    • extent參數沒有設置
    • estimate_extent參數沒有設置成false

    extent

    <Parameter name="extent">-20037508,-19929239,20037508,19929239</Parameter>
    

    優點:沒有數據庫開銷
    缺點:

    • 如果源數據的更改影響範圍,則需要更新XML
    • 精度較低 - 不好因爲[我不知道 - 與裁剪計算有關嗎?]

    覆蓋如下參數:

    • extent_from_subquery
    • estimate_extent

    estimate_extent

    <Parameter name="estimate_extent">true</Parameter>
    

    優點:比不設置任何範圍參數更快;對於大型結果集顯着
    缺點:對於PostgreSQL> = 8.0.0統計數據由VACUUM ANALYZE收集,結果範圍將是實際數據的95%
    覆蓋如下參數:extent_from_subquery

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章