資源
基礎
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> 屬性過濾條件 |
支持比較運算符:大於> 、大於等於>= ,小於< ,小於等於<= ,等於= 。支持邏輯運算符: and 、or 、not 支持正則匹配, .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 shapefilepostgis : Postgis table or querypgraster : Postgis table or query (containing or returning raster)raster :Tiled or stripped TIFFgdal : 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的(工作)組合。如果您嘗試分開使用TextSymbolizer
和PointSymbolizer
,您將經常看到沒有文本的點和/或沒有點的文本。
支持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(略)
示例
- 面符號疊加標註
<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>
- 麪條件渲染,如下我對面圖層定義了三個過濾條件gid>=0,gid>=20,gid>=50,然後疊加了外邊線和文本標註符號。
<Style name="t_201906111017107533"> <Rule> <Filter>[gid]>=0</Filter> <PolygonSymbolizer fill="#00FFFF" /> </Rule> <Rule> <Filter>[gid]>=20</Filter> <PolygonSymbolizer fill="#97a9e9"/> </Rule> <Rule> <Filter>[gid]>=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配置優化
-
Datasource那塊的table參數使用查詢而不是表名,不要將所有的列都查詢出來
這種方式會查詢所有的列<Parameter name="table">planet_osm_point</Parameter>
查詢需要的列,減少查詢列的數量
(select way,place from planet_osm_point where place is not null) as foo
-
控制要遍歷查詢行的數量,可以設置過濾條件
<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
-
將Filtering過濾條件移動到PostGIS的where語句中
-
創建索引
創建索引可以使查詢更快CREATE INDEX idx_buildings_the_geom ON buildings USING gist(the_geom);
如果過濾或者排序指定的字段,可以堆這個字段配置索引
CREATE INDEX idx_buildings_code ON buildings USING btree(code);
-
一般的Postgresql保持數據庫優化。
你應該打開autovacuum
。如果您有正在更新的數據源(例如OpenStreetMap數據),則需要定期對數據庫進行ANALYZE
和REINDEX
。您應該不時運行此SQL命令維護ANALYZE; REINDEX;
根據您的需要,您可能還希望定期對數據進行
CLUSTER
。 -
使用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