RU:Схема Карлсруэ

From OpenStreetMap Wiki
Jump to navigation Jump to search

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

Схема Карлсруэ - одна из нескольких предложенных схем. В настоящее время она пользуется наибольшей популярностью, но вы сами вольны решать, использовать ее или нет. Эта схема описывает то, как создаем адресацию мы.

Housenumber-karlsruhe-de.png

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

Основы

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

В терминах OSM:

  • Дом обычно изображается точкой рядом с улицей (не на улице!). Можно также нарисовать линию, описывающую контур здания, и пометить ее тегом building=*.
  • Между домами могут быть помещены особые линии, указывающие на то, что в этом месте установлена адресная интерполяция (т. о. система понимает, что между 10 и 20 располагаются дома с номерами 12, 14, 16, 18).

Теги

В общем случае используются следующие теги:

Тег Наличие Тип элемента Значения Описание
addr:housenumber или

addr:housename

требуется точка полигон строка Номер дома. Может состоять не только из цифр. Если у какого-то объекта несколько номеров, разделите их символом ",". Пример: "12b,12c".

Или имя дома. В некоторых странах (например, в Великобритании) иногда для домов вместо номеров используются имена.

addr:street необязательно точка полигон строка Основное название соответствующей улицы. Если оно не задано, программа присвоит имя ближайшей улицы, которую она обнаружит. Не всегда получается сделать это просто и быстро, поэтому считается, что лучше все же имя задать. (А еще лучший выбор - использовать отношение, которое описывается ниже.).
addr:state необязательно точка полигон строка Для тех стран, в которых при описании адреса указывается штат, например, в США или Австралия. Для других стран не используется.
addr:postcode необязательно точка полигон строка Почтовый индекс здания/адресуемой области. В разных странах почтовые индексы бывают разной длины и состоят из разных символов.
addr:city необязательно точка полигон строка Наименование населенного пункта, указываемого в почтовом адресе.
addr:country необязательно точка полигон двухбуквенный код Двух-буквенный код страны по стандарту ISO 3166-1 alpha-2 заглавными буквами. Необходим из-за того, что почтовый индекс уникален только в пределах страны. Например, код России - "RU", код Беларуси - "BY".
addr:full необязательно точка полигон строка Полный почтовый адрес. Используется в дополнение к другим тегам, если с их помощью не удается описать адрес.
addr:interpolation требуется линия even/odd/all/alphabetic Метод, по которому должна быть создана адресная интерполяция домов на определенной улице. Смотрите ниже.

Эти теги хорошо работают в большинстве стран. Но из-за того, что встречаются и другие способы адресации, обойтись только этими тегами невозможно. Свободно используйте другие addr:* теги, необходимые для указания адресов в вашей местности. Пока вы согласны с простым предположением, что у зданий (или участков земли) есть адреса, вы должны уметь пользоваться какой-нибудь адресной схемой.

Простой дом рядом с линией

NodeNextToRoad.png

<node id="1">
  <tag k="addr:housenumber" v="10" />
  <tag k="addr:street" v="AStreet" /> 
</node>

Расположение линии определяется по ближайшей точке на ближайшей улице. (Смотри ниже, как можно сделать подсказку, какая улица на самом деле подразумевается.)

Для обозначения здания можно также использовать полигон (building=yes). Если же для этого требуется только одна точка, так как другие - для более полного описания - определить невозможно, то в качестве такой точки можно использовать центр полигона.

Использование интерполяции для обозначения нескольких домов вдоль линии

HouseNumbersInterpolation.png

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

<node id="01" lat=... lon=...>
  <tag k="addr:housenumber" v="10" /> 
  <tag k="addr:street" v="AStreet" /> 
</node>
<node id="02" lat=... lon=...>
  <tag k="addr:housenumber" v="20" /> 
  <tag k="addr:street" v="AStreet" /> 
</node>
<node id="03" lat=... lon=...>
  <tag k="addr:housenumber" v="100" /> 
  <tag k="addr:street" v="AStreet" /> 
</node>
<way id="??">
  <node ref="01"/>
  <node ref="02"/>
  <node ref="03"/>
  <tag k="addr:interpolation" v="even" />
  <!-- see note below on putting street names here! -->
</way>

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

