You are not logged in.

Announcement

*** NOTICE: By 30th of September 2022 the forum.openstreetmap.org will be retired, please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators. We expect the migration of data will be finished by that date, you can follow its progress here.***

#1 2017-07-06 16:46:53

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Как известно, OSM - пространственная база данных, поэтому там широко используется связь на основе геометрической вложенности объектов. В основном это используется для адресов, но бывают и другие виды связей.

POI внутри здания наследуют адрес от этого здания, дороги внутри населённого пункта по умолчанию имеют maxspeed отличный от вне населённых пунктах и т.п. Однако далеко не везде эту проверку можно сделать легко и просто. Это легко при использовании БД с поддержкой пространственных данных (PostGIS и т.п.), что-то умеет распространённый конвертер osm2pl, однако во многих случаях готового инструментария нет, а программировать не все умеют. Поэтому и начинают плодиться теги addr:country/add:city на зданиях, addr:street/addr:housenumber на точечных POI, maxspeed=RU:urban на дорогах в населённых пунктах и т.п.

Вашему вниманию предлагается новый плагин под osmosis, который позволит решить данную проблему. С его помощью можно автоматически проставить необходимые теги на основе анализа геометрической вложенности объектов без программирования и использования пространственных БД.

Исходники лежат тут: https://github.com/sergeyastakhov/OSM/t … osmareatag
Примеры: https://github.com/sergeyastakhov/OSM/t … n/examples
Скомпилированная версия: https://cloud.mail.ru/public/4AyX/jQ85UbSAM

Для установки плагина надо распаковать zip-файл дистрибутива в подкаталог plugins того каталога где будете запускать osmosis (должен получиться каталог osmareatag-1.1.zip внутри каталога plugins).

Для простановки кодов стран нужны данные границ этих стран. На gislab, к сожалению, границы России битые и исправлять это они не очень то торопятся. Проще всего эту границу вытянуть отдельным запросом через API (link). В несжатом виде это будет 19 Мб, в формате pbf - 900 Кб. Если нужны другие страны - можно их так же вытянуть по одному и потом объединить, либо взять дамп нужного района на geofabric и отфильтровать из него.

Получив файл с границами стран - дальше нужно сформировать пространственный индекс. Пример (create_spatial_index.bat):

del national-boundary.idx

call osmosis --read-pbf russia-boundary.osm.pbf --lp --tag-area-content file=tag-index.xml prepareOnly=true --write-null

tag-index.xml

<?xml version="1.0" encoding="UTF-8"?>
<tag-processing>
  <area id="national-boundary" cache-file="national-boundary.idx">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
      <tag k="admin_level" v="2"/>
    </match>
  </area>
</tag-processing>

Параметр file задаёт файл конфигурации, параметр prepareOnly=true задаёт что обработку выполнять не нужно, только создание индексов. В данном примере задаётся, что необходимо создать пространственный индекс для объектов типа relation  с тегами boundary=administrative и admin_level=2 (границы стран). После создания индекс сохраняется в файле national-boundary.idx Если этот файл уже существует, то будет выполняться попытка загрузки из него, вместо использования данных из входного потока, что позволяет создать индекс один раз и затем им пользоваться многократно. Для России индекс занимает 2.7 Мб. При работе индекс держится в памяти, поэтому для больших индексов может потребоваться увеличить кол-во доступной памяти для osmosis

Дальше можно запускать обработку данных. Пример для простановки атрибутов дорог (highway_mark.bat):

call osmosis --read-pbf RU-LEN.osm.pbf --lp --bb clipIncompleteEntities=true --tag-area-content file=tag-highway.xml --write-xml RU-LEN.hwarea.osm.gz

tag-highway.xml

