对万国语的地名进行翻译和检索

经过 前三篇的调试,已经有了一个完整的Map可以浏览,我们痛苦的世界范围数据下载、导入过程也结束了。要提醒一下的是,鉴于网速,不要下载 planetosm.lastest 文件,因为这个文件每周更新,万一一周下不完,就over了。

当然了,导入后,别忘了

[plain] view plain copy

  1. sudo touch /var/lib/mod_tile/planet-import-complete
  2. 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

  1. ALTER TABLE planet_osm_point ADD COLUMN trans_name_chs text;
  2. ALTER TABLE planet_osm_line ADD COLUMN trans_name_chs text;
  3. ALTER TABLE planet_osm_polygon ADD COLUMN trans_name_chs text;
  4. ALTER TABLE planet_osm_roads ADD COLUMN trans_name_chs text;

算法伪代码表示:

[cpp] view plain copy

  1. void Match(unicode TableName)
  2. {
  3. for_each (record in TableName where 长度>3)
  4. {
  5. unicode 地名 = record->name;
  6. //清除首尾空格
  7. TrimSpaces(地名);
  8. //只保留两类字符,根据字符的unicode取值范围筛选
  9. 10.         unicode 词干 = FilterChar (地名, new LanguageFilter({拉丁,斯拉夫}));
  10. 11.
  11. 12.         //在翻译表中查找可能的翻译
  12. 13.             unicodeList 可能结果集 = DatabaseSearch("规范化词干表","like %s%",词干);
  13. 14.
  14. 15.         //对所有含有词干的可能结果,进行相似度排序,这里的策略是看看长度比例因子,
  15. 16.         //比如  Shanghai 与  Shanghai City 为 8:13, 与Shanghai 为 1:1 ,因此取 Shanghai
  16. 17.
  17. 18.         unicode 最佳解=null;
  18. 19.         double  最佳因子=0;
  19. 20.
  20. 21.             for_each (unicode 可能解 in 可能结果集 where length(词干)/length(可能解)>0.6)
  21. 22.         {
  22. 23.             double 当前因子 = length(词干)/length(可能解);
  23. 24.             if (当前因子>最佳因子)
  24. 25.             {
  25. 26.                 最佳解 = 可能解;
  26. 27.                 最佳因子 = 当前因子;
  27. 28.                 if (最佳因子 == 1)
  28. 29.                     break;
  29. 30.             }
  30. 31.         }
  31. 32.
  32. 33.         //刷新数据库
  33. 34.         if (最佳因子 >0)
  34. 35.         {
  35. 36.             unicode 翻译结果 = 最佳解 + "(" + 地名 + ")";
  36. 37.             UpdateTable(TableName, record->id, 翻译结果);
  37. 38.         }
  38. 39.     }

40. }

匹配过程大概需要1-2天,匹配完成后,翻译好的地名便存入了name字段中。渲染瓦片,看一看,主要的地名都OK啦

德国的

最后,为这些字段建立索引

[sql] view plain copy

  1. CREATE INDEX idx_planet_osm_roads_name ON planet_osm_roads USING btree ("name") where name is not null;
  2. 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;
  3. CREATE INDEX idx_planet_osm_polygon_name ON planet_osm_polygon USING btree ("name") where name is not null;
  4. 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;
  5. CREATE INDEX idx_planet_osm_line_name ON planet_osm_line USING btree ("name") where name is not null;
  6. 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;
  7. CREATE INDEX idx_planet_osm_point_name ON planet_osm_point USING btree ("name") where name is not null;
  8. 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

linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):的更多相关文章

  1. linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):

    Postgresql配置及osm2pgsql原始数据导入 2012年,Ubuntu 12.04LTS发布,又一个长效支持版,我们又该更新OpenStreetMap服务器了,这次,将详细在博客中记录配置 ...

  2. linux环境下搭建osm_web服务器二(Mapnik及apache2mod_tile配置):

    Mapnik及apache2mod_tile配置 上一篇,我们配置好了PostgreSQL服务器,导入了测试数据.今天,我们来配置 mapnik2 + apache2 + mod_tile 的WMS服 ...

  3. linux环境下搭建osm_web服务器三(Openlays和slippymap):

    Openlays和slippymap 上一步,我们已经有了自己的地图瓦片服务器,现在,开始实现SlippyMap啦! <1>下载释放OpenLayers到 www文件夹 SlippyMap ...

  4. Windows和Linux环境下搭建SVN服务器

    --------------------------Windows下搭建SVN服务器----------------------------- 一.安装SVN服务端 软件包Setup-Subversi ...

  5. linux环境下搭建solr服务器--单机版

    前提需要在安装好jdk和tomcat,本人用的是jdk1.8+tomcat8.5+solr4.10. 第一步:安装linux.jdk.tomcat.(这步都是比较简单的,就不多说了) 第二步:把sol ...

  6. 在Linux 环境下搭建 JDK 和 Tomcat

      在Linux 环境下搭建 JDK 和 Tomcat 参考地址:http://www.cnblogs.com/liulinghua90/p/4661424.html   [JDK安装] 1.首先下载 ...

  7. ​Linux环境下搭建禅道管理工具-包含软件资源

    ​Linux环境下搭建禅道管理工具 1:百度云盘下载: 禅道--链接: https://pan.baidu.com/s/1Stu7nOZVIPO5TnpJWjWtiQ 提取码:dnik CentOs操 ...

  8. ubuntu 14.04LTS 环境下搭建tftp服务器

    花费我一整天的时间在 ubuntu 14.04LTS 环境下搭建tftp服务器,网上好多资料参差不齐,简单来说,TFTP(Trivial File Transfer Protocol),是一个基于UD ...

  9. freeSSHD在windows环境下搭建SFTP服务器

    freeSSHD在windows环境下搭建SFTP服务器 0 建议现在windows环境下安装cygwin,否则在windows环境下cmd模式使用不了sftp去连接,可以利用win scp去测试连接 ...

随机推荐

  1. C++直接初始化和复制初始化1

    这篇文章主要介绍了C++直接初始化与复制初始化的区别深入解析,是很多C++初学者需要深入了解的重要概念,需要的朋友可以参考下   C++中直接初始化与复制初始化是很多初学者容易混淆的概念,本文就以实例 ...

  2. 算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)

    题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4 ...

  3. scrapy_redis 实现多进程配置部分代码

    # 启用Redis调度存储请求队列SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 确保所有的爬虫通过Redis去重DUPEFILTE ...

  4. 1106 Lowest Price in Supply Chain

    题意:略 思路:寻找树的叶结点中深度最低的,记录最低深度minDepth和具有相同最低深度的结点个数cnt. 代码: #include <cstdio> #include <cmat ...

  5. CentOS6.4 上搭建NIS网络信息服务器

    NIS(Network Information Service)网络信息服务,主要功能是提供用户登录信息给客户端主机查询之用,用于企业局域网Linux主机账户的集中管理(非跨平台).NIS服务器在大型 ...

  6. 016:Explain

    一. Explain EXPLAIN 官方文档 1.explain说明 explain是解释SQL语句的执行计划,即显示该SQL语句怎么执行的 使用explain的时候,也可以使用desc 5.6 版 ...

  7. Windows下安装GCC

    1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...

  8. Entity Framework使用汇总

    EF的发展历程 还是先来说一下EF从诞生到现在这几年的发展历程吧.在EF最初的版本中,作为一个ORM组件其通过EDM文件(里面是一些xml)来配置数据库与实体类之间的映射,实现数据进出数据库的控制.最 ...

  9. supervisor+uwsgi+django遇到writing to a closed pipe/socket/fd解决

    原因: 最近开发的一个项目,由于有个更新job需要消耗的时间非常长,一度以为更新出现了错误. 经过: 于是打开debug模式测试, 异常开启,调试发现system返回了 writing to a cl ...

  10. awk查看接口耗时情况

    +1:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Ag ...