Возникла следующая проблема - после обработки XML файла получаются данные, которые при отображении выглядят не так, как бы хотелось. В частности, пока заметны 2 серьезных недостатка:
- Некоторые нужные вещи не рисуются. Например, вместо границ областей или государств присутствуют только отдельные их куски. Предположительная причина: один way описывает несколько разных объектов, некоторые из которых - исключительно в отношениях (сам way не имеет соответствующих тегов).
- Предпринятый алгоритм восстановления имен у node и way, не имеющих таковых, при котором имя заимствуется у родительского отношения, приводит к нежелательным эффектам, например, вместо номера дома отображается название улицы.
Для way и node применена общая классификация типов, определяемая в основном парой key=value, например, highway=secondary.
Основная схема алгоритма:
- Анализируются отношения, при этом:
- определяется тип самого отношения (street, campus…),
- определяется тип отношения, вычисляемый по тегам аналогично node/way,
- для отношений составляются списки входящих узлов,
- для отношений составляются списки входящих путей,
- для узлов, входящих в отношения, составляются списки содержащих их отношений,
- для путей, входящих в отношения, составляются списки содержащих их отношений,
- Анализируются пути, при этом:
- исходя из тегов, определяется тип пути,
- если сочетание тегов таково, что у отношение удовлетворяет нескольким типам, то, за исключением некоторой таблицы сочетаемости, путь дублируется как пути разных типов, проходящие по одним и тем же узлам,
- если тип пути выявить не удалось, и он при этом входит в отношение, то на путь переносится тип (второй - в смысле node/way) отношения,
- если у пути нет имени, и он при этом входит в отношение, ему приписывается имя отношения,
- Анализируются узлы, при этом:
- узлы с нераспознанным типом отбрасываются.
- Если имеется объект типа building, не имеющий имени, но имеющий номер дома, в качестве имени подставляется номер дома. Если нет ни имени, ни номера дома, итакой объект (здание) отбрасывается.
При этом отношения используются ТОЛЬКО для восстановления типов и имен объектов, для которых таковые не удалось установить по собственным тегам. При этом большая часть результата анализа отношений не используется.
Вот и интересно, по какой логике нужно анализировать OSM-файл, чтобы с одной стороны не пропадала информация (например, граница, совпадающая с рекой), а с другой - не переносилась из отношений ненужная (например, название улицы не переносилось в название принадлежащего ей дома).