[Talk-TW] 使用 Mapnik 處裡非英文的繪圖
Louis Liu
pttdog at gmail.com
Sat Feb 23 04:14:13 UTC 2013
Hi 各位,
之前處理過如何製作中文的OSM地圖,大家可以在 openstreetmap.tw 上看到
但是採取的方法還蠻惡搞的,是在將地圖資料匯入資料庫前,先用字串取代的方式將name:zh 標籤的內容取代 name 的內容(如果有 name:zh
的話)
這個方法最大的問題在於沒有辦法同時顯示中文和英文
如果要再顯示其他語言的話,資料庫要有多份重複的資料,這些資料只有 name 標籤不同而已
後來找到方法了
osm2pgsql 會先讀取 default.style,決定哪些標籤要用什麼樣的形式放入資料庫中
所以只要在 default.style 有以下的內容,就可以讓多種語言的 name 可以同時存在資料庫中
node,way name text linear
node,way name:zh text linear
然後 mapnik 的 style sheet 作兩處修改,第一部分是修改各個 layer 的資料來源,要改 SQL 語法
<Layer name="placenames-small" status="on" srs="&osm2pgsql_projection;">
<StyleName>suburb</StyleName>
<StyleName>village</StyleName>
<StyleName>hamlet</StyleName>
<Datasource>
<Parameter name="table">
(select way,place,name,name:zh
from &prefix;_point
where place in
('suburb','village','large_village','hamlet','locality','isolated_dwelling','farm')
) as placenames</Parameter>
&datasource-settings;
</Datasource>
</Layer>
注意,冒號是 XML 中的特殊字元
另外一個部分是各個 style 的部份,要把 name 替換成 name:zh
但是現在有些資料並不是每個都有 name:zh 標籤,所以這裡會比較複雜一些
<Style name="hamlet">
<Rule>
<Filter>([place] = 'hamlet' or [place] = 'locality' or [place] =
'isolated_dwelling' or [place] = 'farm') and [name:zh] <> '' </Filter>
&maxscale_zoom14;
&minscale_zoom15;
<TextSymbolizer size="8" fill="#000" fontset-name="book-fonts"
halo-radius="1" wrap-width="0">[name:zh]</TextSymbolizer>
</Rule>
<Rule>
<Filter>([place] = 'hamlet' or [place] = 'locality' or [place] =
'isolated_dwelling' or [place] = 'farm') and [name:zh] == '' </Filter>
&maxscale_zoom14;
&minscale_zoom15;
<TextSymbolizer size="8" fill="#000" fontset-name="book-fonts"
halo-radius="1" wrap-width="0">[name]</TextSymbolizer>
</Rule>
兩條 Rule 分別處理有 name:zh 和僅有 name:zh 的狀況,為了排版的美觀,可以中、英文設定不同字型
比較麻煩的事情是.. mapnik style sheet 設定 name 標籤的地方有非常多處,也許要用程式自動化產生
因為這個問題還有沒有解決,所以 openstreetmap.tw 上的繪圖系統還沒有修改
一點點心得和大家分享,歡迎大家提出意見和看法
Happy Mapping,
Louis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/talk-tw/attachments/20130223/5af6485d/attachment.html>
More information about the Talk-TW
mailing list