[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