使用hstore实现OpenStreetMap瓦片汉化
关注并把玩OpenStreetMap也有一段时间了,准确说,快10年了吧。仅仅是把玩而已,从来没有认真学习过里面的数据结构与完整的技术工具链。就着2018年元旦的契机,我的ArchLinux Openstreetmap服务器要导入近期的数据,再一次遇到了汉化的问题。这一次,不准备用过时的地名大字典来匹配了。本来尝试了几个著名的web翻译引擎,不过发现现有的翻译引擎,对万国地名文字的适配性真的一般——最后的选择,就是考察一下OpenStreetMap官方的国际化选项:name:字段。 0.Name字段在OpenStreetMap官网,使用“这是哪里”的功能,可以看到一些地标的多国语言表述,如下图: 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
主要关键选项: 采用这些策略后,花了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' ) || ')',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' ) || ')',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' ) || ')',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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |