关闭

使用hstore实现OpenStreetMap瓦片汉化

标签: 服务器osmpostgresqlhstore汉化
1140人阅读 评论(0) 收藏 举报
分类:

关注并把玩OpenStreetMap也有一段时间了,准确说,快10年了吧。仅仅是把玩而已,从来没有认真学习过里面的数据结构与完整的技术工具链。就着2018年元旦的契机,我的ArchLinux Openstreetmap服务器要导入近期的数据,再一次遇到了汉化的问题。这一次,不准备用过时的地名大字典来匹配了。本来尝试了几个著名的web翻译引擎,不过发现现有的翻译引擎,对万国地名文字的适配性真的一般——最后的选择,就是考察一下OpenStreetMap官方的国际化选项:name:字段。

0.Name字段

在OpenStreetMap官网,使用“这是哪里”的功能,可以看到一些地标的多国语言表述,如下图:
国际化
OpenStreetMap国际化支持见:国际化支持的具体内容
大约在2013年以前,使用官方的 name:local 选项进行汉化的地标数量非常少,主要就是一些关键的地标。2018年,再次使用hstore选项导入多国地名,惊喜的发现经过这么多年的发展,地名的国际化程度已经有了显著提高,特此记录。

1. 导入数据

为了在数据库中保留各种语言的地名,–hstore选项是必须的。

osm2pgsql -c -s --unlogged -S"/home/archosm/osmstyle/openstreetmap-carto/openstreetmap-carto.style" -C24000 -dgis --drop --hstore --flat-nodes "./flat_node" /path/to/planet.pbf

主要关键选项:
–hstore 导入tags列,这列里面用哈希键值存储了额外的信息,包括name:fr等字段。
-c 删除原有数据表,创建新表
-s slim模式,在内存少于64GB时必须选择这个模式。
–unlogged 不采用日志系统,直接导入。能够显著提高导入速度,并且对一次性导入来说,不存在数据不完整的风险。断电了?重来一次即可。
-C24000 缓存大小,设置为物理内存50%。我的物理内存48GB,给了24GB。给的太大,会发生swap,得不偿失。
–drop 导入完毕后,删除中间表。这将继续节省大量时间与空间。由于我们不做实时热同步,那些用于增量导入的表(nodes等)都不需要。
–flat-nodes “./flat_node” 用一个二进制文件而非数据库来缓存节点。这进一步提高了速度。把这个缓存与数据库表空间设置在两块SSD上,可以最大程度的分散IO压力。

采用这些策略后,花了20小时,便导入了2017年12月18日的完整镜像(39GB PBF)。

2. 汉化数据

(1)为4个表格建立备份字段

由于汉化会修改name字段,我们要建立两个字段用于存放备份信息。即存放纯中文信息的字段trans_name_chs ,存放原始信息的字段raw_name.

    ALTER TABLE public.planet_osm_line ADD COLUMN trans_name_chs character varying(255);
    ALTER TABLE public.planet_osm_point ADD COLUMN trans_name_chs character varying(255);
    ALTER TABLE public.planet_osm_polygon ADD COLUMN trans_name_chs character varying(255);
    ALTER TABLE public.planet_osm_roads ADD COLUMN trans_name_chs character varying(255);
    ALTER TABLE public.planet_osm_line ADD COLUMN raw_name character varying(255);
    ALTER TABLE public.planet_osm_point ADD COLUMN raw_name character varying(255);
    ALTER TABLE public.planet_osm_polygon ADD COLUMN raw_name character varying(255);
    ALTER TABLE public.planet_osm_roads ADD COLUMN raw_name character varying(255);

(2)使用hstore中的中文汉化

汉化的原理就是把含有中文标记的记录“name”字段更新为中文+原文的形式。

    update planet_osm_line set name = name ||' (' ||  (tags->'name:zh' ) || ')', raw_name = name,  trans_name_chs = (tags->'name:zh' )  
        where tags->'name:zh' is not null and  tags->'name:zh'!= name and raw_name is null and trans_name_chs is null;
    update planet_osm_point set name = name ||' (' ||  (tags->'name:zh' ) || ')', raw_name = name,  trans_name_chs = (tags->'name:zh' )  
        where tags->'name:zh' is not null and  tags->'name:zh'!= name and raw_name is null and trans_name_chs is null;
    update planet_osm_polygon set name = name ||' (' ||  (tags->'name:zh' ) || ')', raw_name = name,  trans_name_chs = (tags->'name:zh' )  
        where tags->'name:zh' is not null and  tags->'name:zh'!= name and raw_name is null and trans_name_chs is null;
    update planet_osm_roads set name = name ||' (' ||  (tags->'name:zh' ) || ')', raw_name = name,  trans_name_chs = (tags->'name:zh' )   
        where tags->'name:zh' is not null and  tags->'name:zh'!= name and raw_name is null and trans_name_chs is null;

(3)建立索引

