Препроцессор osm-файлов

+100500!!!

Если существующие osm2mp и mp2{нужный_формат} вполне удовлетворяют, то - нет.
Это же очевидно! Зачем приписывать оппоненту заведомо абсурдную точку зрения?

Патч - это что? Я этот термин воспринимаю как “заплатка” - обход обнаруженной ошибки вместо ее исправления.

andriano, в самом деле, если вы хотите нам помочь, а не учить нас жить, :wink: запилите препроцессор, который будет заменять в osm файле amenity=parking+pivate=yes на amenity=private_parking. Причем чтобы в конфиге можно было задать что на что заменять и остаются ли исходные теги или удаляются, и какие именно (например так:
amenity=parking+private=yes → amenity=private_parking+private=yes)

Я такой препроцессор вставлю в процесс для Гис Руссы (и Ситигида, когда он созреет).

Как этот препроцессор предполагается использовать и для чего?
Честно говоря, умножение сущностей (добавление новых тегов, которые не увеличивают количество информации в файле, но увеличивают его объем) считаю делом вредным.
Правда, если результат обработку не будет выкладываться в открытый доступ, а лишь использоваться в качестве этапа конвертации - другое дело.
Какие предложения по набору поддерживаемых функций и формату конфига?

andriano, mp - в открытом доступе - зло, потому что под каждую программу все равно нужен свой конфиг.

Использовать предполагается в процессе конвертации osm в rus и dcm для имитации функции, отсутсвующей в osm2mp - обработки нескольких тегов за раз, путем замены одних тегов на другие. Это всех проблем не решит, но пресловутую проблему с частными парковками снимет.

формат конфига такой:
на каждой строке:
список тегов осм-объекте в исходном файле (через плюсик или запятую) -->список тегов-на том же объекте в конечном файле
заменяются только теги которые указаны в левой части правила. если у объекта есть другие теги, они переносятся в конечный файл без изменений.

Ничего подобного.
С одной стороны:
МР - контейнер для некоторой ОБЪЕКТИВНОЙ информации, которую “каждая программа” может либо использовать, либо - нет. Например, PPSMapEdit не требует для себя какого-либо “своего конфига”.
С другой стороны:
МР - формат промежуточный, т.е. непригодный для непосредственного использования, поэтому особенности конкретных программ (работающих с уникальными форматами данных) должны нивелироваться конвертерами данных для них из МР.

Т.е. нужен инструмент способный анализировать содержимое объекта типа node, way или relation целиком и вносить в него соответствующие коррективы. Без анализа структуры дочерних элементов. (т.е. в relation не анализируются теги дочерних way или node)
Я правильно понимаю?

Формат конфига мне не нравится.

  1. Предлагается единственная логическая операция - конъюнкция, которая не составляет полную систему. Соответственно, невозможно сделать конструкцию типа: если присутствует такой-то тег, но при этом нет такого-то, то сделать то-то.
  2. Отсутствует информация, к объектам какого из типов (node, way, relation) следует применять данное правило.
  3. Теги некоторых типов (например, name) могут содержать произвольные строки. Нет никаких средств работы с ними. Например, мы не сможем организовать приоритет имен: при наличии name:ru берется оно, если нет - то name:en, если нет, то int_name, если нет, то name - и все это записывается в name.
  4. Нечетко формулируется, ЧТО НАДО СДЕЛАТЬ, что приводит к неоднозначности, а также ошибкам, в результате которых программа может делать совсем не то, что хотел автор конфига.
    Если устранить очевидные недостатки (ввести полную систему логических функций и возможность работы с произвольными строками), то однострочная система записи каждого “акта обработки” окажется слишком громоздкой. И составитель конфига может в ней напутать, да и мне лень разбирать строку с учетом приоритетов и скобок. Дело, конечно, не слишком сложное, но я им не занимался и у меня нет готовых инструментов.
    Поэтому предлагаю придумать ассемблероподобный язык, в котором на каждой строке записывается одна элементарная операция или директива.
    Предлагаю примерно следующее:
    10 логических регистры, обозначаемые цифрами 0…9.
    10 строковых регистров, обозначаемых %0…%9.
    комментарии - все, что после точки с запятой.
    директивы:
    u - use - использовать только объекты определенного типа: node, way, relation. Одновременно эта директива указывает на начало нового фрагмента (программы) обработки и обнуляет все регистры. Примеры:
    u:n
    u:nw
    u:wr
    команды загрузки
    s - set - устанавливают логическую переменную в состояние true при наличии указанного условия (пары key=val)
    s0:amenity=parking
    s1:name=%0 ; s1 устанавливается в true при наличии key=“name” и любом значении val, при этом ОДНОВРЕМЕННО значение val заносится в строковую переменную %0
    s2:name:%1=%2 ; s2:=true при наличии любого name: и заполняются две строки
    s3: ; означает присваивание константы true
    команды вычисления: всего 3 штуки - одна унарная и две бинарные, только с логическими регистрами:
    c0:1^2 ; конъюнкция
    c3:0+2 ; дизъюнкция
    c3:n3 ; отрицание
    команды выполнения: всего 2 штуки (удаление и добавление), но с вариациями синтаксиса:
    d0:amenity=parking ; простая команда удаления при значении true регистра 0
    a1:amenity=private_parking ; простая команда вставки при значении true регистра 1
    d2:name=% ; команда удаления при любом val
    d3:name:%=% ; команда удаления для группы key с одинаковым началом
    a4:name=%1 ; вставка вместе с запомненной ранее строкой-константой