<?xml version="1.0" encoding="UTF-8"?>
<tag-processing>
  <area id="national-boundary" cache-file="national-boundary.idx">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
      <tag k="admin_level" v="2"/>
    </match>
  </area>
  <area id="boundary-administrative">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
    </match>
  </area>
  <area id="place">
    <match>
      <tag k="place" v="city|town|village|hamlet|isolated_dwelling|allotments"/>
    </match>
  </area>

  <transform>
    <name>Motorway speeds</name>
    <match type="way">
      <tag k="highway" v="motorway"/>
      <inside area="national-boundary"/>
    </match>
    <output>
      <add-tag k="maxspeed" v="${ISO3166-1}:motorway" context-area="national-boundary"/>
    </output>
  </transform>

  <transform>
    <name>Rural speeds</name>
    <match type="way">
      <tag k="highway" v="motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential"/>
      <inside area="national-boundary"/>
      <outside area="place"/>
    </match>
    <output>
      <add-tag k="maxspeed" v="${ISO3166-1}:rural" context-area="national-boundary"/>
    </output>
  </transform>

  <transform>
    <name>Urban speeds</name>
    <match type="way">
      <tag k="highway" v="motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential"/>
      <inside area="national-boundary"/>
      <inside area="place"/>
    </match>
    <output>
      <add-tag k="maxspeed" v="${ISO3166-1}:urban" context-area="national-boundary"/>
    </output>
  </transform>

  <transform>
    <name>Urban living street speeds</name>
    <match type="way">
      <tag k="highway" v="pedestrian|living_street|service"/>
      <inside area="national-boundary"/>
      <inside area="place"/>
    </match>
    <output>
      <add-tag k="maxspeed" v="${ISO3166-1}:living_street" context-area="national-boundary"/>
    </output>
  </transform>

  <transform>
    <name>Administrative units</name>
    <match type="way">
      <tag k="highway" v=".*"/>
      <inside area="boundary-administrative"/>
    </match>
    <output>
      <add-tag k="administrative:${admin_level}" v="${name}" context-area="boundary-administrative"/>
    </output>
  </transform>

</tag-processing>

В данном примере проставляются атрибуты maxspeed на основе вхождения/невхождения в населённые пункты + добавляются атрибуты administrative:* для привязки к соответствующим административным границам. Инструкция add-tag добавляет тег при его отсутствии, если тег уже есть, он оставляется нетронутым.

Пример для простановки адресных данных на точечных POI (poi_addr.bat):

call osmosis --read-pbf RU-LEN.osm.pbf --lp --tag-area-content file=tag-poi-addr.xml --write-xml RU-LEN.poi.osm.gz 

tag-poi-addr.xml

<?xml version="1.0" encoding="UTF-8"?>
<tag-processing>
  <area id="national-boundary" cache-file="national-boundary.idx">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
      <tag k="admin_level" v="2"/>
    </match>
  </area>
  <area id="region-boundary">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
      <tag k="admin_level" v="4"/>
    </match>
  </area>
  <area id="place">
    <match>
      <tag k="place" v="city|town|village|hamlet|isolated_dwelling|allotments"/>
    </match>
  </area>
  <area id="addr-building">
    <match>
      <tag k="building" v=".*"/>
      <tag k="addr:housenumber" v=".*"/>
    </match>
  </area>

  <transform>
    <name>POI Addresses</name>
    <match type="node">
      <tag k="amenity|shop" v=".*"/>
      <inside area="national-boundary"/>
      <inside area="region-boundary"/>
      <inside area="place"/>
      <inside area="addr-building"/>
    </match>
    <output>
      <add-tag k="addr:country" v="${ISO3166-1}" context-area="national-boundary"/>
      <add-tag k="addr:region" v="${name}" context-area="region-boundary"/>
      <add-tag k="addr:city" v="${name}" context-area="place"/>
      <add-tag k="addr:street" v="${addr:street}" context-area="addr-building"/>
      <add-tag k="addr:housenumber" v="${addr:housenumber}" context-area="addr-building"/>
    </output>
  </transform>
</tag-processing>

Надеюсь, наличие данного плагина уменьшит тенденцию простановки кучи избыточных тегов, которые вполне можно ставить автоматом.

Last edited by Sergey Astakhov (2017-07-07 13:18:55)

Offline

