RU:Catalog/Hind

From OpenStreetMap Wiki
Jump to navigation Jump to search

Коталог объектов OSM призван создать простой машиночитаемый формат, унифицирующий определение, иерархию и перевод тегов и значений. Предполагаемое использование:

  1. Полный перевод описаний и ключевых слов: человекочитаемость, живой поиск на своем языке;
  2. Конвертация в пресеты JOSM;
  3. Создание иерархии элементов для различных каталогов/списков и её однородность;
  4. Организация списка «правильных» тегов, для пользователей и валидаторов.


Обсуждение http://forum.openstreetmap.org/viewtopic.php?id=16704
GitHub https://github.com/ErshKUS/osmCatalog

Описание схемы

Формат представляет собой JSON-объект с двумя свойствами, каждое из которых отвечает за свой раздел:

 {
   tags: [],
   classes: []
 }

tags

tags описывает все используемые теги и представляет собой массив объектов следующей структуры:

Свойство Тип Обязательный Описание
id строка да Идентификатор тега. Рекомендуется использовать только латинские символы нижнего регистра, цифры и точку. Можно использовать сам тег, приводя его к такому виду.
tag строка да Ключ тега
values массив да Объект или массив объектов, описывающих допустимые значения тега. Описание структуры таких объектов в таблице ниже.
description строка / объект Строка или объект translation, содержащий описание тега

Объект value:

Свойство Тип Обязательный Описание
id строка Идентификатор значения. Рекомендуется использовать только латинские символы нижнего регистра, цифры и точку.
type строка да Тип значения. Варианты: *, preset, numeric, integer, boolean, regexp
value строка да, для preset и regexp Для варианта preset — точное значение, regexp — регулярное выражение
description строка / объект Строка или объект translation, содержащий описание значения

Объект translation:

Свойство Тип Обязательный Описание
Код языка в стандарте ISO 639-1 строка Содержимое на соответствующем языке

classes

Определение класса представляет собой JSON-объект:

Свойство Тип Обязательный Описание
id строка да Имя класса. Рекомендуется использовать только латинские символы нижнего регистра, цифры и точку. Пространство имён не пересекается с тегами и значениями.
abstract булев Если присутствует и установлено в true, то класс считается абстрактным. Абстрактные классы не должны применяться напрямую (например, экспортироваться в JOSM)!
parents строка / массив id родителей.
tags строка / объект / массив да, при отсутствии родителей Объект или массив объектов, описывающих характерные теги. Вместо объектов можно указывать id тега в виде строки (результат аналогичен незаполненным required и values в таблице ниже)
type строка / массив да, при отсутствии родителей Типы объектов, к которым допустимо применение класса. Рекомендуемые значения: *, point, line, area. Допустимые значения: node, way, closeway, relation.
description строка / объект Строка или объект translation, содержащий описание класса

Объекты tags в определении класса необходимы для обозначения необходимости тега и ссылки на его определение из первого раздела.

Свойство Тип Обязательный Описание
required булев true — тег обязателен для объекта класса. false или не задан — не обязателен
tag строка да id тега
values строка / массив Идентификаторы значений. Если не задан, допускаются любые значения, предусмотренные тегом.

Наследование

Массивы допустимых тегов объединяются. Если тег присутствует в обоих документах, массивы возможных значений также объединяются.

Потомок получает всё многообразие тегов и значений родителей.Обязательность тегов наследуется по правилу «ИЛИ»: если тег был обязателен хотя бы у одного предка, он будет обязателен у потомка.


Массивы допустимых типов пересекаются! Если родитель(-и) и/или потомок не имеют общих типов применения, потомка нельзя применить ни к чему.

Описание класса не наследуется (но можно выводить описания всех родителей по цепочке).

Пример

 {
   tags:
   [
     {
       id: "name",
       tag: "name",
       values:
       [
         {
           type: "*",
           description:
           {
             "en": "Any readable text.",
             "ru": "Любой читаемый текст."
           }
         }
       ],
       description:
       {
         "en": "Object name.",
         "ru": "Название объекта."
       }
     },
     {
       id: "opening.hours",
       tag: "opening_hours",
       values:
       [
         {
           type: "*",
           description:
           {
             "en": "Value in format http://wiki.openstreetmap.org/wiki/Key:opening_hours",
             "ru": "Значение в формате http://wiki.openstreetmap.org/wiki/RU:Key:opening_hours"
           }
         },
         {
           id: "24.7",
           type: "preset",
           value: "24/7",
           description:
           {
             "en": "Day and night.",
             "ru": "Круглосуточно, без выходных и обеда."
           }
         }
       ],
       description:
       {
         "en": "Object opening hours.",
         "ru": "Часы работы объекта."
       }
     },
     {
       id: "phone",
       tag: "phone",
       values:
       [
         {
           type: "regexp",
           value: "/^\+[0-9 -]+$/",
           description:
           {
             "en": "Phone number as +<country code> <area code> <local number>",
             "ru": "Телефонный номер в формате +<код страны> <код города> <местный номер>"
           }
         }
       ],
       description:
       {
         "en": "Object phone number.",
         "ru": "Номер телефона объекта."
       }
     },
     {
       id: "amenity",
       tag: "amenity",
       values:
       [
         {
           id: "school",
           type: "preset",
           value: "school",
           description:
           {
             "en": "Object is a school.",
             "ru": "Объект является школой."
           }
         }
       ],
       description:
       {
         "en": "Amenities.",
         "ru": "Приятности."
       }
     }
   ],
   classes:
   [
     {
       id: "nameable",
       abstract: true,
       tags:
       [
         "name"
       ],
       type: "*",
       description:
       {
         "en": "Nameable object.",
         "ru": "Именуемый объект."
       }
     },
     {
       id: "poi",
       abstract: true,
       parents: ["nameable"],
       tags:
       [
         "opening.hours",
         "phone"
       ],
       type: ["point", "area"],
       description:
       {
         "en": "Point of interest.",
         "ru": "Точка интереса."
       }
     },
     {
       id: "school",
       parents: ["poi"],
       tags:
       [
         {
           required: true,
           tag: "amenity",
           values: "school"
         }
       ],
       description:
       {
         "en": "School.",
         "ru": "Школа."
       }
     }
   ]
 }