Написание типа объекта в name

Не редко встречаются случаи когда в name пишут тип объекта. В основном когда не находится соответствующего распространенного тега для данного типа объекта, как например, “СТ” и потому что рендер сам не подставляет тип, а увидеть его на карте хочется, как например: оз., р., бол. и т.п.
Бывают случаи когда это реально полезно, а программно недостижимо, например, добавление префикса п. и д. для рядом находящихся поселка и деревни с одинаковым названием.

С другой стороны очень важно иметь “чистое” название, чтобы не терять возможность вывода типа объекта в том формате в котором кому хочется, например, “дачи” вместо “СТ” или “река” вместо “р.”.

Есть ли варианты разрешения этой ситуации?

Тут лепш глядзець па дакладнаму тыпу, напрыклад выліцы йдуць са статуснаю часткаю, мястэчкі без. Шмат дзе выкарыстоўваецца name:prefix, але не падкажу хто яго падтрымлівае, то бок тэхнічна ёсьць, фактычна не выкарыстоўваецца. Таксама можна глянуць як суадносяцца дакладныя тэгі з прэфісам, але тут можа быць яшчэ больш заблытана https://wiki.openstreetmap.org/wiki/Be:Belarus:%D0%9F%D1%80%D0%B0%D0%B2%D1%96%D0%BB%D1%8B_%D0%BD%D0%B0%D0%BF%D1%96%D1%81%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D1%9E#.D0.9D.D0.B0.D0.B7.D0.B2.D1.8B_.D0.BD.D0.B0.D1.81.D0.B5.D0.BB.D0.B5.D0.BD.D1.8B.D1.85_.D0.BF.D1.83.D0.BD.D0.BA.D1.82.D0.B0.D1.9E

Возьмем к примеру озера. Сейчас практически для всех в названии указано “озеро” или “оз.” при том что имеется однозначный тег water=lake. Тоже самое касается рек, болот, ручьев и др. природных объектов. Еще, например, урочища.
Для всех них удобно видеть в названии сокращенный тип, но основные рендеры сами их не подставляют, а заданное вручную значение, лишает остальных выбора.

Сокращения вообще не по фен-шую.
Правило есть избегать сокращений.

Все эти "удобно видеть’ не вопрос базы данных OSM.

Нажаль зусім па рознаму пішуць, шмат скаротаў:

У Беларусі polygon, tags->‘natural’=‘water’ AND name is not NULL:

select count(*), (array_agg(DISTINCT w.name))[0:3] AS name, (array_agg(DISTINCT w.tags->'water')) as water, (array_agg(DISTINCT w.tags->'waterway')) AS waterway from osm_polygon w inner join osm_polygon c on ST_Intersects(c.way, w.way)  where c.osm_id = -59065 and w.tags->'natural'='water' AND w.name is not NULL group by lower(w.name) LIKE 'оз.%', lower(w.name) LIKE 'воз.%', lower(w.name) LIKE 'о.%', lower(w.name) LIKE 'в.%', lower(w.name) LIKE 'озеро%', lower(w.name) LIKE 'возера%', lower(w.name) LIKE '%оз.', lower(w.name) LIKE '%воз.', lower(w.name) LIKE '%о.', lower(w.name) LIKE '%в.', lower(w.name) LIKE '%озеро', lower(w.name) LIKE '%возера', lower(w.name) LIKE 'озёра%', lower(w.name) LIKE '%озёра', lower(w.name) LIKE 'п.%', lower(w.name) LIKE 'пр.%', lower(w.name) LIKE 'пруд%', lower(w.name) LIKE '%п.', lower(w.name) LIKE '%пр.', lower(w.name) LIKE '%пруд', lower(w.name) LIKE 'вдхр.%', lower(w.name) LIKE 'вдсх.%', lower(w.name) LIKE 'водохранилище%', lower(w.name) LIKE 'водасховішча%', lower(w.name) LIKE '%вдхр.', lower(w.name) LIKE '%вдсх.', lower(w.name) LIKE '%водохранилище', lower(w.name) LIKE '%водасховішча' order by 1 desc;
 count |                                          name                                          |                                      water                                      |        waterway        