为了后续使用字典进行进一步汉化,创建索引。

    CREATE INDEX   ON public.planet_osm_line (name ASC ) where name is not null;
    CREATE INDEX   ON public.planet_osm_point (name ASC ) where name is not null;
    CREATE INDEX   ON public.planet_osm_roads (name ASC ) where name is not null;
    CREATE INDEX   ON public.planet_osm_polygon (name ASC) where name is not null;
    CREATE INDEX   ON public.planet_osm_line (trans_name_chs ASC ) where trans_name_chs is not null;
    CREATE INDEX   ON public.planet_osm_point (trans_name_chs ASC ) where trans_name_chs is not null;
    CREATE INDEX   ON public.planet_osm_roads (trans_name_chs ASC ) where trans_name_chs is not null;
    CREATE INDEX   ON public.planet_osm_polygon (trans_name_chs ASC) where trans_name_chs is not null;

3.查看效果

重新渲染后,发现效果棒极啦!

(1 )中东地名

这里写图片描述

(2)韩国地名

这里写图片描述

4. 资源链接

还是类似从前,我们的树莓派缓存已经更新啦!
树莓派演示缓存
当然,服务器镜像依旧可以从云盘下载。

该版本中,PostgreSQL升级到10.1,Qt升级到5.10.

1
1
查看评论

ArchLinux Openstreetmap 瓦片数字高程服务器演示网址变更解释

为遵守80端口向外提供Web业务必须申领许可证要求,现取消原有演示网址的80端口直接访问,改为8088端口。地址:http://www.goldenhawking.org:8088,服务器镜像仍旧可以从百度云盘下载。 OpenStreetMap 是一款由网络大众打造的开源地图服务。OpenStr...
  • goldenhawking
  • goldenhawking
  • 2017-08-22 21:08
  • 1280

OpenStreetMap(osm) Google 瓦片计算规则探究

OpenStreetMap(osm):位置坐标经纬度(x,y) 转化为以(180,90n)为原点的新坐标度数。 设为X,Y [z,x,y] = [缩放级别,floor(X*2^2/360度),floor(X*2^2/180度)] [z,x,y]即为瓦片坐标google mapgoogle瓦片相...
  • lxxlxx888
  • lxxlxx888
  • 2016-07-13 15:01
  • 1212

OpenStreetMap Google 百度 Bing arcgis瓦片地图服务(TMS)以及瓦片计算

开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) -----------------------...
  • lxxlxx888
  • lxxlxx888
  • 2016-07-13 14:35
  • 2596

Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(5) 小结

非计算机专业的工程师们大量使用本地开发工具,在不同的领域创造价值。与前端工程师不同,OpenStreetMap 对应的Web前端对他们是陌生的。 一直以来想利用业余时间做这样一个工具,使得非计算机专业的工程师们可以拥有一款支持漫游、标图、动画效果的轻量级地理信息插件,特别是掌握C++、C#等本...
  • goldenhawking
  • goldenhawking
  • 2016-03-11 23:34
  • 2255

ArchLinux-- OpenStreetMap瓦片服务器的新宿主

ArchLinux是近年来比较火的Linux滚动更新发行版。经过近一年多的测试、实验,笔者认为,ArchLinux尽管在许多地方略显激进,但仍旧适合做OpenStreetMap瓦片渲染服务器使用。这里,和大家分享一下收获。 配置好的镜像文件可从 百度云盘下载7Z压缩包。该镜像已经对地名进...
  • goldenhawking
  • goldenhawking
  • 2017-01-21 13:26
  • 930

一种不太完善的OpenStreetMap字典汉化方法

根据世界地名词典,对OpenStreetMap进行汉化,使用了下面的代码。不太完善,这里仅贴出来。 地名字典在我的资源世界地名大词典下载。
  • goldenhawking
  • goldenhawking
  • 2017-08-14 09:20
  • 465

ios地图开发之-OpenStreetMap基础教程

【注意】由于OpenStreetMap此类教程在国内不太多,本文是本人花费多日通过一些国外网站论坛总结所得,如要转载,请保留文章出处,尊重一下作者,谢谢。 开端 本文皆在指引大家在自己的项目里嵌入OpenStreetMap,并可以在地图上添加覆盖物、折线等常用地图功能。 1.0 AP...
  • mad1989
  • mad1989
  • 2013-08-03 19:19
  • 13073

Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(0)-引子

OpenStreetMap一般是使用Web服务发布瓦片和矢量数据的。本系列博文主要演示如何使用Qt 搭建一个简单的OpenStreetMap瓦片客户端,实现以下功能: 1、OpenStreetMap 服务器瓦片的自动下载与本地缓存。 2、基于Qt插件的接口开发技术,实现高度可扩展的图层。提供两个...
  • goldenhawking
  • goldenhawking
  • 2016-01-16 22:57
  • 2484

国内主要地图瓦片坐标系定义及计算原理

国内主要地图瓦片坐标系定义及计算原理   作者 CntChen 关注 2016.05.10 20:05* 字数 3144 阅读 1571评论 0喜欢 9 本文将介绍瓦片坐标相关知识,并提供高德地图、百度地图、谷歌地图的经纬度坐标与瓦...
  • madrabbit1987
  • madrabbit1987
  • 2017-03-03 10:06
  • 1002

如何在GeoServer中使用OpenStreetMap数据

转自:http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/ OpenStreetMap is a free and editable map of the world. ...
  • cnhome
  • cnhome
  • 2012-08-06 16:22
  • 2517
    个人资料
    • 访问:351897次
    • 积分:4821
    • 等级:
    • 排名:第7058名
    • 原创:98篇
    • 转载:3篇
    • 译文:0篇
    • 评论:338条
    最新评论