За 10 лет работы в результате анализа многочисленных исключений в российских адресах мы выработали правила хранения адресов, при соблюдении которых вы не потеряете важную информацию.
Недавно на Хабре нас попросили привести примеры необычных адресов, в связи с чем и написана эта статья.
Номер дома — не число, а строка
Начнем с моего любимого места – города Электростали в Московской области. Как в любом уважающем себя городе, в нем есть проспект Ленина. Советское время кончилось, а проспект растёт и развивается. Недавно там построили новые дома.
Обычно при строительстве новых домов им присваивают номера в порядке продолжения. Если строительство домов происходит с начала улицы, где помещать рядом с домом 1 дом 36 нелогично, то просто начинают новую улицу.
Строительство новых домов на этом проспекте было запланировано с его начала. Однако новую улицу решили не делать, а продлить проспект Ленина, прибавив цифру 0 слева от номера новым домам.
То есть адреса Электросталь пр Ленина 4 и Электросталь пр Ленина 04 — это два разных адреса.
К сожалению, этот случай в России не единственный.
Вывод: храните номер дома как строку, чтобы не потерять лидирующий ноль.
Кстати, недавно нам пришёл такой адрес от клиента: 675018, Амурская, Моховая падь п, дом Л-1. Необычный дом, не правда ли? Мы не нашли его на картах, но он есть в ФИАС. Мы пока разбираемся, насколько корректно существование дома с лидирующей литерой, но вполне вероятно, что дом существует, так как его указал реальный клиент.
Почтовый индекс важен
Бывает, что в городе две улицы называются одинаково. Например, в Москве две улицы 8 марта. Различить их можно только по индексу.
Или, например, Россия, Архангельская область, Устьянский район, деревня Бережная на карте Яндекса встречается в трёх местах. Не знаешь индекс — письмо не дойдёт.
Вывод: сохраняйте почтовый индекс объекта.
Без типов никуда
Индексы важны, но не всегда достаточны для определения улицы и даже населённого пункта. Бывает, что у разных населённых пунктов один и тот же почтовый индекс:
Россия, край Забайкальский, р-н Агинский, пгт Агинское, ул Олимпийская, индекс: 687000 Россия, край Забайкальский, р-н Агинский, с Амитхаша, ул Олимпийская, индекс: 687000
То есть крайне важно хранить тип населённого пункта.
То же самое относится и к типам улиц: если в Яндексе набрать “Москва Пушкинская” и нажать “Найти”, то Яндекс покажет Пушкинскую набережную, хотя есть ещё улица и площадь.
Вывод: сохраняйте тип населенного пункта и улицы.
Бывают адреса без улицы. И даже без дома.
Иногда мы встречаем адреса без улицы. Редко — в городах, чаще — в населённых пунктах. Адрес “Алтай, пгт Шебалино, дом 2” действительно существует (и там готовят вкусные пирожки).
Случается, что у дома нет номера, только корпус. Так, например, живут люди в Зеленограде и микрорайоне Супонево в Звенигороде: Звенигород, Супонево, корп 1.
Вывод: если при сохранении адреса в базу у вас включена проверка на пустые значения, то:
Разрешайте сохранять адрес без улицы; Разрешайте сохранять адрес без номера дома, если указан корпус.
Бережно относитесь к литерам
Номер дома определяет отдельное сооружение. Литеры — это строения, пристройки и т.п., находящиеся на территории дома. Например, если дом имеет номер 4, то его пристройка может иметь номер 4А1, подвал — 4Б1, забор — 4I, строение — 4В, щитовая в отдельном сооружении — 4Г. Правила литерования действуют по всей России, но только в Питере их особенно любят. ?Адрес, содержащий несколько литер, — нормальная ситуация для Питера: г. Санкт-Петербург ул. Маркина, д. 16Б, литера А.
(Скриншот из Питера, сделан с карт )
Некоторые литеры легко перепутать с номерами: литера З похожа на цифру 3 (как бы вы прочитали адрес Москва Звездный 23 с З?), литеру Ч в рукописном шрифте можно спутать с четвёркой. Литеры Й и Я выглядят как сокращения (Дом 4й — это 4 литер й или четвертый?).
Можно разделять номер дома и литеру словом “литер”, чтобы адреса вроде Звездного бульвара воспринимались более однозначно. Например, так: Москва Звездный 23 литер З.
Выводы:
Не удаляйте литеры у домов. Выделяйте под хранение литеры несколько символов (мы храним три). Разделяйте номер дома и литеру.
На этом всё. В качестве примера посмотрите структуру ответа, который возвращает . При такой структуре хранения адреса описанные выше проблемы не должны вас коснуться.