Включить в качестве контура не полигон, а мультиполигон.
Мне не совсем нравится идея с is_in.
По крайней мере в той ссылке, что выкладывал Котяра, я, перейдя с дома на улицу, не смог перейти на другие дома этой улицы:
кликаем на 173380, видим Челюскинцев, 13, кликаем на Челюскинцев (81850). Все. Никаких домов не видим.
По идее улица включает в себя дома, а не дома указывают, что они находятся на улице.
А еще у is_in развернутая логика. Находясь на той же Челюскинцев (81850) мы видим, что в участниках Минск, т.е. не улица “участвует в” городе, а наоборот, город в улице… Как-то это не совсем правильно.
Hind, а если не на каждый, а только на ‘когда это надо’? То есть, всегда улица ссылается на дом, и только в редком (всё же редком) случае организуется ‘прослойка’ отношение адреса, для случая много-адресных домов. То есть, это будет штатный выверт. И пложения сущностей не будет. Мне тоже эта лишняя прослойка на каждый дом - не нравится.
И в общем случае мне тоже близка мысль ikz, что это не обязательно улица, но любое нужное и логичное образование. Но как правило - улица.
И я бы тоже попытался обойтись в схеме без is_in как ссылки на родителя, путем наличия собственно участия ребенка (дома) в отношении Улица. Is_in ведь тоже удвоение сущностей в базе.
is_in, кажется, не нужен. Интересно, зачем его добавили.
Нарисовалась идея плагина к джосму, кот будет менеджить адресные отношения. То есть показывать всю иерархию в открытом файле OSM, иметь инструменты создания улиц и, возможно, конвертировать между стандартами адресации. :3
Я могу ответить на вопрос, зачем адрес строится снизу вверх. Пусть мы хотим загрузить маленький кусочек Москвы в редактор. Тогда вместе с ним у нас будет загружено отношение “Москва”, ссылающееся на 3681 (результат bzgrep 77000000000 street.csv.bz2 |wc -l) улицу. При необходимости мы можем через API получить все улицы Москвы. Для Минска это: http://www.openstreetmap.org/browse/relation/79847 и http://api.openstreetmap.org/api/0.6/relation/79847/relations
Да ладно. Я вообще думаю, что лучше оставить за нодами и веями геометрию, а вся фактическая инфа пусть лучше в релейшенах содержится. И вей — это вовсе лишь урезанный вид релейшена, с безымянными мемберами и их одним их типом (ноды).
А вот насчёт того, что is_in — вывернутая идеология — в принципе можно согласиться. Обычно указывают на член более низкий в иерархии. Хотя и обратные примеры есть (система категорий в Медиавики, к примеру). Впрочем, если есть вохможность быстро ходить по отношениям и в ту, и в другую сторону, это не имеет принципиального значения, т. к. a.is_in(b) эквивалентно b.contains(a)
Провел эксперимент. Внес свой дом в два адресных отношения - по улице и по комплексу.
Результат можно посмотреть здесь. Можно перейти в любой релейшен, а с него - на любой другой дом.
Единственный минус - при просмотре адресного релейшена не видны номера домов, а только иды объектов.
Update:
Еще минус - при включении релейшена дома в адресный релейшен он не подсвечивается на карте, но перейти на него можно.
Update2:
Вывел эти отношения по иерархии в address Челны. Так что никаких проблем с иерархией и уровнями вложенности.
А я тебе скажу, зачем его добавили. Добавили его затем, что пока мы оперируем понятием ‘база’, ‘выборка из базы’, то всё получается. Но как только мы переходим к Геометрии, к физическому отображению, то у любого программиста, реализующего это всё, и видящего, какие объемы информации надо перекопатить (та же трассировка точки на принадлежность контуру), что сразу возникает желание сделать себе ‘предварительный расчет’, заготовку прямо в базе (по сути - подпорку) - и логически обосновать ее необходимость То есть, вся проблема is_in’a в отсутствии строгой иерархии вложенности объектов осм. Которая (иерархия) напрашивается именно для плоскостного, геометрического отображения данных базы (сиречь создание карты).
Идея незримого главенства котэ в осм засчитана
На самом деле, если будет одна адресация, то и никакой плаг не понадобится, поддержка ТАКОЙ адресации будет частью редактора. По идее…
Один объект на местности — один в базе. Ничего избыточного.
Оккам скорее переворачивается от схемы Karlsruhe, c кучей повторяющихся по сотне раз тегов addr:street, addr:region, addr:country…
Komяpa, в России полно деревень, названия которых повторяются внутри района - тогда сельсовет включается в адрес. В КЛАДР-е они так и обозначены: Новая (Еласовский с/с), Новая (Троицко-Посадский с/с)
Что касается адреса на вее, как к вею мембер is_in назначить? Адресация-то снизу.
Дак а как это решает проблему двух адресов у здания?
А понял, housenumbers = addr:streetnumbers - указывает на то под каким атрибутом прячется номер дома под которым он входит в улицу, только это ни разу не айс, и вот почему:
Для жилишьных комплексов еще работает но для нумерации угловых домов в городе вам понадобиться для каждой улицы вводить свое (уникальное в рамках города) значение тэга housenumbers что не удобно, прежде всего по тому что очень не универсально.
is_in используется как раз для того чтобы не формировать для каждой улицы уникальное имя тэга показывающего под каким номером дом входит в улицу.
P.S. Что на счет избыточности: хотим сократить объем данных - избавляемся от избыточности, хотим сократить количество вычислений - вводим избыточность.
Для этого в любом случае нужен какой-то костыль. Либо просто включить как дополнительный уровень адресации, но с пометкой (какой-нибудь тег), что использовать только при коллизиях.