Обрабатываем базу городов ФИАС (бывший КЛАДР) на C#

В текущей задачи понадобилась база регионов и городов. Т.к. базы в открытом доступе старые, могут содержать ошибки, неточные данные и просто не из первоисточника - решено было найти источник данных и импортировать к себе в базу.

Поиск

Довольно быстра была найдена ссылка с файлами База данных Федеральной Информационной Адресной Системы далее ФИАС. На этой странице обнаружилась как база данных ФИАС так и в старом формате КЛАДР. По совету ruskar решено использовать базу в новом формате ФИАС, т.к. она более полная и обновляется.

Я скачал базу в формате DBF (не знаю хорошо это или плохо), весом 1 ГБ (в формате XML она на 500 МБ больше). Далее встал вопрос чем эту базу открыть и что с ней делать, ведь LINQ и Entity Framework просто так с DBF не работают. Однако приятно увидился, когда удалось открыть обычным Excel (не Access)

Открытие файла DBF Excel

Импорт DBF в SQL Server 2012

Нам понадобятся 2 тиблицы: ADDROBJ.DBF и SOCRBASE.DBF, в которых находятся все адресные объекты и сокращения соответственно.

база Short

Открываем SQL Server Management Studio, выбираем базу куда необходимо импортировать выбранные таблицы: Tasks > Import Data…

Import шаг 1

В открывшемся диалоге в качестве Data Source выбираем .Net Framework Data Provider for Odbc. Далее необходимо указать строку подключения к базе. Это отдельная история. Эту строку подключения я создавал ранее в Visual Studio, пытаясь подключиться к файлу напрямую.

Создание строки подключения к DBF в Visual Studio

Нажимаем “Add Connection”. В качестве Data Source выбираем 

Connection 1

В Data Source Specification > Use Connection String > Build… Создаем (выбираем) источник данных. Для начала его необходимо создать.

Создание соединения с DBF

После всех манипуляций получится такое диалоговое окно с готовой строкой подключения. Ее нужно скопировать, и вставить в MS SQL Server Management.

Готовая строка подключения к базе

Продолжаем импорт

Вставляем строку подключения к базе данных в диалоговое окно и жмем <Enter>. Она автоматически распарсится и поля сами подставятся в нужные ячейки.

Выбор строки подключения к DBF

На втором шаге выбираем базу назначения

База данных приемник

Далее оставляем пункт по умолчанию: Copy data from one or more tables or views.

Теперь необходимо выбрать таблицы для импорта и настроить Mapping. Выбираем таблицы ADDROBJ и таблицу с сокращениями. Рассмотрим настройку Mapping для таблицы адресов. По умолчанию в поле Type подставляются коды типов из базы DBF, однако в MS SQL нет типа “22” и пр. Поэтому необходимо проанализировать тип и установить правильный.

Ошибка в типах

Я меняю тип 22 на varchar, а 23 на date с длиной как в исходной базе. Получится примерно следующее:

Настроенный Mapping

После успешной настройки mapping произойдет процедура импорта, длится она несколько минут.

Импорт

В итоге получится база данных MS SQL с данными регионов и адресов всех объектов в Российской Федерации (по данным ФИАС).

Работа с данными

Конечно импорт из DBF в MS SQL интересное занятие но толку он этих данных не очень много без предварительной обрабоки. 

Для того, чтобы получить список регионов (субъектов РФ) необходимо выполнить стандартные процедуры по настройке Entity Framework. Далее следующий код возвращает список регионов.

   List<ADDROBJ> root = dc.ADDROBJs.Where(x => x.AOLEVEL == level && x.ACTSTATUS == 1).OrderBy(x => x.OFFNAME).ToList();

 Для в каждом регионе есть REGIONCODE - код региона. Его следует запомнить, по этому коду можно легко и удобно получить города.

private static List<ADDROBJ> GetAddressesByParentGUID(int regionCode)
        {
            string[] citiesCodes = new string[]
                {
                    “г”, //Город
                    “п”, //Поселок
                    “с”, //Село
                    “д”  //Деревня
                };
            using (FIASDataContext dc = new FIASDataContext())
            {
                List<ADDROBJ> root =
                    (from p in dc.ADDROBJs
                     where
                     p.ACTSTATUS == 1 &&
                     p.REGIONCODE == regionCode.ToString() &&
                     (citiesCodes.Contains(p.SHORTNAME))
                     select p).
                ToList();
                return root;
            }
        }

 Таким образом можно сделать свою базу регионов и городов в формате SQL Server

Ссылки

Комментарии

comments powered by Disqus