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

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

У Беларусі 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. кстати, а в РБ есть такие вещи как “садовые кооперативы” и прочее? А то гугл по запросу “садовый кооператив Беларусь”, “Беларусь садово-огородническое товарищество” выдает только “садоводческое товарищество”…

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

Возразить то можно, но переход “lake”->“возера”->“взр.” требует лишь словаря и никакого знания общепринятых сокращений, а значит реализуется проще, чем “prefix” → расшифровка → перевод → новый префикс. А в ОСМ, оказывается, есть “общепринятые сокращения”? Во многих картах сокращения есть, но там они явно прописываются в легенде, а значит не являются такими уж “общепринятыми”.

И потом, почему нет такого же запроса на prefix для населенных пунктов, а только для рек\озер?

Нагадаю, што раней вуліцы таксама са скаротамі пісалі.

Нельзя переводить мнемонику.
А если это называется не озеро, а как-то иначе? Или наоборот называется озеро, а размечено как болото?

А какую пользу получили от того, что стали полностью писать?