RU:Catalog/Hind
Коталог объектов OSM призван создать простой машиночитаемый формат, унифицирующий определение, иерархию и перевод тегов и значений. Предполагаемое использование:
- Полный перевод описаний и ключевых слов: человекочитаемость, живой поиск на своем языке;
- Конвертация в пресеты JOSM;
- Создание иерархии элементов для различных каталогов/списков и её однородность;
- Организация списка «правильных» тегов, для пользователей и валидаторов.
Обсуждение 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": "Школа."
}
}
]
}