#2 2017-07-06 18:26:25

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 8,499

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Здорово, а на каких разработках основан индекс?

Offline

#3 2017-07-06 18:47:37

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Для геометрии используется библиотека JTS (Java Topology Suite), индекс - класс STRtree. Комментарии из него:

A query-only R-tree created using the Sort-Tile-Recursive (STR) algorithm. For two-dimensional spatial data.

The STR packed R-tree is simple to implement and maximizes space utilization; that is, as many leaves as possible are filled to capacity. Overlap between nodes is far less than in a basic R-tree. However, once the tree has been built (explicitly or on the first call to #query), items may not be added or removed.

Described in: P. Rigaux, Michel Scholl and Agnes Voisard. Spatial Databases With Application To GIS. Morgan Kaufmann, San Francisco, 2002.

Offline

#4 2017-07-06 22:06:10

Zverik
Moderator
From: Минск
Registered: 2010-10-14
Posts: 5,694
Website

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Очень круто! Правда, не уверен, что хоть кто-то сейчас вспомнит, как работать с osmosis :)


ШТОСМ | josm.ru | обо мне | удалёнка зло

Offline

#5 2017-07-07 05:36:38

Marych_
Member
From: Ташкент
Registered: 2011-01-18
Posts: 283

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

А с какой версией osmosis работает? Минимально необходимая версия например.

Offline

#6 2017-07-07 07:13:08

wowik
Member
From: Zelenograd
Registered: 2009-09-29
Posts: 9,356

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Если highway проходит через на, то ему разрешенную скорость не поставить. Делить на три части же надо.

Offline

#7 2017-07-07 10:08:46

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Marych_ wrote:

А с какой версией osmosis работает? Минимально необходимая версия например.

Минимальная должна быть 0.43, проверял и тестировал на последней, 0.45

wowik wrote:

Если highway проходит через на, то ему разрешенную скорость не поставить. Делить на три части же надо.

В смысле - автоматом? Заморочно это, надо новые объекты генерить, причём так чтобы отношения не ломались. Лёша в своём конвертере тоже отказался от этой идеи. Тут лучше делить руками в самом OSM.

Offline

#8 2017-07-07 11:37:54

wowik
Member
From: Zelenograd
Registered: 2009-09-29
Posts: 9,356

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Да нет, не лучше.
Ибо линия в OSM одна и делить ее в OSM нет нужды, така как она правильная с точки зрения OSM.

А автомат внутри базы мучительно в реализации, так что получается, что этот заурядный случай выпадает из обработки и надо с ним мучиться отдельно.

Last edited by wowik (2017-07-07 11:40:50)

Offline

#9 2017-07-07 11:45:10

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

wowik wrote:

Ибо линия в OSM одна и делить ее в OSM нет нужды, така как она правильная.

Ну как нет нужды? Делить как правило нужно, т.к. свойства дороги внутри НП обычно отличны от свойств дороги вне НП - у неё другой maxspeed, часто есть своё название, освещение и т.п. Если ничего этого нет - то можно и не делить, но это исключение а не правило.

Offline

#10 2017-07-07 12:32:14

wowik
Member
From: Zelenograd
Registered: 2009-09-29
Posts: 9,356

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Sergey Astakhov wrote:

свойства дороги внутри НП обычно отличны от свойств дороги вне НП - у неё другой maxspeed

У дороги, но не у линии.

Sergey Astakhov wrote:

часто есть своё название, освещение и т.п. Если ничего этого нет - то можно и не делить, но это исключение а не правило.

Да, у дорог есть отличия и в названиях, и в освещениях, но у линий это всё очень часто не отмечено, так что линий, пересекающих населенные пукты, тьма.

Offline

#11 2017-07-07 13:14:08

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

wowik wrote:

Да, у дорог есть отличия и в названиях, и в освещениях, но у линий это всё очень часто не отмечено

Ну это просто нехватка информации, рано или поздно её придётся добавить. Хороший повод добавить эти случаи в твой валидатор.
Данный плагин новую информацию не привносит, только переводит из одной формы в другую.

Offline

