Улицы vs Дороги

Ihor Nahuliak

Непонятно, о чем тема или что критиковать.

В третьем посте темы указан какой-то алгоритм, но неясно, что за практическую задачу он решает.

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

Похожим занимались поетгисовцы, автоматизируя привязку домов к улицам. Некий пространственный (топологический) анализатор искал поблизости подходящую улицу и ставил на домик cladrcode

Задача не имеет решения.

Задача имеет не единственное решение.

Я бы не называл это задачей. По крайней мере той задачей, которую должен в конечном счёте решать софт. То есть той конечной задачей, которую решает для себя пользователь софта.

Любую задачу, которую способен решить человек, способен решить и софт. Ссылку на работу postgis-овцев, дадите?

Это не есть конечная задача. Это один из способов решения некоторой неизвестной задачи, возможно не самый оптимальный.
Для чего вам название этой улицы, что вы потом с этим делать будете?
Если вы хотите показывать адреса по клику - то почему тогда вам не нужны номера домов?

Чем сердце успокоилось: https://forum.openstreetmap.org/viewtopic.php?id=21491

(Вторая тема поначалу называлась типа: “cladr:code для зданий”)

Кроме валидации по КЛАДРу населенных пунктов и улиц была проведена расстановка КЛАДР кодов улиц на домики.
Последнее было сделано для удобства конвертора данных в карту Покетгиса. Например через этот механизм решалась проблема одноименных улиц в городе.

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

Делали KekcuHa и Ezhick

Должна быть посадочная SEO страница под улицу. Перейдя на страницу, пользователь должен увидеть информацию по точкам, относящихся к данной улице.

Пользователи могут поставить точку где им угодно, не обязательно на полигон дома, отмеченного на карте. Улица может пересекать несколько районов города.

При этом если есть несколько разных улиц с одинаковым названием в разных городах, то нужно показывать их как разные страницы.

Если использовать полный путь адреса точки, который возвращают движки геокодирования (nominatim, mapbox, googlemaps, etc.), то имеем проблему: один и тот же географический объект (облатсь, район, город, городской район, улица) может иметь разные названия/написания/ошибки написания от точки к точке, поэтому группировать по названию объекта практически нельзя.

Решение должно заключаться в использовании какого-то стороннего идентификатора улиц, не привязанного к названию, не имеющeго проблем с написанием на разных языках, переименованием улиц, etc.

Вы уж сразу не забудьте про случай, когда улиц в адресе нету.
Это или маленькая деревня, или большая, типа Зеленограда. :slight_smile:

Они также смогут иметь и ошибки стороннего идентификатора.

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

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

Была улица такая:
|
|

|
|
|
потом государство решило прилепить еще кусок

Теперь она вот такая

|
|

|
|
|

Думаю, что геометрически всё поменялось очень сильно, а название осталось.

Беда в том, что улица-то на местности-то может и есть, может даже и не далеко, а в адресе ее нет вообще, да и о том, что есть улица могут не все знать.
А в зеленоградском адресе обычно ничего нет. Город+дом. Люди, правда, группируют всё-таки дома по микрорайонам, но это не формальный адрес, а группировка.

Тут вы правы. После обновления карты придется заново пересчитывать списки из ид-улиц, рядом с которыми находятся точки. Сложность O(n2): n*m, где n - кол-во точек, m - кол-во улиц. URL страницы тоже поменяется, если будет содержать идентификатор вместо имени. Есть идеи как этого можно избежать?

формальный адрес вроде бы и не нужен, если не писать бумажных писем. пользователь будет искать по какому-то ориентиру, он знает где эта улица примерно проходит, видит это на карте, так что если найдем все точки географически рядом с улицей - это вроде ОК. если там несколько улиц рядом - точка найдется по любой из них, что опять же - хорошо. явно видя точку на карте - уже не проблема к ней дойти/доехать, какой бы формальный адрес она не имела.

если не знают названий улиц, тогда откроют страничку со всеми точками района/микрорайона и найдут на карте глазами.

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

Если есть несколько участков одной и той же улицы (визуально продолжают друг друга, названия совпадают, ref совпадают или отсутствуют) но с разными osm_id - насколько это верно?

Можно ли группировать дороги по ref + name чтобы получить уникальные улицы? Это опять дает ошибки ввода, от которых я стремлюсь избавиться…

В ОСМ улицы бывают двух сортов.

  1. Для которых есть специальный объект-отношение (relation)
  2. Для которых нет специального объекта.

На Украине, к примеру, много первого типа, в России в подавляющем случае второй тип.
В этом случае улица формируется из кусочков (way) с одинаковым name (но разными osm_id), найденных в границах города. В случае если в городе несколько одноименных улиц, то для уникальности улицы учитывается тег addr:suburb.
Если границ у населенного пункта нет, то их может заменять тег addr:city (или наоборот).
Домики к улице привязываются по совпадению name улицы и addr:street (в случае нескольких одноименных улиц еще и addr:suburb).

В случае же наличия для улицы отношений (одного из типов associatedStreet, street), домики (и прочие POI), и даже куски улицы, связываются при помощи вхождение в оное.

С адресацией не по улице привязка домиков происходит на базе тегов addr:* и/или геометрической вложенности.

Кроме addr:* еще попадаются теги is_in:*, которые нам также говорят о вхождении одних объектов в другие, особенно если каких-то границ не хватает.

В странах бСССР принято мапить границы населенных пунктов, дабы избежать тотальной простановки addr:city на объектах, но в других странах такая практика может отсутствовать начисто, то есть а населенных пунктов есть только точки (node). Вот тут, конечно, всяческие топологические вычисления становятся крайне необходимы, если теги addr:* не заполнены подобающим образом.

P.S ref на веях к улицам не относится никак. Это обычно номера автодорог. Например ref=М-10 стоит от Москвы до Питера. В Химках трасса проходит по улице Ленинградское шоссе, а в Солнечногорске по улице Красной.
А трасса может проходить по части улицы и т.п.
То есть эти ref совсем никак не связаны с понятием улицы.

Бывают дома, у которых записанная в их официальный адрес улица просто отсутствует. Не в ОСМ отсутствует, а на местности. Вот, например: https://www.openstreetmap.org/way/48733768#map=18/56.80966/60.60559
Там все замаплено довольно аккуратно, я сам проверял. И как вы будете восстанавливать эту часть адреса?