В случае, если один из домов пропущен (к примеру "12"), необходимо будет нарисовать две линии ("1-11" и "13-25")

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

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

Если при интерполяции по схемам odd/even/all используется тег addr:housenumber не с целочисленным значением (например, "12б"), он будет игнорироваться. Дома, содержащие нецелочисленные значения, не могут использоваться как крайние точки для интерполяции по этим схемам.

Заметка: Некоторые составители карт используют тег "addr:street" для линий интерполяции, но не присваивают его отдельным точкам. Конечно, каждый может использовать те теги, какие захочет, но это не рекомендуется создателями Схемы Карлсруэ. Причина состоит в том, что линии интерполяции создаются временно; мы ожидаем, что однажды каждый дом будет помечен отдельно, а линии интерполяции будут просто удалены, и это не приведет к потере информации. Эти линии не должны оставаться надолго.

Нецелочисленная интерполяция

Вы можете также использовать метод "alphabetic" для интерполяции алфавитных символов в буквенной нумерации домов. Таким образом, если вам надо отметить дома от 7a до 7f, вы можете соединить их линией, помеченной тегом addr:interpolation=alphabetic. Вы не можете смешивать алфавитную интерполяцию с другими интерполяционными методами. Существует только один особый случай, в котором первый дом может иметь целочисленный номер, а остальные пронумерованы буквами латинского алфавита, начиная с A. Например, последовательность 25-25F означает, что дома пронумерованы так: 25 — 25A — 25B .. 25F.

Описание полного адреса (необязательно)

<node id="01" lat=... lon=...>
  <tag k="addr:housenumber" v="10" />
  <tag k="addr:postcode" v="832989" />
  <tag k="addr:full" v="First Street 10
                           832989 My Town
                           France" />
</node>

Описание подъездного пути (необязательно)

<relation id="??">
  <tag k="type" v="roadAccess" />
  <member type="node" ref="11" role="accessto" />
  <member type="node" ref="12" role="accessvia" />
  <!-- (можно использовать несколько тегов <member type="node" ref="11" role="accessvia" />
	для различных подъездных путей к месту с определенным адресом, например, к центрам для больших собраний) -->
  <member type="way" ref="???" role="accessfrom" /> <!-- optional -->
</relation>

Другими словами необходимо создать отношение типа "roadAccess" с тремя компонентами:

  • accessto = адресная точка, помеченная, как было показано ранее, хотя бы одним тегом addr:housenumber=*. Так как такие адресные точки в основном располагаются далеко от "своей" улицы, их дополнительно помечают тегом addr:street=*.
  • accessvia = точка (точка на подъездном пути) на улице (небольшой) или в конце улицы (например, возле ворот). Алгоритм маршрутизации должен обработать эту точку, как начальную или конечную точку маршрута, так же, как если бы это была адресная точка без этого отношения. Если существует больше чем один подъездной путь, необходимо выбрать наилучший (например, самый короткий или самый быстрый).
  • accessfrom (необязательно) = линия (дорога, улица), по которой можно доехать до этого адреса.

Использование отношения, чтобы связать дом и улицу (необязательно)

Чтобы установить связь между улицей и номером дома, вместо тега addr:street можно воспользоваться отношением. Это упрощает адресацию и, согласно оценке, сделанной программой, уменьшает количество ошибок. Однако если вам хочется повозиться, свободно используйте для описания следующего участка тег addr:street. Как кажется, в настоящее время большинство пользователей продолжают придерживаться именно этого метода.