#12 2018-02-21 12:10:24

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

срабатывает не везде, пример населенный пункт Скоропусковский, Московская область, Сергиево-Посадский район. В нас.пункте нет наименований улиц и там плагин не работает.

Offline

#13 2018-02-22 22:46:56

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Eugeny_B wrote:

срабатывает не везде, пример населенный пункт Скоропусковский, Московская область, Сергиево-Посадский район. В нас.пункте нет наименований улиц и там плагин не работает.

А что именно не работает? Проставление адресов у POI? Или что-то другое?

Offline

#14 2018-02-23 07:52:07

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Проставление адресов у POI. В этом населенном пункте нет названий улиц и вместо адреса вписывается ${addr:street} как текст адреса, ну и соответственно mkgmap не меняет название улицы и на карте у точки остается в адресе ${addr:street} как имя улицы.

Last edited by Eugeny_B (2018-02-23 07:53:21)

Offline

#15 2018-02-23 08:46:39

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Еще просьба, если можно, сделать проставление адресных атрибутов addr:country и addr:city на здания в населенных пунктах.
Объясняю, Mkgmap проставляет эти атрибуты, но он берет их из admin_level, а у некоторых (я подсчет не вел, но это есть и много) маперы уже прописали эти теги и указали в них имя населенного пункта из place (а оно отличается от имени указанном в admin_level) и соответственно не попадают в индексацию (нет адресного поиска по этим адресам). Если привести все данные к одному виду, то задав всем place (населенным пунктам)  admin_level=11 или admin_level=7 все адреса индексировались бы.
А то сейчас place= Вологда, admin_level= городской округ Вологда (это еще хорошо, можно отрезать надпись городской округ),
а как быть place=Петрозаводск, admin_level= Петрозаводский городской округ (здесь отрезание городского округа не поможет, так как нет совпадения Петрозаводск и Петрозаводский).
И еще чтобы можно было указать для какой addr:country это срабатывало не трогая другие addr:country
В теме https://forum.openstreetmap.org/viewtop … =9249&p=15 сообщение 370 я описываю как борюсь с адресацией, но у меня плохо получается (локально с Россией вроде все хорошо, а вот если делать карту для бывшего СССР не выходит), весь цикл создания карты для Garmin описан мной в приведенной теме с 14й страницы.
Если можете, помогите пожалуйста с адрессацией для Garmin пользователей.

Last edited by Eugeny_B (2018-02-23 09:07:43)

Offline

#16 2018-02-23 08:59:54

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 8,499

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Логика с отрезанием из admin_level у вас какая-то странная.

Offline

#17 2018-02-23 09:30:53

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Почему, странная? Mkgmap присваивает admin_level8 (или 6 или 4) статус city, и получается населенный пункт с именем "городской округ Вологда", если в стиле Mkgmap я отрезаю в имени "городской округ " остается только "Вологда" и это имя соответствует имени place "Вологда".
И теперь все здания с указанным addr:city=Вологда и без указанного addr:city на территории данного admin_level индексируются и в поиске на приборе введя название города Вологда я нахожу эти адреса. Если не отрезать, то здания с указанным  addr:city=Вологда в адресный поиск не попадают. Я понимаю, что это не правильно и ищу выход. На пример присваивая всем city и town - admin_level=7 (это на локальных данных в компьютере, а не во всей базе ОСМ) willage и hmlet - admin_level=10, isolated_dwelling и allotments - admin_level=11 и тогда Mkgmap их индексирует и тогда если в этих населенных пунктах есть здания с указанными номерами домов и улицами, то они попадают в адресный поиск на приборе.
Что я делаю не так? И как сделать адресный поиск с помощью программы Mkgmap для приборов Garmin?
Пожалуйста, подскажите, помогите, если можете.
И еще почему приходится отрезать или замещать на сокращенное название - в приборе не умещается.

Last edited by Eugeny_B (2018-02-23 09:45:02)

Offline

#18 2018-02-23 13:13:02

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 8,499

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

addr:city должно наследоваться от полигона place, а не административной границы.