-------+----------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------
  1269 | {-,"17-й карьер",berezovoe}                                                            | {canal,intermittent,lake,oxbow,pond,reservoir,river,riverbank,залив,озеро,NULL} | {oxbow,riverbank,NULL}
   756 | {"оз. Адворенское","оз. Азаренское","оз. Азароново"}                                   | {lake,oxbow,pond,NULL}                                                          | {stream,NULL}
   235 | {"озеро Азерцы","озеро Аксеново","озеро Алашское"}                                     | {lake,oxbow,pond,NULL}                                                          | {NULL}
    78 | {"Адамово озеро","Бамовское озеро","Банное озеро"}                                     | {lake,pond,reservoir,NULL}                                                      | {NULL}
    74 | {"пруд №1","Пруд №1","пруд №10"}                                                       | {pond,NULL}                                                                     | {NULL}
    23 | {"Аргеловское водохранилище","Великоборское водохранилище","Вишневское водохранилище"} | {lake,pond,reservoir,NULL}                                                      | {NULL}
    16 | {пруд,Пруд}                                                                            | {pond,NULL}                                                                     | {NULL}
    10 | {"Визжар вдхр.","Вилейское вдхр.","Волчковичское вдхр."}                               | {reservoir,NULL}                                                                | {NULL}
    10 | {"Водохранилище Боровец","водохранилище Второе Лидское","Водохранилище Дягильно"}      | {reservoir,NULL}                                                                | {NULL}
     9 | {"Гайтюнишский пруд","Дикий пруд","Замковый пруд"}                                     | {lake,pond}                                                                     | {NULL}
     6 | {озеро,Озеро}                                                                          | {reservoir,NULL}                                                                | {NULL}
     5 | {"вдхр. Вяча","вдхр. Дрозды","вдхр. Криница"}                                          | {lake,reservoir,NULL}                                                           | {NULL}
     4 | {"Гаранскае возера","Іванаўскае возера","Мікулінскае возера"}                          | {lake,reservoir}                                                                | {NULL}
     3 | {водохранилище,Водохранилище}                                                          | {reservoir,NULL}                                                                | {NULL}
     3 | {"возера Апіта","возера Бледнае","возера Бяле / Beļānu ezers"}                         | {lake,NULL}                                                                     | {NULL}
     3 | {"озёра Близнецы","озёра Дарские","озёра Хатьковы"}                                    | {lake}                                                                          | {NULL}
     3 | {"о. Жимкана","о. Каташи","О. Михайлов"}                                               | {NULL}                                                                          | {NULL}
     1 | {"В. Климовича"}                                                                       | {lake}                                                                          | {NULL}
(18 rows)

У Беларусі polygon, tags->‘natural’=‘water’ AND tags->‘water’=‘lake’ AND name is not NULL:

select count(*), (array_agg(DISTINCT w.name))[0:3] AS name, (array_agg(DISTINCT w.tags->'water')) as water, (array_agg(DISTINCT w.tags->'waterway')) AS waterway from osm_polygon w inner join osm_polygon c on ST_Intersects(c.way, w.way)  where c.osm_id = -59065 and w.tags->'natural'='water' AND w.tags->'water'='lake' AND w.name is not NULL group by lower(w.name) LIKE 'оз.%', lower(w.name) LIKE 'воз.%', lower(w.name) LIKE 'о.%', lower(w.name) LIKE 'в.%', lower(w.name) LIKE 'озеро%', lower(w.name) LIKE 'возера%', lower(w.name) LIKE '%оз.', lower(w.name) LIKE '%воз.', lower(w.name) LIKE '%о.', lower(w.name) LIKE '%в.', lower(w.name) LIKE '%озеро', lower(w.name) LIKE '%возера', lower(w.name) LIKE 'озёра%', lower(w.name) LIKE '%озёра', lower(w.name) LIKE 'п.%', lower(w.name) LIKE 'пр.%', lower(w.name) LIKE 'пруд%', lower(w.name) LIKE '%п.', lower(w.name) LIKE '%пр.', lower(w.name) LIKE '%пруд', lower(w.name) LIKE 'вдхр.%', lower(w.name) LIKE 'вдсх.%', lower(w.name) LIKE 'водохранилище%', lower(w.name) LIKE 'водасховішча%', lower(w.name) LIKE '%вдхр.', lower(w.name) LIKE '%вдсх.', lower(w.name) LIKE '%водохранилище', lower(w.name) LIKE '%водасховішча' order by 1 desc;
 count |                           name                            | water  | waterway 
