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代码:
略
linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):的更多相关文章
- linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):
Postgresql配置及osm2pgsql原始数据导入 2012年,Ubuntu 12.04LTS发布,又一个长效支持版,我们又该更新OpenStreetMap服务器了,这次,将详细在博客中记录配置 ...
- linux环境下搭建osm_web服务器二(Mapnik及apache2mod_tile配置):
Mapnik及apache2mod_tile配置 上一篇,我们配置好了PostgreSQL服务器,导入了测试数据.今天,我们来配置 mapnik2 + apache2 + mod_tile 的WMS服 ...
- linux环境下搭建osm_web服务器三(Openlays和slippymap):
Openlays和slippymap 上一步,我们已经有了自己的地图瓦片服务器,现在,开始实现SlippyMap啦! <1>下载释放OpenLayers到 www文件夹 SlippyMap ...
- Windows和Linux环境下搭建SVN服务器
--------------------------Windows下搭建SVN服务器----------------------------- 一.安装SVN服务端 软件包Setup-Subversi ...
- linux环境下搭建solr服务器--单机版
前提需要在安装好jdk和tomcat,本人用的是jdk1.8+tomcat8.5+solr4.10. 第一步:安装linux.jdk.tomcat.(这步都是比较简单的,就不多说了) 第二步:把sol ...
- 在Linux 环境下搭建 JDK 和 Tomcat
在Linux 环境下搭建 JDK 和 Tomcat 参考地址:http://www.cnblogs.com/liulinghua90/p/4661424.html [JDK安装] 1.首先下载 ...
- Linux环境下搭建禅道管理工具-包含软件资源
Linux环境下搭建禅道管理工具 1:百度云盘下载: 禅道--链接: https://pan.baidu.com/s/1Stu7nOZVIPO5TnpJWjWtiQ 提取码:dnik CentOs操 ...
- ubuntu 14.04LTS 环境下搭建tftp服务器
花费我一整天的时间在 ubuntu 14.04LTS 环境下搭建tftp服务器,网上好多资料参差不齐,简单来说,TFTP(Trivial File Transfer Protocol),是一个基于UD ...
- freeSSHD在windows环境下搭建SFTP服务器
freeSSHD在windows环境下搭建SFTP服务器 0 建议现在windows环境下安装cygwin,否则在windows环境下cmd模式使用不了sftp去连接,可以利用win scp去测试连接 ...
随机推荐
- jquery 操作单选按钮
<input type="radio" name="sex" value="男" />男 <input type=&quo ...
- GOF23设计模式之组合模式(composite)
一.组合模式概述 将对象组合成树状结构以表示“部分和整体”层次结构,使得客户可以统一的调用叶子对象和容器对象. (1)组合模式的使用场景 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统 ...
- cordova 安装使用
前人总结: Cordova是Apache软件基金会的一个产品.其前身是PhoneGap,由Nitobi开发,2011年10月,Adobe收够了Nitobi,并且PhoneGap项目也被贡献给Apach ...
- 学生选课数据库SQL语句练习题
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
- 配置PHP,Apache
安装完windows 2003 server以后,还是个裸机,在安装limesurvey总是会有些问题,还好,问题都解决了,下面讲下配置的步骤: 第一步:先装上apache服务 apache服务启动以 ...
- 【BZOJ】1926: [Sdoi2010]粟粟的书架(暴力+主席树)
题目 传送门:QWQ 分析 两道题目 第一问暴力预处理 用$ a[i][j][k] $和$ s[i][j][k] $ 表示从$ (1,1) $ 到 $ (i,j) $ 这个矩形中比k大的数的个数和这些 ...
- java实现时钟
package com.js.ai.modules.pointwall.testxfz; import java.awt.Color; import java.awt.Dimension; impor ...
- Clustering Factor——索引的成本指标
使用索引是我们面对海量数据搜索是一种常用的手段.通过有效的索引访问,可以使我们更快的访问到需要的数据,减少物理.逻辑IO,从而提高系统性能.在CBO时代,Oracle对于提交SQL的执行路径是有所选择 ...
- 给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组
Array.prototype.removeCount=function(){ var that=this; var arr=[]; for(var i=0;i<that.length;i++) ...
- <转>Python3.x和Python2.x的区别
这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和 ...