如何使用OSMFilter

问题描述

我面临的问题非常复杂。我使用OSM编辑器,可以在其中覆盖某些方式的属性。这些属性是称为“ maxspeed:backward”和“ maxspeed:forward”的标签。 有时我想用OSM官方数据(新道路,在建道路等)更新本地地图。
我想要的是将我的本地地图与官方osm合并,以使所有道路和节点都从官方来源进行更改,但保留带有编辑器值的标签。我使用Postgres DB,渗透(合并工具),osmfilter和osmconvert工具。

这是我发现的过程:
1。从编辑器中获取我的本地地图,并仅过滤出标签。没有节点,方式,关系。
2。取得官方OSM地图并仅过滤出标签(与步骤1相同)
3。将这些具有渗透作用的源与冲突结果策略合并-我的本地标签值覆盖正式的OSM映射。
4。再次获取OSM官方地图,但现在删除标签,因此我得到的全图没有正在使用的标签
5。将第3步的结果(正确的标签和值)与第4步的结果(无标签的官方地图)合并,并使用冲突结果策略-官方地图节点会覆盖我的本地节点。

我想要实现的是用我自己的标签查看最新的地图。
我在第1步中遇到问题。我可以从仅数据库标签中检索吗?没有任何节点或其他信息可以覆盖步骤5中的正式地图?我在DB标记中看到的内容放置在单独的表中,并且引用了way_id,因此,如果我将该值与另一个具有相同way_id的源合并。

我尝试使用osmfilter的是:
./osmfilter $EDITED_OSM_NAME --keep-tags="all maxspeed:backward= maxspeed:forward= maxspeed=" -o=$EDITED_OSM_TAGS
它可以正确过滤-只有列出的标签输出的pbf文件中,但是有没有任何节点,方式,关系等的可能性,可以检索它们吗?

我也尝试过使用
--drop-relations--drop-ways--drop-nodes--ignore-dependencies进行某些操作,但是它并没有达到我希望的方式。

谢谢您的帮助。

解决方法

也许我的答案对面临同样问题的任何人都是有价值的。
提醒一下,我想下载OSM官方地图,但保留本地信息(在我的情况下为maxspeed标签)。
我写的过程是这样的:

  1. 当我当前的更改保存在本地OSM编辑器中时,我直接在Postgres数据库上运行SQL脚本。该脚本将maxspeed表中的maxspedd:forwardmaxspeed:backwardway_tags中的所有标签导出到CSV文件。

CREATE TABLE IF NOT EXISTS temp_tags (LIKE way_tags);
ALTER TABLE temp_tags 
ADD COLUMN IF NOT EXISTS ah_edited boolean default TRUE;

ALTER TABLE way_tags
ADD COLUMN IF NOT EXISTS ah_edited boolean DEFAULT FALSE;


COPY 
  (SELECT DISTINCT ON(way_id,k)
  way_tags.way_id,way_tags.k,way_tags.v,way_tags.version,way_tags.ah_edited
  FROM way_tags
  JOIN ways ON way_tags.way_id = ways.way_id AND way_tags.version = ways.version
  JOIN changesets on ways.changeset_id=changesets.id
  JOIN users ON changesets.user_id=users.id
  WHERE (k like 'maxspeed:backward'
         OR k like 'maxspeed:forward'
         OR k like 'maxspeed')
  AND ((users.email like '%admin.com%' AND ways.changeset_id != 0)
        OR way_tags.ah_edited = TRUE)
  ORDER BY way_id,k,version desc)  TO STDOUT (format csv,delimiter ';',header false);

ALTER TABLE way_tags
DROP COLUMN IF EXISTS ah_edited;

DROP TABLE IF EXISTS temp_tags;

有些人可能会注意到,我使用了附加列ah_edited只是为了保留信息,该信息是我编辑过的信息,如果存在相同标签,则应该覆盖“世界”数据。
在OSM编辑器中执行SAVE之后,实际上我们保存了两个相同标签但版本不同并以changeset_id递增的副本-这就是为什么我要寻找具有该值!= 0的标签,并且使用DISTINCT ON函数返回更高的版本值(在我修改之后)。
因此,我得到了带有CSV标记的CSV文件,我希望将其保存在以后下载的地图中。

2)截断数据库
3)从geofabrik.de下载最新的地图版本
4)将地图上传到数据库

在此暂停一会儿
我们的数据可以分为两类->以某种方式全新的标签,并且已经存在于官方地图中,但我们的值应覆盖它们。因此,我将该过程分为两个部分。


5)将新值插入数据库 -将表格恢复为原始结构

ALTER TABLE way_tags
ADD COLUMN IF NOT EXISTS ah_edited boolean default FALSE;

--  Create temp table from CSV which holds pre-merge changes
CREATE TABLE IF NOT EXISTS temp_tags (LIKE way_tags);

COPY temp_tags(way_id,v,version,ah_edited) FROM '/home/map-data/exportedTags.csv'     (FORMAT csv,header false);

--  Add edidtion column to the way_tags and insert unique values which only AH added

INSERT INTO way_tags (way_id,ah_edited)
SELECT temp_tags.way_id,temp_tags.k,temp_tags.v,w.version,temp_tags.ah_edited  
FROM temp_tags 
FULL JOIN way_tags ON temp_tags.way_id = way_tags.way_id AND temp_tags.k like way_tags.k
JOIN ways w ON w.way_id = temp_tags.way_id
WHERE way_tags.way_id IS NULL;

--  DROP temp table from CSV which holds pre-merge changes
DROP TABLE public.temp_tags;

6)接下来,我们更新已经存在的值 如果不存在temp_tags,则创建表(类似于way_tags); ALTER TABLE temp_tags 如果不存在,则添加列ah_edited布尔默认为true;否则为false。
COPY temp_tags(way_id,ah_edited) FROM '/home/map-data/exportedTags.csv' (FORMAT csv,header false);

UPDATE temp_tags SET ah_edited= TRUE; 


--  Add edidtion column to the way_tags and insert unique values which only AH added

ALTER TABLE way_tags
ADD COLUMN IF NOT EXISTS ah_edited boolean default FALSE;

UPDATE way_tags 
SET v=csv_source.v,ah_edited = true
FROM  temp_tags csv_source 
WHERE csv_source.way_id = way_tags.way_id
AND csv_source.k like way_tags.k
AND csv_source.ah_edited = true;

--  DROP temp table from CSV which holds pre-merge changes
DROP TABLE public.temp_tags;

*我知道我每次都会创建和删除时态表,但是每个脚本都被编写为可以独立执行*
快完成了因此,我们已经将数据存储在数据库中,但是...在编辑器中不可见。在向编辑器读取PBF的过程中,会创建一些内部结构,这就是为什么我们需要将地图保存到PBF文件并再次重新加载。
再有一个小问题……OSM不知道我们的“ ah_edited”列值。他将还原列,但不会还原值。这样,我需要运行一个小脚本:
--  Create temp table from CSV which holds pre-merge changes
CREATE TABLE IF NOT EXISTS temp_tags (LIKE way_tags);

ALTER TABLE temp_tags 
ADD COLUMN IF NOT EXISTS ah_edited boolean default TRUE;

COPY temp_tags(way_id,header false);

--  Add edidtion column to the way_tags and insert unique values which only AH added

ALTER TABLE way_tags
ADD COLUMN IF NOT EXISTS ah_edited boolean default FALSE;

UPDATE way_tags 
SET ah_edited = true
FROM  temp_tags
WHERE way_tags.way_id = temp_tags.way_id
AND way_tags.k = temp_tags.k;

--  DROP temp table from CSV which holds pre-merge changes
DROP TABLE public.temp_tags;

Voila!做完了我们有新的OSM地图,其中包含我们的自定义标签。
附加信息。我使用附加的列ah_edited来保存有关由我编辑一个特定值的进一步过程的信息,并且我希望将来将其导出为CSV。完成该过程后,我们的changeset_id值设置为0,因此我们没有任何当前信息,这些信息由我作为所有者更改了->这就是为什么我使用ah_edited列。

附言我知道它很复杂,但是可以用,我找不到任何答案。