Определение района по адресу



Расширение для определения района по ФИАС.

   Периодически возникает задача определения района города по адресу (например, для распределения заказов между курьерами). Под районом подразумевается многоугольник, описанный координатами вершин. Рассмотрим пример решения данной задачи для г. Иркутска (для другого города нужно изменить координаты в макетах и отборы в запросе), конфигурация "Библиотека стандартных подсистем" редакции 2.4 (режим совместимости "Не использовать", тонкий клиент) с использованием API Яндекс карт. Следует отметить, что в данной конфигурации (как и в большинстве типовых "нового" поколения) используется ФИАС.

   Для удобства предоставим пользователю возможность указывать районы прямо на карте:

Создание района
(1 — создание нового многоугольника, 2 — заполнение таблицы координат вершин по данным на карте).

     Теперь нужно определиться с тем, как именно определять координаты по адресу — возможны следующие варианты: геокодирование адреса каждого дома, геокодирование родительских объектов (улиц, населенных пунктов и т.д.). Реализовать первый вариант можно с помощью сервиса Dadata.ru. Для второго варианта в качестве координаты можно брать середину объекта и уточнять при необходимости диапазоном номеров домов, при этом следует иметь ввиду сложные по структуре улицы. По точности оба варианта имеют погрешности: для дома — ошибки задания номера, неактуальность базы, ошибки геокодирования; для улиц — при сложной структуре часть домов может попадать в разные районы. Реализуем второй вариант — составим текстовое представление адреса (без домов) и получим для каждого координаты середины:

Полученный результат нужно проверить (что реально для такого количества улиц). В случае задания нескольких районов для одной улицы диапазон домов вводится без учета дробей и литер. Теперь при заполнении адреса можно определить район:

Аналогичный пример для КЛАДР можно посмотреть по этой ссылке.

P.S.: Данная публикация описывает личное мнение. Конструктивная критика приветствуется. Опечатки просьба отправлять в личном сообщении.

6 Comments

  1. rpgshnik

    Опять наш Иркутск, вы с коллегой не с одного цеха? https://infostart.ru/public/725116/

    Reply
  2. kuzyara

    Плюсану соотечественнику)

    Reply
  3. CSiER

    (1), ранее работал в организации, в которой сейчас работает автор указанной публикации.

    Reply
  4. d.zhukov

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

    Reply
  5. V.Nikonov

    Геокодирование по Улицам будет кошмарным в случае наличия длинных улиц. Корректнее хранить Геокоординаты в объектах и править их с участием пользователя. Для первичного контроля можно вычислять расстояние между точками полученными для середины улицы и с указанием дома, при значительных расхождения просить вмешаться пользователя…

    Reply
  6. CSiER

    (5)

    Геокодирование по Улицам будет кошмарным в случае наличия длинных улиц.

    именно поэтому добавлено разделение по диапазонам домов. Про правку пользователями в случае хранения координат для каждого объекта вопрос спорный — слишком много ручной работы (только МКД около 8000). В то же время проверить привязку примерно 2000 улиц реально. Дополнительно, данные по домам нужно актуализировать намного чаще, чем по улицам.

    По опыту, из всех опробованных вариантов (определение принадлежности дома к району через 2GIS, Dadata, Яндекс, OSM / привязка к улицам) самым «рабочим» оказался вариант с улицами.

    (5)

    Для первичного контроля можно вычислять расстояние между точками полученными для середины улицы и с указанием дома, при значительных расхождения просить вмешаться пользователя…

    — хорошая идея. В рамках определения района по улицам можно проверять максимальный, минимальный и несколько промежуточных номеров домов. К сожалению, даже с такими проверками нужна ручная правка.

    Все описанное относится к г. Иркутску.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *