База данных мест должна быть предельно чистой. Ни клиент, ни сервер не должны ничего преобразовывать и додумывать. Это задача конвертера, который будет периодически скачивать дамп OSM и преобразовывать его в готовую базу точек для игры.
Падежи названий готовятся при конвертации с помощью библиотеки mawo_pymorphy3.
{cross.nom} {str1.gen} и {str2.gen}).Подводный камень: по умолчанию прилагательное "большая" считается сравнительной степенью и склоняется как "большей", нужная нам вариация находится под индексом 1. Также стоит помнить, что библиотека приводит регистр к нижнему и его следует восстанавливать. Проще всего это делать, запоминая регистр оригинальных названий.
Ещё один: словосочетание "Пять углов" не склоняется как положено, давится на винительном падеже (пять углы). Такое же было замечено с словосочетанием "Чистые пруды". Это особое место, конечно, но хотелось бы полной автоматизации. Подобные топонимы вообще требуют тщательного рассмотрения, я уверен, что в СПб такого много, а в остальной России еще больше.
Все места могут быть как node, так и way. Последнюю стоит приводить к точке (центроид) и вычислять радиус, чтобы приблизительно соответствовать площади оригинального объекта.
Если у заведения нет имени, можно его типировать по адресу (в порядке приоритета: конкретный дом, конкретная улица или описанный полигон).
Некоторые объекты (например, входы на станции метро) не имеют прямой ссылки на родителя. Такие объекты нужно обрабатывать в особом порядке. Самый простой способ — привязывать вход к ближайшей станции (может быть неприятность со Спортивной, у который есть вестибюль на другом берегу Невы).
Чтобы скамейки и урны не перевешивали дворцы по частоте открытия разрывов,нужно использовать взвешенную генерацию случайных чисел по количеству и важности объектов в категории.
Общие полезные теги:
addr:street + addr:housenumber — адрес объекта. Пригодится при генерации описаний и иногда имён.opening_hours — часы работы. Может пригодиться как при генерации описаний, так и при генерации разрывов.brand — торговая марка объекта. Обычно уже имеется в имени объекта, однко стоит иметь этот тег в виду, если имя будет NULL.Тег amenity.
Разного рода заведения общепита (кафе, рестораны, бары, ресторны быстрого питания и фудкорты).
caferestaurantbarpubfast_foodice_creamfood_courtПолезные теги:
brandcuisine — указание на кухню заведения. Пригодится для описаний.Культурные и развлекательные места — театры, кинотеатры, библиотеки. Маловероятно появление безымянных объектов, но это стоит иметь в виду.
Также сюда входят университеты. С этими следует обращаться осторожно, им свойственно дробление на множество корпусом, разбросанных по всему городу. Зачастую у таких корпусов никак не обозначена пренадлежность к головному заведению. Также они могут быть обозначены как amenity=university, так и building=university.
theatrecinemalibraryarts_centrecommunity_centreДетские сады, школы, колледжи и университеты. С последними следует обращаться осторожно, им свойственно дробление на множество корпусом, разбросанных по всему городу. Зачастую у таких корпусов никак не обозначена пренадлежность к головному заведению. Также они могут быть обозначены как amenity=university, так и building=university.
schoolkindergartenuniversitycollegehospital — крупные больницы с несколькими корпусами, скорее всего, будет way или группа объектов.clinicpharmacydentistveterinaryМеста распространения опиума народа.
place_of_worship — единственный тег.Полезные внутренние теги:
religion — собственно религия, которой посвящено место. Варианты: christian, muslim, jewish, buddhist и т.д.denomination — ещё более тонкое деление религий. Варианты: orthodox, catholic, lutheran и т.д.building — указание на конкретный тип здания: church, cathedral, chapel, mosque, synagogue и т.д.bus_station — автовокзалы.bus_stop — остановки.ferry_terminal — паромы. Их тут мало, но пусть будут.fuel — бензоколонки. Следует удостовериться, что электрозарядки тоже попадают в этот раздел.bankpost_officepolicefire_stationcourthousetownhall — разне крупные государственные здания (проверить Смольный)embassy — посольства. (Проверить консульства и визовые центры)prisonПолезные теги:
brand для банков.country для посольств.Малозначимые, но подходящие объекты.
bench — скамейка. Имеет смысл фильтровать по наличию спинки либо по материалу, иначе в игре будут одни скамейки.clock — уличные часы.fountainmarketplace — рынки.??? — урны. Ну а что. (Добавить мусорные баки)Их очень много, и упускать такие точки интереса нельзя. Общий тег shop.
supermarketmalldepartment_storebooksantiques — антикварные барахолки.musicmusical_instrumentartphototattoofloristbakery — булочные (например, булочные Вольчека)butcher — мясной магазин (например, магазины Великолукского мясокомбината)cheeseteacoffeewinealcoholhardwareelectronicsjewelrywatchessecond_handpawnbroker — ломбард.Тег tourism. Стоит помнить, что объекты могут пересекаться друг с другом по тегам — это должен исправить общий механизм дедупликации.
museum — музей.monument — большой памятникmemorial — памятники поменьшеartwork — скульптуры, мозайки, граффити.attraction — просто интересное место.viewpoint — смотровые площадки. Может быть полезно для активностей, связанных с поиском новых разрывов. Типа синхронизации.galleryhotel — гостиницы.hostel — клоповники-хостелы.information — разнообразные информационные точки, справочные бюро и т.п.theme_park — лунапарки, похоже.zooaquariumПолезные теги:
museum для музеев — тип. Может быть art, history, science, technology и так далее.inscription — надпись на памятниках. memorial для памятников — тип. Может быть plaque, statue, stone, cross и так далее.artwork_type для artwork — тип. Может быть sculpture, mural, relief, statue и так далее.stars для гостиниц — класс обслуживания.information для information — тип. Может быть board, map, guidepost, office и так далее. Тут требуется внимательная фильтрация!Из всего этого больше всего нас интересуют перекрёстки, но их в данных OSM нет. Перекрёстки — это три и более way с тегом highway и общими нодами. Совпадающие ноды и есть перекрёстки. Их нужно будет выделять при постобработке карты отдельным алгоритмом.
Имя перекрёсток будет получать по названию улиц, его образующих (должно быть минимум две улицы!). Дублей быть не должно (при текущем алгоритме было найдено множество перекрёстков неизвестных улиц, перекрёстков с одной улицей либо дублей — Заневский проспект дважды пересекает проспект Энергетиков).
Это потому, что левая и правая полосы проспекта Энергетиков считаются разными проезжими частями. Первое, что приходит в голову - брать центроид подобных дублей, если они расположены рядом (размер получившейся площади должен учитываться при расчете радиуса).
Радиус стоит ставить побольше, чтобы игрок мог получить доступ к точке с углов.
Также стоит рассмотреть ситуации дорожных развязок и других особенностей трасс, когда формально перекрёстка нет, но объект есть. Это будет нелегко, этим займёмся в последнюю очередь.
Значения тега highway, подходящие для учёта:
primarysecondarytertiaryresidentialliving_streetpedestrianunclassifiedprimary_linksecondary_linktertiary_link