Offline

#19 2018-02-23 15:20:06

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Подскажите пожалуйста, как это сделать в программе Mkgmap, она скачивается вместе со стилем default http://www.mkgmap.org.uk/download/mkgmap.html . Какие изменения надо сделать в стиле, чтобы addr:city наследовался от полигона place, а не административной границы.

Offline

#20 2018-02-23 15:41:53

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 8,499

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Не в курсе.

Offline

#21 2018-05-30 08:40:32

dimazajcev
New Member
Registered: 2018-05-30
Posts: 1

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Подскажите пожалуйста делаю все так же как и в примере tag-poi-addr.xml, после конвертиру osm.pbf в osm, и после смотрю редактором  и вижу подобное
  <node id="444776877" lat="55.732" lon="52.3986" version="1" timestamp="1970-01-01T00:0
0:01Z" changeset="1">
                <tag k="atm" v="yes"/>
                <tag k="name" v="Альфа-Банк"/>
                <tag k="amenity" v="bank"/>
                <tag k="website" v="http://alfabank.ru/"/>
                <tag k="operator" v="Альфа-Банк"/>
                <tag k="addr:street" v="$&#123;addr:street&#125;"/>
                <tag k="addr:housenumber" v="7/20"/>
        </node>
почему то переменная addr:street не раскрылась

Offline

#22 2018-06-25 18:55:35

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,794

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

dimazajcev wrote:

почему то переменная addr:street не раскрылась

Выше Eugeny_B про это же писал.
Без изменения кода плагина можно индекс для зданий по другому формировать, сделать два индекса (с addr:street и без) и обрабатывать их по отдельности.
Либо можно подправить код плагина и при отсутствии данных просто не добавлять тег с переменной. Как лучше сделать?

Last edited by Sergey Astakhov (2018-06-25 19:00:53)

Offline

#23 2018-06-25 21:45:45

Eugeny_B
Member
Registered: 2014-11-30
Posts: 339

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Вы меня простите малограмотного, но я бы хотел плагин чтобы он проставил имя улицам и домам (на примере Скоропусковского улицам name=Скоропусковский, зданиям addr:street=Скоропусковский), а уже потом обработать POI с вариантом при отсутствии данных просто не добавлять тег с переменной. Еще раз извините но очень хочется, чтобы мой и не только прибор Гармин мог искать адреса и прокладывать к ним маршрут. В условиях когда фирма Garmin бросила пользователей своих старых (и не очень) приборов распространение карт ОСМ и повышение рейтинга и т.д. и т.п. ОСМ среди них очень актуально. Это помогло бы привлечь  их к проекту ОСМ (не всех, но часть).
С уважением к Sergey Astakhov, прошу не отказать в просьбе.

Р.С. Кстати это потребуется в деревнях (населенных пунктах) где нет улиц а есть только номера домов (конкретно наша деревня, номера домов есть а улиц нет, одна дорога вдоль озера и вдоль домов).

Last edited by Eugeny_B (2018-06-25 21:51:05)

Offline

#24 2020-03-03 15:11:22

KonTur
Member
From: SPB
Registered: 2010-03-10
Posts: 1,649

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

Sergey Astakhov wrote:

Инструкция add-tag добавляет тег при его отсутствии, если тег уже есть, он оставляется нетронутым.

А можно внедрить инструкцию, чтобы она переписывала теги? А то во многих местах получаются то две страны, то два города - и улицы делятся, часть в один попадает, часть в другой....
А так бы можно было единообразие сделать.

Last edited by KonTur (2020-03-03 15:13:08)

Offline

#25 2020-03-03 16:48:49

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 8,499

Re: osmareatag - плагин для osmosis для добавления тегов на базе геометрии

KonTur wrote:

А можно внедрить инструкцию, чтобы она переписывала теги? А то во многих местах получаются то две страны, то два города - и улицы делятся, часть в один попадает, часть в другой....
А так бы можно было единообразие сделать.

Удалить предварительно со всех данный тег.

Offline

Board footer

Powered by FluxBB