-------+-----------------------------------------------------------+--------+----------
   731 | {"оз. Адворенское","оз. Азаренское","оз. Азароново"}      | {lake} | {NULL}
   280 | {"Byelaye Lake","Długie - Длуге","Drūkšiai / Дрысвяты"}   | {lake} | {NULL}
   223 | {"озеро Азерцы","озеро Аксеново","озеро Алашское"}        | {lake} | {NULL}
    70 | {"Адамово озеро","Бамовское озеро","Банное озеро"}        | {lake} | {NULL}
     3 | {"озёра Близнецы","озёра Дарские","озёра Хатьковы"}       | {lake} | {NULL}
     3 | {"Гаранскае возера","Мікулінскае возера","старое возера"} | {lake} | {NULL}
     2 | {"возера Апіта","возера Бледнае"}                         | {lake} | {NULL}
     1 | {"Искусственное водохранилище"}                           | {lake} | {NULL}
     1 | {"Панский пруд"}                                          | {lake} | {NULL}
     1 | {"В. Климовича"}                                          | {lake} | {NULL}
     1 | {"вдхр. Криница"}                                         | {lake} | {NULL}
(11 rows)

У Беларусі polygon, tags->‘natural’=‘waterway’ AND name is not NULL:

select count(*), (array_agg(DISTINCT w.name))[0:3] AS name, (array_agg(DISTINCT w.tags->'water')) as water, (array_agg(DISTINCT w.tags->'waterway')) AS waterway from osm_polygon w inner join osm_polygon c on ST_Intersects(c.way, w.way)  where c.osm_id = -59065 and w.tags ? 'waterway' AND w.name is not NULL group by lower(w.name) LIKE 'оз.%', lower(w.name) LIKE 'воз.%', lower(w.name) LIKE 'о.%', lower(w.name) LIKE 'в.%', lower(w.name) LIKE 'озеро%', lower(w.name) LIKE 'возера%', lower(w.name) LIKE '%оз.', lower(w.name) LIKE '%воз.', lower(w.name) LIKE '%о.', lower(w.name) LIKE '%в.', lower(w.name) LIKE '%озеро', lower(w.name) LIKE '%возера', lower(w.name) LIKE 'озёра%', lower(w.name) LIKE '%озёра', lower(w.name) LIKE 'п.%', lower(w.name) LIKE 'пр.%', lower(w.name) LIKE 'пруд%', lower(w.name) LIKE '%п.', lower(w.name) LIKE '%пр.', lower(w.name) LIKE '%пруд', lower(w.name) LIKE 'вдхр.%', lower(w.name) LIKE 'вдсх.%', lower(w.name) LIKE 'водохранилище%', lower(w.name) LIKE 'водасховішча%', lower(w.name) LIKE '%вдхр.', lower(w.name) LIKE '%вдсх.', lower(w.name) LIKE '%водохранилище', lower(w.name) LIKE '%водасховішча', lower(w.name) LIKE 'канал%', lower(w.name) LIKE '%канал', lower(w.name) LIKE 'р.%', lower(w.name) LIKE '%р.', lower(w.name) LIKE 'река%', lower(w.name) LIKE '%река' order by 1 desc;
 count |                             name                              |              water               |                    waterway                     
