生活随笔
收集整理的這篇文章主要介紹了
linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對萬國語的地名進行翻譯和檢索
經過 前三篇的調試,已經有了一個完整的Map可以瀏覽,我們痛苦的世界范圍數據下載、導入過程也結束了。要提醒一下的是,鑒于網速,不要下載 planetosm.lastest 文件,因為這個文件每周更新,萬一一周下不完,就over了。
當然了,導入后,別忘了?
[plain] ?view plain?copy
sudo?touch?/var/lib/mod_tile/planet-import-complete?? sudo?chown?www-data?/var/lib/mod_tile/planet-import-complete?? 設置時間戳哦!
?? 導入后,只有中國、日本有些中文字符,其他國家都是鳥語,必須進行漢化。用PostgreSQL count 一下,name 字段不為null 的條目太多了,利用在線的翻譯API似乎不現實。我們通過下載字典來進行本地自動匹配與翻譯。字典在http://download.csdn.net/detail/goldenhawking/4556453, 導入后,含有17萬個地名翻譯的表如下面所示
由于place_name 里的地名有不規范的表示,比如括號中的曾用名、用逗號分隔的等效名等情況,不能直接把地名表與planet_osm_roads 、planet_osm_polygon 、planet_osm_line、planet_osm_point 四張表的name字段做 like 或者 = 的換算。同樣,即使是做正則式的匹配,也要考慮到比如?? XXXX 與 XX'XX (YYYY) 的情況,即原本地名已經包含阿拉伯語與英語兩種語言的情況。
?? 為此,寫一個程序,進行匹配,提前把地名進行標準化。其算法過程是:
?? 讀取planet_osm_roads 、planet_osm_polygon 、planet_osm_line、planet_osm_point四張表里? name is not null 并多于1個字符的地名,進行簡化,清除括號、非拉丁、斯拉夫字符,而后與經過規范化的 place_name 進行匹配。為了存儲獨立的中文字段,在四張表尾部追加了一個trans_name_chs的 text 字段,以便存儲純粹的中文地名,供搜索用。
[sql] ?view plain?copy
ALTER ?TABLE ?planet_osm_point?ADD ?COLUMN ?trans_name_chs?text;??ALTER ?TABLE ?planet_osm_line?ADD ?COLUMN ?trans_name_chs?text;??ALTER ?TABLE ?planet_osm_polygon?ADD ?COLUMN ?trans_name_chs?text;??ALTER ?TABLE ?planet_osm_roads?ADD ?COLUMN ?trans_name_chs?text;?? ?算法偽代碼表示:
??
[cpp] ?view plain?copy
void ?Match(unicode?TableName)??{?? ????for_each?(record?in?TableName?where?長度>3)?? ????{?? ????????unicode?地名?=?record->name;?? ????????//清除首尾空格?? ????????TrimSpaces(地名);?? ?? ????????//只保留兩類字符,根據字符的unicode取值范圍篩選?? 10. ????????unicode?詞干?=?FilterChar?(地名,?new ?LanguageFilter({拉丁,斯拉夫}));?? 11. ?? 12. ????????//在翻譯表中查找可能的翻譯?? 13. ????????????unicodeList?可能結果集?=?DatabaseSearch("規范化詞干表","like?%s%",詞干);?? 14. ??????????? 15. ????????//對所有含有詞干的可能結果,進行相似度排序,這里的策略是看看長度比例因子,?? 16. ????????//比如??Shanghai?與??Shanghai?City?為?8:13,?與Shanghai?為?1:1?,因此取?Shanghai?? 17. ?? 18. ????????unicode?最佳解=null;?? 19. ????????double ??最佳因子=0;?? 20. ?? 21. ????????????for_each?(unicode?可能解?in?可能結果集?where?length(詞干)/length(可能解)>0.6)?? 22. ????????{?? 23. ????????????double ?當前因子?=?length(詞干)/length(可能解);?? 24. ????????????if ?(當前因子>最佳因子)?? 25. ????????????{?? 26. ????????????????最佳解?=?可能解;?? 27. ????????????????最佳因子?=?當前因子;?????? 28. ????????????????if ?(最佳因子?==?1)?? 29. ????????????????????break ;?? 30. ????????????}?? 31. ????????}?? 32. ?????? 33. ????????//刷新數據庫?? 34. ????????if ?(最佳因子?>0)?? 35. ????????{?? 36. ????????????unicode?翻譯結果?=?最佳解?+?"("?+?地名?+?")";?? 37. ????????????UpdateTable(TableName,?record->id,?翻譯結果);?? 38. ????????}?? 39. ????}????? 40. }??
匹配過程大概需要1-2天,匹配完成后,翻譯好的地名便存入了name字段中。渲染瓦片,看一看,主要的地名都OK啦
德國的
?
最后,為這些字段建立索引
[sql] ?view plain?copy
CREATE ?INDEX ?idx_planet_osm_roads_name?ON ?planet_osm_roads?USING?btree?("name")?where ?name ?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_roads_trans_name_chs?ON ?planet_osm_roads?USING?btree?("trans_name_chs")?where ?trans_name_chs?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_polygon_name?ON ?planet_osm_polygon?USING?btree?("name")?where ?name ?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_polygon_trans_name_chs?ON ?planet_osm_polygon?USING?btree?("trans_name_chs")?where ?trans_name_chs?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_line_name?ON ?planet_osm_line?USING?btree?("name")?where ?name ?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_line_trans_name_chs?ON ?planet_osm_line?USING?btree?("trans_name_chs")?where ?trans_name_chs?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_point_name?ON ?planet_osm_point?USING?btree?("name")?where ?name ?is ?not?null;??CREATE ?INDEX ?idx_planet_osm_point_trans_name_chs?ON ?planet_osm_point?USING?btree?("trans_name_chs")?where ?trans_name_chs?is ?not?null;?? 全部搞定后,vacuum 一下,索引就可以立刻參與查詢了,而且使用 FCGI 實現地名的檢索就變得簡單了。這里為了測試,直接用C寫CGI程序。
程序實現兩個功能,一個是根據地名檢索旁邊的GIS對象,另一個是根據坐標檢索最近的地名。這里用到 PostGIS的 CoverBy 系列函數.? CGI代碼:
略
轉載:http://blog.csdn.net/goldenhawking/article/details/7952303
轉載于:https://www.cnblogs.com/BigFishFly/p/6337361.html
總結
以上是生活随笔 為你收集整理的linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索): 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。