首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用OSMFilter从没有rest实体的数据库中提取只有way标签

如何使用OSMFilter从没有rest实体的数据库中提取只有way标签
EN

Stack Overflow用户
提问于 2020-10-29 18:08:07
回答 1查看 89关注 0票数 0

我面临的问题相当复杂。我使用OSM编辑器,在那里我可以覆盖一些方法属性。这些属性是称为"maxspeed:backward“和"maxspeed:forward”的标签。有时我想用OSM官方数据(新建道路、在建道路等)更新我的本地地图。

我想要的是将我的本地地图与官方osm合并,以保留来自官方来源的所有道路和节点更改,但保留我的标签与来自编辑器的值。我使用Postgres DB、渗透(合并工具)、osmfilter和osmconvert工具。

这是我发现的过程:

  1. 从编辑器中获取我的本地地图,只过滤掉标签。没有节点,方式,关系。
  2. 使用官方的OSM映射并只过滤出标签(与步骤1相同)
  3. 使用conflictResult策略合并那些具有渗透性的源-我的本地标记值覆盖了官方的OSM映射。
  4. 再次使用官方的OSM地图,但现在我删除了标签,所以我得到了没有使用标签的完整地图。
  5. 将步骤3的结果(正确的标签和值)与步骤4的结果(没有标签的官方地图)与conflictResult策略合并-官方地图节点覆盖我的本地。

我想要实现的是用我自己的标签来测试最新的地图。

我在第1步遇到一个问题。我可以只从数据库中检索标签吗?没有任何节点或其他信息可以覆盖步骤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,但它并不像我希望的那样工作。

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-11-04 19:11:55

也许我的答案对任何面临同样问题的人都是有价值的。

只是提醒一下,我想下载官方的OSM地图,但保留我的本地信息(在我的例子中是maxspeed标签)。

我写的过程是这样的:

当我当前的更改保存在本地OSM编辑器中时,

  1. 会直接在Postgres数据库上运行我的SQL脚本。该脚本将maxspeedmaxspedd:forwardmaxspeed:backward中的所有标签从way_tags表导出到CSV文件。

代码语言:javascript
复制
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只是为了保存信息,即信息是我编辑过的信息,如果存在,应该用相同的标记覆盖"world“数据。

在OSM编辑器中保存后,实际上我们保存了相同标签的两个副本,但版本和增量changeset_id不同-这就是为什么我要寻找具有该值!=0的标签,并且我使用DISTINCT ON函数,它返回更高的版本值(在我修改之后)。

多亏了这一点,我得到了一个带有我的标签的CSV,我想把它保存在未来下载的地图中。

2)截断数据库

3)从geofabrik.de下载最新地图版本

4)上传地图到数据库

让我们在这里暂停片刻

我们的数据我们可以分成两组,在某些方面->全新的标签,并且已经存在于官方地图中,但我们的值应该覆盖它们。这就是为什么我把这个过程分成两部分。

5)向DB插入新值--将Get表插入到原始结构

代码语言:javascript
复制
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 (如way_tags);ALTER TABLE temp_tags ADD COLUMN IF NOT EXISTS ah_edited布尔默认值true;

代码语言:javascript
复制
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列值。他将恢复列,但不恢复值。这样我就需要运行一个小脚本:

代码语言:javascript
复制
--  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列的原因。

附注:我知道这很复杂,但它很有效,我找不到任何答案来回答我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64588925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档