-------+---------------------------------------------------------------+----------------------------------+-------------------------------------------------
   165 | {Bug,"Bug / Буг",Артисловка}                                  | {reservoir,river,riverbank,NULL} | {boatyard,dam,ditch,drain,oxbow,riverbank,weir}
     6 | {"Белоозёрский канал","Гребной канал","Днепро-бугский канал"} | {NULL}                           | {riverbank}
     1 | {"Комсомольское озеро"}                                       | {NULL}                           | {riverbank}
     1 | {оз.Клисячее}                                                 | {NULL}                           | {stream}
(4 rows)

У Беларусі line, tags->‘natural’=‘waterway’ AND name is not NULL:

select count(*), (array_agg(DISTINCT w.name))[0:3] AS name, (array_agg(DISTINCT w.tags->'water')) as water, (array_agg(DISTINCT w.tags->'waterway')) AS waterway from osm_line w inner join osm_polygon c on ST_Intersects(c.way, w.way)  where c.osm_id = -59065 and w.tags ? 'waterway' AND w.name is not NULL group by lower(w.name) LIKE 'оз.%', lower(w.name) LIKE 'воз.%', lower(w.name) LIKE 'о.%', lower(w.name) LIKE 'в.%', lower(w.name) LIKE 'озеро%', lower(w.name) LIKE 'возера%', lower(w.name) LIKE '%оз.', lower(w.name) LIKE '%воз.', lower(w.name) LIKE '%о.', lower(w.name) LIKE '%в.', lower(w.name) LIKE '%озеро', lower(w.name) LIKE '%возера', lower(w.name) LIKE 'озёра%', lower(w.name) LIKE '%озёра', lower(w.name) LIKE 'п.%', lower(w.name) LIKE 'пр.%', lower(w.name) LIKE 'пруд%', lower(w.name) LIKE '%п.', lower(w.name) LIKE '%пр.', lower(w.name) LIKE '%пруд', lower(w.name) LIKE 'вдхр.%', lower(w.name) LIKE 'вдсх.%', lower(w.name) LIKE 'водохранилище%', lower(w.name) LIKE 'водасховішча%', lower(w.name) LIKE '%вдхр.', lower(w.name) LIKE '%вдсх.', lower(w.name) LIKE '%водохранилище', lower(w.name) LIKE '%водасховішча', lower(w.name) LIKE 'канал%', lower(w.name) LIKE '%канал', lower(w.name) LIKE 'р.%', lower(w.name) LIKE '%р.', lower(w.name) LIKE 'река%', lower(w.name) LIKE '%река' order by 1 desc;
 count |                                name                                 | water  |                 waterway                  
-------+---------------------------------------------------------------------+--------+-------------------------------------------
  6019 | {Aktica,Balbata,"Baltoji Ančia"}                                    | {NULL} | {canal,dam,ditch,drain,river,stream,weir}
   100 | {"1-й Марьинский канал","7-й Любанский канал","Августовский канал"} | {NULL} | {canal,ditch,drain,stream}
    37 | {"канал Вец","канал Винец","канал Воловельский"}                    | {NULL} | {canal,ditch,drain,stream}
    24 | {Прудец,Прудище,Прудница}                                           | {NULL} | {river,stream}
    11 | {р.Ботча,"р. Плиса",р.Тростянка}                                    | {NULL} | {river,stream}
     2 | {канал,Канал}                                                       | {NULL} | {drain}
     1 | {Озеродка}                                                          | {NULL} | {river}
(7 rows)

Смотря о чем речь идет. Например, сокращение “п.” в поле “name:prefix” было бы неправильно.
А если же говорить про name, то с точки зрения базы данных наличие какого либо префикса в принципе не есть хорошо.
Поэтому тут вопрос именно об удобстве.

И фен-шуй разный бывает. Не будем же “СТ” расшифровывать в названии?

Для базы данных в идеальном случае все должно быть по полочкам. Например, “улица” тоже не должна фигурировать в названии, а быть в отдельном поле, чтобы каждый сам мог решить выводить ее в полной или сокращенной форме, или вообще не выводить.
Но рендеры под это дело никто править не будет, да и поддерживать несколько полей сложнее, а видеть их на карте хочется, вот и засунули их в название.

