RU:Разделитель значений ";"
В некоторых случаях при записи тега используется разделитель значений ключа (знак «;»). Обычно это нужно, когда некий элемент необходимо отметить несколькими значениями одного ключа.
Важно иметь в виду, что только некоторые специализированные приложения правильно обрабатывают значения, разделённые точкой с запятой, и не для всех тегов. Большинство OSM-утилит, программ для рендеринга карты, taginfo и XAPI не обрабатывают такие значения. Некоторые берут только первую часть до точки с запятой, но большинство рассматривает всю строку как одно значение, так что сущность выпадает из результатов поиска и работы программ как неидентифицированная и никогда не будет отрисована на карте.
Примеры
- ref=B500;B550 для участка дороги, имеющего номера B500 и B550. Так можно делать, только если один и тот же участок дороги имеет оба номера. Замечание: если на этом участке дороги имеется точка, в которой нумерация дороги меняется с одного значения на другое, то правильней будет разделить этот участок точкой и задать разные номера получившимся дорогам.
- Некоторые более мелкие теги "свойств" могут принимать несколько значений. Для примера, автомагазин можно отметить так: service=dealer;tyres;repair - как это описано на странице RU:Tag:shop=car.
Когда НЕ нужно использовать разделитель
В целом избегайте разделять значения, где только возможно. Не используйте их в вашей работе над картой и не предлагайте их на вики, если есть лучший способ. Почему? Сама идея использовать точки с запятой как разделитель значений тегов противоречит цели делать как можно проще. С тегами должно быть просто обращаться как картографам, так и пользователям данных (разработчикам программ отрисовки карт, поиска, мобильных приложений типа "найти ближайшее кафе" и т.д.). Ради этих людей мы должны свести к минимуму использование специальных символов в значениях.
Особенно важно избегать (там, где это возможно и оправдано) составных значений в наиболее важных тегах "верхнего уровня", то есть в тегах, которые определяют то, какой объект этот элемент представляет. В ситуациях, когда у вас есть несколько значений, можно применить несколько альтернативных подходов:
- Выберите одно из значений. Возьмите наиболее "важное" значение и укажите его. Пример: вы заносите данные о кафе, которое также является баром. Более правильно просто взять amenity=cafe или amenity=bar. Посмотрите на это кафе/бар и сделайте выбор. Это в первую очередь кафе или скорее бар? Не лучшая идея отобразить его как amenity=cafe;bar.
- Разделите элемент. Выделите ипостаси элемента в отдельные точки/линии, чтобы они могли быть помечены каждый отдельно с простыми тегами. Это хороший вариант, особенно там, где объекты разнесены в пространстве. Пример: вы отметили библиотеку, которая имеет кафе внутри. Разместите точку для кафе, а затем нанесите полигон библиотеки (большое здание) или отметьте библиотеку как отдельную точку. Плохая идея отобразить всё это в виде amenity=library;cafe
В обоих примерах, если вы используете ";" в качестве разделителя значений, то скорее всего мобильные приложения типа "найти ближайшее кафе" не смогут определять такое место ещё достаточно долго. Хотя вполне вероятно, что системы с возможностью анализа разделителей появятся, на сегодняшний день большинство этого не умеет и в ближайшем будущем ситуация не изменится.
Синтаксические особенности
Разбивка пробелом
Обычно мы разделяем значения точкой с запятой без дополнительных пробелов (например, service=dealer;tyres;repair), однако возможно добавлять пробел после каждого символа ";" (пример: service=dealer; tyres; repair), в частности при указании времени работы. В настоящее время это несогласованность существует между JOSM и Potlatch (обеих верий) в их подходе к автоматическому разделению значений.
Экранирование ';;'
Если точка с запятой входит в реальное значение, которое нужно задать тегу, то её нужно вводить как два последовательных символа ';;'. Такой подход, "экранирующий символ", используется в программировании и форматах данных [1]. Такая ситуация практически никогда не встречается и упоминается здесть как любопытная особенность. Лишь немногие инструменты, работающие с OSM, поддерживают экранирование.
Разделители, использовавшиеся в прошлом
До того как в сообществе был принят консенсус об использовании точки с запятой ';', предлагалось несколько других символов для разделения значений. Среди них: слеш "/", пробел " ", дефис "-", хеш "#". В настоящее время именно точка с запятой широко применяется в качестве разделителя и поддерживается редакторами Potlatch и JOSM. Другие символы-разделители теперь могут быть заменены на точку с запятой.
Альтернативные подходы
Если вы предлагаете схему тегирования, которая, как вам кажется, требует нескольких значений для одного тега, разделённых точкой с запятой, рассмотрите преобразвание её к пространствам имён с булевыми значениями в нескольких тегах. Например, гипотетическая схема для описания видов книг и других носителей информации в публичной библиотеке может быть выражена так:
- amenity=library
- library:stock=books;newspapers;recorded_music
Возможно, лучше будет переписать схему в виде:
- amenity=library
- library:stock:books=yes
- library:stock:newspapers=yes
- library:stock:recorded_music=yes
Теги payment=* и fuel=* - хорошие примеры второго подхода. Теги с булевыми значениями могут впоследствии быть расширены дополнительными значениями по необходимости или осмысленно заменены пространствами имён.