Согласно мнению, которое изложил Marcus Wolschon, использование чего-то одного (тега addr:street или отношения associatedStreet) будет достаточно. (Смотри письмо "Re: Hausnummernmapping & Relationen (Karlsruher Schema)" (https://web.archive.org/web/20090907030902/http://article.gmane.org/gmane.comp.gis.openstreetmap.region.de/42106) от 2009-04-15 09:18:48 GMT).

Теги

Ключ Значение Комментарий
type associatedStreet (используйте значение "associatedStreet", разрешено также: "street")
name streetname необязательно, но рекомендуется

Члены

Линия/точка Роль Количество Комментарий
линия street одна или больше Соответствующая улица (можно использовать больше, чем одну линию, если все они являются частью одной и той же улицы, но по каким-то причинам были разделены при нанесении на карту)
точка полигон house один или больше Один или больше пронумерованных домов (используйте значение "house", разрешено также: "addr:houselink", address )

Смотри Relations/Proposed/Street и Relations/Proposed/Collected_Ways!

Совет: если эти отношения пропущены, компьютер легко могжет добавить их во время препроцессинга определенной области для поиска.

Установить связь дома и улицы

<node id="11" lat=... lon=...>
  <tag k="addr:housenumber" v="10" /> 
</node>
<relation id="??">
  <tag k="type" v="associatedStreet" /> 
  <member type="node" ref="11" role="house" />
  <member type="way" ref="???" role="street" />
</relation>

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

Установить связь между отношением building-полигон с улицей

HousePolygonNextToRoadWRel.png

<relation id="??">
  <tag k="type" v="associatedStreet" /> 
  <member type="node" ref="11" role="house" />
  <member type="way" ref="???" role="street" />
</relation>

Установить связь нескольких пронумерованных домов с улицей

<relation id="??">
  <tag k="type" v="associatedStreet" /> 
  <member type="way" ref="11" role="house" />
  <member type="way" ref="???" role="street" />
</relation>

Использование

  • На некоторых улицах в Карлсруэ нумерация домов сделана именно в таком ключе. Такой же способ нумерации встречается и в некоторых других местах.
  • В Traveling Salesman есть приложение с командной строкой org.openstreetmap.osm.data.searching.HouseNumberFinderTest для поиска улицы+дома-номера и получения геолокации какого-либо дома.
  • Osmarender заточен под то, чтобы формировать приятного вида отображение нумерации домов: отдельные дома, интерполяция
  • В JOSM есть настройка, облегчающая использование тегов addr:*.
  • В Potlatch тоже есть такая настройка: нажимайте на иконку 'preset type' до тех пор, пока она не примет вид штампика, затем выберите 'address'.
  • В OSM Inspector есть вид для отображения адресов.
  • Mkgmap внедряет адресную информацию в информацию о POI. Отношение associatedStreet пока еще не поддерживается.
  • LoroDux будет использовать номера домов, чтобы направлять слепых людей к правильному входу. Пожалуйста, отмечайте входы в дома очень аккуратно!
  • GpsMid начиная с версии 0.7.5 поддерживает навигацию по номерам домов, используя отношения associatedStreet и теги addr:street. Интерполяция в версии 0.7.5 не поддерживается.

Алгоритм

Возможная реализация может быть следующей:

  1. Загрузите в память линию
  2. Загрузите все точки и линии, связанные с исходной линией через отношение "type=associatedStreet"
  3. Если шаг 2 не дал желаемых результатов, загрузите все точки и линии с тегом "addr:housenumber" или "addr:interpolation" в определенной области вокруг улицы, для которых эта улица является наиболее близкой. [1]
  4. Если после 2 и 3 шагов нашлись точки или здания-полигоны, номера которых совпадает с тем, что мы ищем, выведите их и завршите алгоритм
  5. Просмотрите все объекты интерполяции "addr:interpolation", которые добавились после 2 и 3 шагов, и определите, содержат ли они номер дома, который необходимо найти.
  6. Определите диапазон номеров между двумя домами A и B, располагающихся на линии интерполяции, между которыми находится запрашиваемый дом X
  7. posNumeric = X / (B - A)
  8. Если сегмент состоит только из точек, помеченных как A и B, ваше расположение тривиально для интерполяции
  9. Если сегмент содержит дополнительные точки, определите ваше расположение, используя сумму длин сегментов и posNumeric.
  10. Определите ваше расположение на найденном сегменте, используя длину сегмента и суммы сегментов, которые идут до него.

Примечания

  1. Можно полностью удалить это во время препроцессинга. Соответствующие препроцессоры могут быть написаны для формата osm-xml или же такой процессор, вместо того, чтобы внедрить его в каждое приложение, может быть представлен, как новый Osmosis модуль, которым все смогут воспользоваться. Благодаря таким предварительным вычислениям запросы данных из определенной области больше не потребуются.

Реализацию можно найти в AdvancedAddressDBPlaceFinder для навигатора Traveling Salesman.