Найти тему

Война с адресами

Помимо системного администрирования пытаюсь я заниматься сайтостроением. И понадобилось мне на одном из сайтов реализовать форму ввода адресов. Так?

Так да не так! Карты Яндекса (Геокодер) предлагают такую услугу платно и, что самое обидное, не слишком дёшево! Я ещё не начал зарабатывать, а уже плати. Так дело не пойдёт. КЛАДР во-первых устарел, во-вторых у него мутная схема лицензирования. Решено! Будем использовать ФИАС.

На пальцах. Есть Россия, в России есть субъекты - то есть области, края и республики. В субъектах есть главный мегаполис и районы. В мегаполисах есть микрорайоны. В районах есть райцентры и прочие населённые пункты. В населённых пунктах есть улицы. На улицах есть дома, в домах квартиры.

Вопреки фантазиям разводить гигантоманию незачем. На планете живёт всего 6 миллиардов человек, а в России - намного меньше. Поэтому каждый адрес проживания можно выразить всего-навсего 36-символьным идентификатором (в КЛАДР эта величина меньше, но сейчас не об этом).

Сайты работают на cgi-скриптах, для которых чаще всего используется язык php. Работают с базой данных, чаще всего MySQL, иногда MariaDB, реже PostgreSQL, очень редко Oracle или MS SQL. К сожалению, наши государственные органы распространяют базу ФИАС в устаревшем формате DBF или в новомодном текстовом формате XML.

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

Изучение вопроса привело нас на гитхаб, где, как оказалось уже есть готовые скрипты с простой и понятной инструкцией, что именно нам следует сделать. Увы, нам предлагают установить транслятор языка Python, его библиотеки и Git - и только после этого мы сможем воспользоваться указанными скриптами. По зрелом размышлении было принято решение - отказать! Чтобы потом не вычищать всё это из Windows, мы проведём конвертацию данных в виртуальной машине.

создание виртуальной машины
создание виртуальной машины

Для нужд конвертации я развёртываю ВМ на основе OpenBSD-6.6 amd64

Обратите внимание, скачанный fias_xml.rar имеет объём в 6 гигабайт (почти в полтора раза больше объёма DVD-диска), а в результате распаковки он займёт все 60 гигабайт. Поэтому место я в данном случае предпочту не экономить.

создаём диск объёмом 125 гигабайт
создаём диск объёмом 125 гигабайт

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

цепляем загрузочный носитель
цепляем загрузочный носитель

В самой установке и последующей настройке нет ничего сложного. Русифицируем систему, ставим git python unrar libxml libxslt и создаём в самом большом разделе папки, куда мы можем писать под пользователем.

Проверяем место, создаём папки, даём пользователю права на них
Проверяем место, создаём папки, даём пользователю права на них

Far Manager умеет FTP/SCP/SFTP - записываем с хоста в папку виртуалки скачанный архив ФИАС.

-5

Пока архив заливается, переходим в папку пользователя и от рута (иначе не будет прав на запись) даём команду:

git clone https://github.com/shadz3rg/ru_address.git && cd ru_address && python setup.py install

Эта команда создаст в домашней папке пользователя папку ru_address со всеми необходимыми скриптами. Теперь переходим в папку /var/ru_fias куда мы скачали архив на 6 гигабайт (напомню, у нас раздел /var самый большой - чтобы не беспокоиться о нехватке места) и даём команду распаковки загруженного архива. Ждём, пока он распакуется.

-6

После распаковки переходим в домашнюю папку пользователя и даём команду:

ru_address /var/ru_fias /var/ru_fias_output --join=fias.sql

Внимание! У меня эта команда не заработала - оказывается, все расширения XML-файлов были в прописном виде, а надо в строчном. Пришлось переименовать файлы. Ну и тот факт, что вместе с файлами .xml должны быть и файлы .xsd (описание структуры) я тоже пропустил. К счастью, по сравнению с основным тот архив занимает буквально копейки.

После этого всё заработало.

-7

Выполнения этой команды придётся немного подождать. Совсем немного, часов 10-12. Всё зависит от быстродействия Вашего компьютера. Затем в папке /var/ru_fias_output Вы обнаружите файлик fias.sql - у меня он получился объёмом 43 гигабайта. Многовато. Надо упаковать в zip-архив.

zip fias.sql.zip fias.sql

Эта команда тоже будет выполняться около часа. Архив у меня получился почти на 8 гигабайт. Впрочем, это не обязательно, но если Вы хотите его унести куда-то ещё (например, на работу), а флешка на 8-16 гигабайт, имеет смысл всё-таки воспользоваться архиватором. Впрочем, я перенёс этот файлик на хост-систему без сжатия.

-8

Остались сущие пустяки - развернуть полученный sql-файл в новую базу данных MySQL/ MariaDB.

Создаём базу данных и разворачиваем в неё данные из SQL-файла
Создаём базу данных и разворачиваем в неё данные из SQL-файла

Увы, но это займёт ОЧЕНЬ много времени - возможно, несколько дней. У меня на это ушло больше суток. Зато в итоге... База была импортирована, а свободный объём диска уменьшился примерно на 40 гигабайт.

PhpMyAdmin - база данных ФИАС, слева виден список таблиц, справа содержимое второй таблицы
PhpMyAdmin - база данных ФИАС, слева виден список таблиц, справа содержимое второй таблицы

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