0

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

这是我发现的过程:
1. 从编辑器中获取我的本地地图并仅过滤掉标签。没有节点、方式、关系。
2.取官方OSM图,只过滤掉标签(同步骤1)
3. 使用冲突结果策略将这些来源与 osmosis 合并 - 我的本地标签值覆盖官方 OSM 地图。
4. 再次使用官方 OSM 地图,但现在我删除了标签,所以我得到了没有我正在使用的标签的完整地图。
5. 使用冲突结果策略将步骤 3 的结果(正确的标签和值)与步骤 4 的结果(没有标签的官方地图)合并 - 官方地图节点覆盖我的本地。

我想要实现的是用我自己的标签去匹配最新的地图。
我对第 1 步有疑问。我可以从 DB ONLY 标签中检索吗?没有任何节点或其他信息可以在步骤 5 中覆盖官方地图?我在 DB 标记中看到的内容被放置在单独的表中,并且已经引用了 whe 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但它没有按我希望的方式工作。

提前感谢您的帮助。

4

1 回答 1

0

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

  1. 当我当前的更改保存在本地 OSM 编辑器中时,我直接在 Postgres 数据库上运行我的 SQL 脚本。该脚本将所有标签从maxspeed, maxspedd:forward,maxspeed: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,我想保留在未来下载的地图中。

2) 截断 DB
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, k, v, version, ah_edited) FROM '/home/map-data/exportedTags.csv'     (FORMAT csv, delimiter ';', header false);

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

INSERT INTO way_tags (way_id, k, v, version, 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) 接下来我们更新已经存在的值 CREATE TABLE IF NOT EXISTS temp_tags (LIKE way_tags); ALTER TABLE temp_tags 如果不存在则添加列 ah_edited boolean default true;
COPY temp_tags(way_id, k, v, version, ah_edited) FROM '/home/map-data/exportedTags.csv' (FORMAT csv, delimiter ';', 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, k, v, version, ah_edited) FROM '/home/map-data/exportedTags.csv' (FORMAT csv, delimiter ';', 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;

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

PS我知道这很复杂,但它有效,我找不到我的问题的任何答案。

于 2020-11-04T11:11:54.983 回答