PS. Это то, что сходу пришло в голову. Возможно, я где-то ошибся или предложил что-то неразумное.

Не хватает if’ов :slight_smile: (команды cmp) и меток, по которым можно ветвиться в пределах фрагмента :slight_smile:

Во ВСЕ команды выполнения входят условия, т.е конструкцию вида

if condition_0 then begin
delete;
add;
delete;
end else begin
delete;
add;
end;

записываем так:

c1:n0
d0:

a0:
d0:
d1:
a1:

получается даже короче.

для примера формат осм фильтра (http://code.google.com/p/pyosm/source/browse/tools/osm-filter.README) - http://code.google.com/p/pyosm/source/browse/tools/osm-filter.xml
давно хотел в него replace добавить, но времени как небыло так и нет

Может я чего не понимаю, но нафига изобретать новый язык?
Одно дело - простенький конфиг, и совсем другое - полноценный язык.
Преимущество простого конфига - он понятен и непрограммистам. Когда появляются всякие регистры и if-ы, то это уже только для программистов. Но тогда проще уж писать на Java (если это плугин для osmosis) или на одном из готовых скриптовых языков которые элементарно туда интегрируются…

Не знай… Андриано вот просит)) по мне, поглядев на его проэкт, и правда вопросилось внутри – не проще ли это на Си (к примеру) написать?..
Вопрос не праздный, на самом деле – где делать “талию” – как провести границу между конфигом и исполнительной частью программы)) Андриано вот берётся широко запахать.

Вот именно.
В данном случаее предлагаемый “язык” явно не является полным, т.к. не содержит ни переходов (никаких - ни условных, ни безусловных), ни циклов. Т.к. предназначен для решения очень узкого круга задач. Но внутри этого класса задач он IMHO не должен иметь ограничений, поэтому считаю, что алгебра логики должна быть реализована в полном объеме. И только. Никаких других операций кроме логических не предусмотрено.

…ждём ебилдов. :slight_smile:

А что это?

Чем писать такой препроцессор с такими хитрыми конфигами может лучше xslt освоить?

Упс mp не xml’ка - извините глупость брякнул.

Ну почему глупость. Обжудается всё-таки препроцессор.
Вот только как xslt будет работать на многомегабайтных файлах… Не любая реализация сдюжит…

Идея в том что если один напишет препроцессор с простыми конфигами, другим не придется ничего осваивать)

А вот плагин к осмозису кажется мне хорошей идеей.

Я пробовал xslt обрабатывать osm данные - медленно и неудобно.

Попробовал плугин TagTransform. Вроде работает.
Пример конфига (transform.xml):


<?xml version="1.0"?>
<translations>
  <translation>
   <name>Private parking transform</name>
   <description>Convert amenity=parking+access=private to amenity=private_parking</description>
   <match mode="and">
     <tag k="amenity" v="parking"/>
     <tag k="access" v="private"/>
   </match>
   <output>
     <copy-unmatched/>
     <tag k="amenity" v="private_parking"/>
   </output>
 </translation>
</translations>

Загружать надо “API 0.6 compatible version”, по первой ссылке какая-то древняя версия лежит. Или самому собрать из исходников.
В плугине отсутствует файл plugin.xml для автоматической регистрации, можно добавить его самому или подключить через командную строку, как описано на странице.

Пример plugin.xml


<?xml version="1.0" ?>

<!DOCTYPE plugin PUBLIC "-//JPF//Java Plug-in Manifest 1.0" "http://jpf.sourceforge.net/plugin_1_0.dtd">

<plugin id="TransformPlugin" version="1.0">

  <requires>
    <import plugin-id="org.openstreetmap.osmosis.core.plugin.Core"
            plugin-version="0.35" reverse-lookup="false"/>
  </requires>

  <runtime>
    <library id="code" path="/" type="code"/>
  </runtime>

  <extension plugin-id="org.openstreetmap.osmosis.core.plugin.Core"
             point-id="Task" id="TransformPlugin/Task">
    <parameter id="name" value="transform"/>
    <parameter id="class" value="uk.co.randomjunk.osmosis.transform.TransformPlugin"/>
  </extension>
</plugin>

а с 0.36 версией он работать будет?