Uk:Semi-colon value separator

From OpenStreetMap Wiki
Jump to navigation Jump to search

Ми використовуємо крапку з комою (символ ;) в якості роздільника значень теґів в одних випадках та намагаємось уникати – в інших. Це буває необхідно у випадках, коли один елемент потребує кількох значень для одного й того ж самого ключа.

Застосунки (споживачі даних OSM) без проблем можуть обробляти дані в форматі semiColon Separated Values (CSV), за умови їх належного застосування. Застосунку, створені на початку виникнення OSM, можуть стикатись з певними проблемами. Коли таке розділення крапкою з комою використовується в теґах, там де це не очікується, програмне забезпечення може обробляти їх невідповідним чином, наприклад розглядати весь рядок як одне значення або розглядати лише першу частину такого значення.

Приклади усталеного використання

  • Відрізки доріг по яких проходять кілька автомобільних шляхів, напр. ref=B500;B550 для шляхів B500 та B550. Так потрібно робити лише у випадках коли по одній й тій же дорозі дійсно проходять кілька шляхів. Однак, якщо на цій ділянці дорозі один шлях переходить в інший, тоді потрібно поставити точку на відрізок дороги і розділити лінію на два відрізки та кожному з них призначити відповідне значення ref=*.
  • Складні значення, які, очевидно, не можуть бути представлені за допомогою підключів (особливо, якщо вони є невпорядкованими списками елементів), можуть використовувати крапку з комою, наприклад:
    • opening_hours=Tu-Fr 08:00-18:00;Mo 09:00-18:00;Sa 09:00-12:00;closed Aug
    • turn=* можливий напрямок руху по смузі може мати кілька покажчиків, напр, turn:lanes=left;through|through|through;right
  • У випадку, коли використання додаткових описових теґів невиправдано чи ускладнює опис об'єктів.
    Тут крапка з комою широко використовується для цих теґів, де загальними є кілька значень, наприклад:

НЕ використовується

Для важливих теґів "вищого рівня" треба уникати використання кількох значень. Наприклад, це теґи highway=*, amenity=*, leisure=*, landuse=* та natural=coastline.

Не використовуйте кілька значень для одного ключа під час мапінгу та не пропонуйте їх використання у вікі, якщо для цього існують інші, кращі варіанти. Все через те що використання точки з комою у вигляді розділювача значень не збігається з принципом не ускладнювати життя як для тих хто додає дані (мапери) та і для тих хто використовує дані (користувачі). Заради нових учасників і тих, хто намагається "використовувати" дані (люди, які створюють програмне забезпечення для візуалізації, пошуку, мобільних додатків типу "знайти найближче кафе", тощо), ми повинні зберігати принаймні основні дані у вигляді, який прийнятний для безпосереднього використання.

У випадках наявності кількох значень, зазвичай є кілька альтернативних способів їх позначити:

  • Оберіть одне зі значень: Оберіть те значення, яке є основним для обраного об'єкта. Наприклад: ви додаєте об'єкт який є кафе в якому також є бар. Буде доречним зважити ситуацію та зробити вибір між amenity=cafe та amenity=bar (подивіться на це кафе/бар та спробуйте зробити висновок, чи це переважно кафе або бар?). Позначити його як amenity=cafe;bar буде недоречним.
  • Розділіть об'єкт: Розділіть об'єкт на кілька окремих елементів, це дозволить вам позначити їх окремо скориставшись при цьому відповідними теґами. Наприклад: у вас є бібліотека в якій знаходиться кафе. Позначте будівлю в якій знаходиться бібліотека теґом amenity=library, а в середині поставте точку, яку позначте як amenity=cafe, або поставте дві окремі точки, одну для бібліотеки, а іншу для кафе.

В обох прикладах, якщо ви використовуватимете ; для розділення значень ключа amenity, такий об'єкт не буде показуватись у застосунку "знайти найближче кафе". Навіть беручи до уваги, що системи можуть робити розбір значень та відділяти їх використовуючи ;, переважна їх більшість такого не робитимуть.

Синтаксис

Використання пробілу

Часто ми використовуємо крапку с комою без пробілів (наприклад, ref=B500;B550), однак пробіли можливі після символу ; (наприклад, ref=B500; B550). Такий спосіб використовується в синтаксисі опису годин роботи.

Екранування ';;'

Якщо крапка з комою міститься безпосередньо в самому значенні, вона має позначатись двома послідовними знаками ;;. Такий "спосіб екранування" використовується в багатьох мовах програмування та описах даних. Таких випадків майже не існує, і ми тут згадуємо про це як про можливий варіант. Дуже незначна частина інструментів, що використовують дані OpenStreetMap дійсно переймається цим.