Та же самое происходит и с озерами - люди хотят увидеть на выходе категорию, а рендеры их не выводят, вот и пихают ее в название. Вот тут надо бы и определиться, надо оно нам в названии всех озер или стоит почистить, и если надо, то сокращенное или полное. Стоит еще отметить, что в отличие от улиц, которые могут быть и переулком и проспектом и т.п., для озер однозначный тег имеется.

если есть документированный/используемый тег, типа обьекта в названии быть не должно. Это нужно где то в ид/мапсми написать большими буквами, чтобы избежать "Магазин “Магазинный магазин” " с тегом shop впридачу.
разумеется, если выбор тега затруднителен для того, кто рисует, то можно добавить note или поставить сокращение как с СТ. в перспективе это все уберем, переведем всю карту на name:be и построим коммунизм

Подобные дилеммы всегда упираются в выбор между: формально так, по факту так, хотелось бы (удобнее/правильнее) так. Чтобы не надо было искать компромисс, «усреднённый» вариант — должна быть крепкая взаимная обратная связь между теми, кто данные вносит (тегирует) и теми, кто их обрабатывает (под навигаторы, рендереры и т. д.)
Этой связи нет или она очень слабая. Поэтому и получаем на практике, что ежели формально раскидать типы объектов по префиксам или предполагать извлечение их прямо из основного тега, подписывать объекты по ref и/или name (и тут есть разные подходы, что сюда вносить), то получим по факту обрубки. Да, это с точки зрения БД, формальной строгости, конечно, прекрасно. Но по указанной выше причине выглядеть результат будет кастрированно (однообразно и непонятно), т. е. неудобоваримо для практического применения.
Тут бы тем, кто рендерит, например, показать хороший образец рендеринга формальной схемы тегирования (связанной с подписями объектов) и рекомендовать её как эталон. Но они его не показывают, а лишь приноравливаются (каждый по-своему) к тому «разброду и шатанию», который имеется во всём многообразии: что-то урезают, что-то игнорят, что-то переставляют, что-то комбинируют, выкручиваются, в общем. Примерно то же самое делают тегировщики: подстраиваются под имеющиеся рендереры, навигационное ПО и т. д.
А по-хорошему (для меня) надо договариваться на двусторонней основе: вы нам покажите «как надо, чтобы…» и «вот как это будет красиво и замечательно в итоге». Но этого не происходит, а идёт нескончаемый «бой», «непримиримая борьба» тегировщиков между собой — с одной стороны, и попытки рендерщиков более-менее адекватно обработать и показать хороший результат — с другой стороны. Пока между сторонами не появится связки-моста — ситуация не поменяется.

Тут чатыры найбольш верагодныя варыянты:

  1. ‘natural’=‘water’, ‘water’=‘lake’ у name ня пішам возера, але пішам у prefix
  2. ‘natural’=‘water’, ‘water’=‘lake’ у name ня пішам возера і ня пішам у prefix
  3. ‘natural’=‘water’, ‘water’=‘lake’ у name пішам возера
  4. ‘natural’=‘water’, ‘water’=‘lake’ у name пішам воз.

Шчыра кажучы варыянт са скаротамі шмат чым хібны, таму што гэта ўсё ж скарот.
Цікава што па статыстыцы што скінуў вышэй зараз з азёрамі больш ужываецца воз./возера, а з рэкамі наадварот не ўжываецца р./рака, таму б я прапаноўваў варыянт 1 ці 2.

Іншае пытаньне што рабіць з азёрамі, вадасховашчамі і іншымі варыянтамі, ці ў гэтым выпадку яны ня будуць падпадаць пад ‘water’=‘lake’.

Во втором не дюже много смысла.
написано там в префикс или нет, уж лучше будет написано

Ну четвертый - это такой голимый маппинг под рендер. Да, так люди карты рисовали, а там места не много.
Но у нас же не карта.

Так что третий или первый.

Беру свои слова обратно. Однозначного тега нету ни для озера ни для какого другого объекта. Все теги являются относительными, и не позволяют вывести на карту нужную категорию. Представим, что британец делает карту мира и хочет для названий озер вывести префикс категории. Что он будет выводить имея только название и тег ‘water’=‘lake’ ? - ничего, так как перевод всех категорий на все языки мира включая местные в ренедр не засунешь и даже если и засунешь, не будет уверенности, что получено правильное соответствие. Поэтому вариант 2 отпадает.

