Uk:Semi-colon value separator
Ми використовуємо крапку з комою (символ ;) в якості роздільника значень теґів в одних випадках та намагаємось уникати — в інших. Це буває необхідно у випадках, коли один елемент потребує кількох значень для одного й того ж самого ключа.
Деякі споживачі даних 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 Augturn=*можливий напрямок руху по смузі може мати кілька покажчиків, напр,turn:lanes=left;through|through|through;right
(зверніть увагу, що для теґів*:lanes=*символ розділення смуг|має пріоритет над роздільником-крапкою з комою, що дозволяє вказувати кілька значень для однієї смуги)
- У випадку, коли використання додаткових описових теґів невиправдано чи ускладнює опис обʼєктів.
Тут крапка з комою широко використовується для цих теґів, де загальними є кілька значень, наприклад:
НЕ використовується
Для важливих теґів вищого рівня треба уникати використання кількох значень. Наприклад, це теґи highway=*, amenity=*, leisure=*, landuse=* та natural=coastline.
Не використовуйте кілька значень для одного ключа під час мапінгу та не пропонуйте їх використання у вікі, якщо для цього існують інші, кращі варіанти. Все через те що використання точки з комою у вигляді розділювача значень не збігається з принципом не ускладнювати життя як для тих хто додає дані (мапери) та і для тих хто використовує дані (користувачі). Заради нових учасників і тих, хто намагається "використовувати" дані (люди, які створюють програмне забезпечення для візуалізації, пошуку, мобільних додатків типу "знайти найближче кафе", тощо), ми повинні зберігати принаймні основні дані у вигляді, який прийнятний для безпосереднього використання.
У випадках наявності кількох значень, зазвичай є кілька альтернативних способів їх позначити:
- Оберіть одне зі значень: Оберіть те значення, яке є основним для обраного об'єкта. Наприклад: ви додаєте обʼєкт який є кафе в якому також є бар. Буде доречним зважити ситуацію та зробити вибір між
amenity=cafeтаamenity=bar(подивіться на це кафе/бар та спробуйте зробити висновок, чи це переважно кафе або бар?). Позначити його якamenity=cafe;barбуде недоречним. - Розділіть обʼєкт: Розділіть обʼєкт на кілька окремих елементів, це дозволить вам позначити їх окремо скориставшись при цьому відповідними теґами. Наприклад: у вас є бібліотека в якій знаходиться кафе. Позначте будівлю в якій знаходиться бібліотека теґом
amenity=library, а в середині поставте точку, яку позначте якamenity=cafe, або поставте дві окремі точки, одну для бібліотеки, а іншу для кафе. Не варто позначати їх якamenity=library;cafe.
В обох прикладах, якщо ви використовуватимете ; для розділення значень ключа amenity, такий обʼєкт не буде показуватись у застосунку "знайти найближче кафе". Незважаючи на те, що системи можуть робити розбір значень та відділяти їх використовуючи ;, переважна їх більшість такого не робитимуть.
Синтаксис
Використання пробілу
Часто ми використовуємо крапку с комою без пробілів (наприклад, ref=B500;B550), однак пробіли можливі після символу ; (наприклад, ref=B500; B550). Такий спосіб використовується в синтаксисі опису годин роботи та обмеженнях з умовами.
Старіший стиль теґування розміщував пробіл після кожного символу ; в інших контекстах для зручності читання, наприклад, ref=B500; B550. Potlatch автоматично вводив ; при обʼєднанні двох ліній. [1] [2] [3] Однак до 2013 року таке використання стало незначним. [4] iD автоматично видаляє пробіл після крапки з комою, за винятком ключів, де він необхідний.
Екранування ';;'
Крапка з комою була обрана як роздільник, оскільки вона рідко зустрічається в імені або ключовому слові, тому споживачі даних можуть розділяти теґи за крапкою з комою з більшою впевненістю, ніж за будь-яким іншим роздільником. Проте, якщо окреме значення в списку значень має містити крапку з комою, ви можете екранувати його, ввівши дві послідовні крапки з комою: ;;. Станом на січень 2023 року ця послідовність екранування зустрічається лише 36 разів у всьому світі, з яких ця кавʼярня з креативною назвою є, ймовірно, єдиним обʼєктом, назва якого була навмисно екранована. OpenStreetMap Americana — один з небагатьох споживачів даних, які розуміють екрановану крапку з комою.
Екранування з '\'
Коли окремий номер телефону або факсу містить крапку з комою, він замінюється зворотним слешем замість іншої крапки з комою. Але обидва варіанти вживання є надзвичайно рідкісними.
Інші (застарілі) розділювачі
До того як спільнота прийшла до згоди використовувати точку з комою ; для відокремлення значень, для цього використовувались інші символи. Це були / (коса риска), (пробіл), - (дефіс) та # (ґратка). Зараз точка з комою підтримується більшістю програм редакторів, а застарілі варіанти мають бути виправлені.
Підтримка програмним забезпеченням
Підтримка списків
CSV в програмному забезпеченні не є складною, вона в основному вимагає певної обробки тексту шляхом обробки підрядків і регулярних виразів, які доступні в кожній мові програмування. Однак розробники мають впроваджувати самотужки, тому її можна очікувати лише тоді, коли використання роздільника є обґрунтованим.
Споживачі даних
Геокодери
- Uk:Nominatim розділяє теґи name за допомогою крапок з комою під час індексування обʼєктів. [5]
- Pelias розділяє теґи name за допомогою крапок з комою під час індексування обʼєктів. [6]
Інструменти отримання даних
- Поточний варіант мови запитів Overpass підтримує використання роздільника значень через
- підтримку роботи з регулярними виразами, оператор
~тільда, наприклад, коли відбувається пошук по частині рядка,node["cuisine"~"italian"]знайде значення cuisine=german;italian;mexican - Список операторів представлених множин таких як
lrs_in,way[highway=primary](if:lrs_in("B 1",t["ref"]));пошук всіх основних доріг з теґом ref="B 1" включаючи ref="B 1;B 5" (але пропускаючи ref="B 158", який можна знайти використовуючи простий запитref~"B 1"), див LRS для отримання докладного пояснення.
- підтримку роботи з регулярними виразами, оператор
- Версія Sophox osm2rdf розділяє значення більшості ключів за допомогою крапок з комою. Кожне значення в списку, розділеному крапками з комою, утворює окремий трійник (з значенням як об'єктом з префіксом
osmd:). Це стосується будь-якого ключа з тип ключа (P9) або добре відомі значення (Q8) у відповідному елементі даних. (Для інших ключів ви можете |розділити на крапки з комою самостійно.) - (Застаріла) Служба XAPI, не використовується з 2017 (розробка припинена ще у 2012), не підтримувала регулярні вирази та пошук в рядках, що викликало певні складнощі в минулому.
Рендери
- Mapbox Streets заміняє
;на тире з пробілами (—) в теґахname=*чиname:*=*. [7] В основних теґах, наприкладamenity=*абоshop=*, до уваги береться лише перша частина до крапки з комою. - (Застаріло) MapQuest Open використовував для інтерпретації
ref=*, розміщуючи кожне значення, розділене крапкою з комою, окремо (проте вільний доступ до відкритих тайлів був припинений у 2016 році). - OpenStreetMap Americana замінює кожну крапку з комою в
name=*пробілом bullet (•) або новим рядком, залежно від типу обʼєкта, і скасовує екранування крапок з комою. [8] Він також видаляє дублікати імен зі списку при позначенні місця його імʼям як мовою, яку віддає перевагу користувач, так іname=*. Йому не потрібно розділятиref=*, оскільки він відображає знаки маршруту на основі звʼязків маршруту; паралельні маршрути представлені декількома звʼязками. - OSM Carto, стиль, який переважно зосереджений на показі високорівневих теґів майже не використовує розділювачі. Для створення табличок з номерами доріг на підставі значень теґу
ref=*використовується попередня обробка даних засобами SQL, де відбувається заміна точки з комою на знак нового рядка, так щоб окремі номери доріг показувались з нового рядка. Він відображає крапки з комою вname=*дослівно. [9] - Waymarked Trails розпізнає значення
route=*, розділені крапкою з комою, у звʼязках спільного використання маршрутів.
Навігаційні застосунки
- GraphHopper замінює крапки з комою в
name=*на коми під час генерації покрокових інструкцій. [10] - OsmAnd підтримує списки CSV, наприклад у таких випадках:
- На мапі, значення
ref=*показуються окремо для кожного шляху. ref=*у віджеті "поточний шлях" та у навігаційних інструкціях, точка з крапкою замінюються на кому.- Також в рушій text-to-speech надсилаються значення з комою для кращого оголошення номерів шляхів.
- Складені значення годин роботи обробляються відповідним чином, також показується чи відчинений той чи інший обʼєкт в поточний момент часу.
- Значення теґу
turn:lanesпоказується у вигляді стрілок з дозволеними напрямками руху по смугах; під час навігації підсвічуються рекомендовані смуги. - Значення теґу
cuisine=german;italian;mexicanдля закладів харчування показуються наступним чином – "German • Italian • Mexican". - Він знаходить POI з декількома зручностями, такими як
amenity=library;cafe(див. приклад вище) - Якщо
phone=*містить кілька значень, він відкриває підменю з номерами телефонів, з яких можна вибрати для дзвінка.
- На мапі, значення
- Mapbox Directions API надає текстові та голосові інструкції, які містять перше чи найрелевантніше значення теґів
name,refтаdestination. - OSRM замінює крапки з комою в
destination=*на коми під час генерації покрокових інструкцій. - Valhalla замінює крапки з комою в
name=*таdestination=*на коси риски під час генерації покрокових інструкцій. [11]
Редактори OSM
Редактори даних OpenStreetMap мають обробляти різні значення для одного ключа, коли два чи більше обʼєктів зливаються в один.
- iD в певних випадках дозволяє злиття обʼєктів з однаковим ключем та різними значеннями (напр.
highway). В інших випадках, значення додаються до одного ключа використовуючи крапку з комою як роздільник (напр. злиттяleisure=parkтаleisure=water_parkутворитьleisure=park;water_park). Різні поля дозволяють користувачеві графічно створювати список значень, розділених крапкою з комою, за допомогою полів тексту з автозаповненням. - JOSM показує попередження, про те що значення конфліктують одне з одним, ви можете обрати одне зі значень для подальшого використання, щоб розв'язати конфлікт даних, якщо ви тільки не оберете опцію "всі", щоб створити теґ з кількома значеннями розділеними крапкою з комою. [12]
- Potlatch 1 (підтримку закінчено у 2010), та Potlatch 2 (підтримку закінчено у 2011) та Potlatch 3 виконують злиття значень використовуючи крапку з комою. У більшості випадків це створює помилкові комбінації, які потрібно виправляти вручну.
- [Vespucci|Vespucci]] 0.9.8 і вище підтримує редагування списків значень, розділених крапкою з комою. [13][14]
Альтернативи
Якщо ви пропонуєте нову схему, яка б вимагала розділення значень за допомогою крапки з комою, подумайте про перетворення її на кілька теґів зі значеннями 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=* також є добрим прикладом застосування просторів імен. Теґи з булевими значеннями, як ці, можуть бути розширені пізніше.
Звʼязки
Звʼязки за своєю суттю підтримують звʼязки «багато-до-багато». Наприклад, шлях highway=* може бути членом декількох звʼязків type=route. Кожен з цих звʼязків може зберігати інформацію про відповідні маршрути в структурованому форматі, що дозволяє уникнути необхідності розробляти вкладену синтаксичну структуру для цієї інформації в тезі ref=*, розділеному крапкою з комою, шляху highway=*.
Інші види використання
Іноді крапка з комою використовується для інших цілей, ніж для розмежування значень у списку:
census:population=*використовує крапку з комою для відділення кількості населення від року проведення перепису.
Дивіться також
- Category:Uses semicolon in tag value
- Uk:Multiple values
- Приклади ручного розділення на крапки з комою в Sophox та QLever для ранжування окремтх значень теґів за поширеністю