Інші (застарілі) розділювачі

До того як спільнота прийшла до згоди використовувати точку з комою ; для відокремлення значень, для цього використовувались інші символи. Це були / (коса риска), (пробіл), - (дефіс) та # (ґратка). Зараз точка з комою підтримується більшістю програм редакторів, а застарілі варіанти мають бути виправлені.

Підтримка програмним забезпеченням

Підтримка списків CSV в програмному забезпеченні не є складною, вона в основному вимагає певної обробки тексту шляхом обробки підрядків і регулярних виразів, які доступні в кожній мові програмування. Однак розробники мають впроваджувати самотужки, тому її можна очікувати лише тоді, коли використання роздільника є обґрунтованим.

Споживачі даних

Інструменти отримання даних

Рендери

  • OSM Carto, стиль, який переважно зосереджений на показі високорівневих теґів майже не використовує розділювачі. Для створення табличок з номерами доріг на підставі значень теґу ref=* використовується попередня обробка даних засобами SQL, де відбувається заміна точки з комою на знак нового рядка, так щоб окремі номери доріг показувались з нового рядка.
  • Mapbox Streets заміняє ; на тире з пробілами ( — ) в теґах name=* чи name:*=*. В основних теґах, наприклад amenity=* or shop=*, до уваги береться лише перша частина до крапки з комою.
  • MapQuest Open використовував значення ref=* таким чином, щоб показувати їх окремо (однак вільний доступ до тайлів був скасований ще у 2016 році).

Навігаційні застосунки

  • OsmAnd підтримує списки CSV, наприклад у таких випадках:
    • На мапі, значення ref=* показуються окремо для кожного шляху.
    • ref=* у віджеті "поточний шлях" та у навігаційних інструкціях, точка з крапкою замінюються на кому.
    • Також в рушій text-to-speech надсилаються значення з комою для кращого оголошення номерів шляхів.
    • Составні значення годин роботи обробляються відповідним чином, також показується чи відчинений той чи інший об'єкт в поточний момент часу.
    • Значення теґу turn:lanes показується у вигляді стрілок з дозволеними напрямками руху по смугах; під час навігації підсвічуються рекомендовані смуги.
    • Значення теґу cuisine=german;italian;mexican для закладів харчування показуються наступним чином – "German • Italian • Mexican".
  • Mapbox Directions API надає текстові та голосові інструкції, які містять перше чи найрелевантніше значення теґів name, ref та destination.

Редактори OSM

Редактори даних OpenStreetMap мають обробляти різні значення для одного ключа, коли два чи більше об'єктів зливаються в один.

  • iD в певних випадках дозволяє злиття об'єктів з однаковим ключем та різними значеннями (напр. highway). В інших випадках, значення додаються до одного ключі використовуючи крапку з комою як роздільник (напр. злиття leisure=park та leisure=water_park утворить leisure=park;water_park).
  • JOSM показує попередження, про те що значення конфліктують одне з одним, ви можете обрати одне зі значень для подальшого використання, щоб розв'язати конфлікт даних, якщо ви тільки не оберете опцію "всі", щоб створити теґ з кількома значеннями розділеними крапкою з комою.
  • Potlatch 1 (підтримку закінчено у 2010), та Potlatch 2 виконують злиття значень використовуючи крапку з комою. У більшості випадків це створює помилкові комбінації, які потрібно виправляти вручну.

Альтернативи

Якщо ви пропонуєте нову схему, яка б вимагала розділення значень за допомогою крапки з комою, подумайте про перетворення її на кілька теґів зі значеннями yes/no.

Прості теґи "yes/no"

Більшість "властивостей" або "атрибутів" об'єктів описуються за допомогою простого ключа без використання простору імен:

  • lit=yes/no - показує чи є освітлення на вилиці чи стоянці в нічний час
  • oneway=yes/no - використовується для зазначення наявності чи відсутності на дорозі одностороннього руху oneway=yes/no, використовується разом з highway=*
  • drive_through=yes/no - показує чи об'єкт (банк, ресторан, аптека) обслуговує автомобілістів без потреби виходити з автомобіля.

Простір імен

Якщо властивість чи атрибут має бути доданий до одного об'єкта, корисним може бути використання простору імен, однак це не завжди обов'язково.

Наприклад, спробуємо описати наявні в бібліотеці книжки та матеріали:

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=* також є добрим прикладом застосування просторів імен. Теґи з булевими значеннями, як ці, можуть бути розширені пізніше.

Інші види використання

Іноді крапка з комою використовується для інших цілей, ніж для розмежування значень у списку:

  • census:population=* використовує крапку з комою для відділення кількості населення від року проведення перепису.

Дивіться також