С этой же позиции вынесение значения в name:prefix потребует задавать его для всех языковых вариантов.
Это будет выглядеть примерно так:
name
name:prefix
name:ru
name:prefix:ru
name:be
name:prefix:be
name:uk
name:prefix:uk
и т.п.

Это сравнимо с вынесением “улица” в отдельный тег. Не поддерживаю.

А что? - база данных. А для чего? - для карты. На карте всегда места мало. Да и смысл выводить полное слово то? Даже если предположить, что кто-то не карту рисует, а оперирует данными для каких-то своих расчетов, какая ему будет разница делать выборку по “озеро” или “оз.”? На локальных картах мы привыкли и будем выводить сокращенный вариант, и это же будем ожидать от международных проектов, а сами они не догадаются, да и навряд ли будут такие костыли вставлять для нас. Короче в сокращенном варианте вижу только пользу.

  1. а для всего.
  2. в первую очередь для конверторов. То есть не для прямого потребления людьми. И это дело конверторов делать user friendly для своего продукта, причём для карт это может один способ, для навигатора другой, а для покемонов третий.

Если конвертору понадобится обработать этот префикс, то так или иначе ему придется парсить name, и следовательно разницы между “оз.” и “озеро” ему будет никакой.

Никакой международный проект не будет прописывать правила определения истинной категории объекта из названия и вводить словари для перевода этих категорий индивидуально для каждой страны с учетом местных предпочтений. Все будут выводить имя из тега name как есть, потому как местным людям виднее, как его лучше отобразить на карте (навигаторах и покемонах в том числе).

И правильно LLlypuk82 отметил, что если кого-то что-то не устраивает, пусть придет сюда и скажет об этом. А то мы сами себе сложности придумываем и играемся с ними.

Предполагаю, что name:prefix/postfix задумывалось как то, что должно выводиться на карту вместе с name. Но пользуется ли хоть один рендер этим полем?

И кстати, тут же вопрос, почему мы решили использовать это поле для официальной категории населенных пунктов? Не правильнее ли было бы использовать поле типа official_place, а в name:prefix ставить “п.”/“д.” там где на карте нужно отличить рядом находящиеся нп с одним названием?

Я за вариант 2. – ‘natural’=‘water’, ‘water’=‘lake’ у name ня пішам возера і ня пішам у prefix
Если конвертеру надо названия с префиксами, то пусть берет “lake”, переводит его в нужный язык и сокращает, как ему требуется.
Откуда нам знать, что конечный пользователь, скажем, карты на белорусском на месте “возера” пожелает именно “воз.”, а не “взр.” “вз.” или еще что-то? То же самое и с “СТ” – place=allotments+name=*, а тот, кто конвертит, пусть сам решает, как хочет он видеть префикс для allotments на карте – “СТ”, “сад.тов.”, “с.т.”, “с/т” или еще что-то.

“СТ” он несет значение категории, для которой нету тега. Это может быть и садовое товарищество, и садовой кооператив, и садово-огородническое товарищество, и дачный поселок. Префиксом “СТ” в данном случае обозначается только первое.

См. тему Обозначение садовых товариществ

Ну тогда уж скорее есть смысл вводить выше указанный тэг official_place, чем писать все эти СТ, с.т. и прочую самодеятельность в имя. В общем, я за такой же подход к наименованию всех объектов, что и у населенных пунктов.

p.s. кстати, а в РБ есть такие вещи как “садовые кооперативы” и прочее? А то гугл по запросу “садовый кооператив Беларусь”, “Беларусь садово-огородническое товарищество” выдает только “садоводческое товарищество”…

На это можно возразить: нет проблем — пусть берёт общепринятые сокращения (оз. воз.) и делает с ними (в конвертере), что ему угодно: переставляет, удаляет, разворачивает в полное слово, заменяет своим словом и т. д.