30 August 2010

Где эта улица, где этот дом… Или как определить район, в котором находится предприятие

Блог компании Business Development Group corporate blog
image

В процессе разработки нового сервиса у нас появилась интересная задачка. Необходимо определить принадлежность предприятия какому-либо административно-территориальному или муниципальному образованию и закрепить за предприятием район либо округ, в котором оно находится. Представлением для конечного пользователя должен быть фильтр в поисковой форме, который позволял бы найти организации только в заданном районе или округе города. И сделать это нужно для компаний по всей России.

Вводные данные: у нас была некоторая наработанная база, насчитывающая достаточно большое количество организаций по всей России. База включала адреса предприятий, которые представляли собой обыкновенную строку. Соответственно, каких-то очевидных способов сделать территориальную привязку не было.

Для реализации такой, казалось бы, несложной задачи, пришлось изрядно поломать голову. Поначалу была идея использовать Google-maps для того, чтобы через пользовательские карты очертить контуры районов, а координаты организаций получить через геокодер Яндекса. Но данная идея оказалась утопична – нарисовать карты районов для всей России осилит не каждый.

Подходящее решение пришло в голову внезапно – использовать уже готовые базы административно-территориальных делений КЛАДР. Данная база содержит полный список населенных пунктов, улиц и домов России. Так же база КЛАДР содержит для каждой территориальной единицы код ОКАТО (Общероссийский классификатор объектов административно-территориального деления). Стоит отметить, что сама база ОКАТО не входит в состав КЛАДР и должна быть загружена отдельно.

Итак, база, по которой можно определить округ или район имеется. Осталось разобраться, как сопоставить ей имеющиеся адреса. Данные о домах в КЛАДР хранятся довольно специфичным образом: информация о доме может содержать множество различных обозначений, таких как корпус, строение, четность, что так же должно учитываться при определении района. А значит нам необходимо проанализировать имеющиеся адреса. Сделать это можно двумя способами:

Первый – самый простой и не надежный: скормить адрес имеющихся фирм геокодеру Яндекса, который и разберет адрес на кусочки. Но есть и большой минус этого способа – если в базе геокодера такого адреса по какой то причине не окажется, то он вернет ближайшее к указанному месту строение. А может и вообще ничего не вернуть…
Второй способ – путь джедая. Реализовать парсер адреса собственноручно. Так как для нашего сервиса точность определения адреса была критичной, было решено реализовать парсер собственными силами и средствами. Простейший пример реализации здесь. В примере строка адреса разбирается на массив, ключами которого являются типы территориальных единиц. В приведенном примере есть одно «но»: адрес должен быть уже в «правильном» формате. То есть, к примеру, дом в адресе должен идти обязательно после улицы, а не перед ней.

Теперь, когда адрес представляет более понятную структуру, его можно сопоставить с имеющейся базой КЛАДР и получить код ОКАТО. Сама по себе база КЛАДР не дает представления о принадлежности территории какому-то району или округу. При помощи нее можно определить максимум сам код ОКАТО ну и еще почтовый индекс. А Нужное представление может дать сама база ОКАТО. Именно в ней располагается информация по внутригородским районам, округам городов республиканского, краевого, областного подчинения.

Итак, скрипты написаны, коды сопоставлены. В результате на свет появился вот такой функционал:

image

Реализовано и описано by zdanchik
Tags:географические картыкладрпоиск по сайтупоисковый фильтр
Hubs: Блог компании Business Development Group corporate blog
+7
14.3k 16
Comments 15