- PVSM.RU - https://www.pvsm.ru -
Столкнулись мы как-то с необходимостью ввода корректной информации о местонахождении (прописке, регистрации) пользователей, и с тем, что проблема эта решается не совсем так легко и просто, как бы нам хотелось. Сначала мы попробовали КЛАДР, в его бесплатной ипостаси. Не то чтобы нам прямо-таки решительно все не понравилось, но было как минимум одно весьма раздражающее обстоятельство — некоторые адреса отсутствовали в справочнике. Например, дом 10 есть, а 10к1 — извините, не завезли. Вообще КЛАДР был привлекателен тем, что у него есть простой API и плагины (jQuery в частности), которые можно легко встроить в приложение, но отталкивал наполнением. Мы задумались — если нет такого ресурса, содержащего полную и наиболее актуальную адресную информацию, с API и плагинами, то единственный выход — создать такой ресурс самим.
И прослышали мы про ФИАС. О том как он бесконечно полон и прекрасен. А это выход! На сайте ФИАС есть базы, и все что нужно молодой растущей информационной системе! Правда, размер базы составляет более 4 Gb, ну да ладно, это же вся Россия! Обновляется база регулярно, так что есть где разгуляться. Дело за малым — развернуть базу, прикрутить API и плагины. Надо оговориться, что существует несколько релевантных и важных статей. К примеру, цикл вот этих статей [1], которые изначально очень помогли.
Проблемы начались с того, что база данных ФИАС поставляется в формате .dbf, данные из которого надо было как-то перенести в PostgreSQL, который было решено использовать в качестве БД.
Нужно отметить, что кроме формата .dbf, база представлена в формате xml. Как известно, человеку хочется всего и сразу. Чтобы включил и работает. Но разобраться сразу с тем, что же дает ФИАС довольно проблематично.
Итак, по адресу fias.nalog.ru в разделе обнлвлений имеется следующее:
Примечание: для работы с .dbf файлами необходимо установить стороннее расширение для php_dbase.dll.
Так какую же все таки выбрать версию для скачивания .xml или .dbf? Отличия следующие:
Итак, распаковали файлы. Какая информация нам нужна? Видим следующий набор файлов:
Кроме данных таблиц существует еще ряд других — служебных таблиц, которые содержат информацию о сокращениях в других таблицах.
В большинстве случаев достаточно сформировать адрес вплоть до дома. Хотя, если кому надо, то можно углубиться и дальше.
Таким образом, создадим 2 таблицы в БД postgresql.
Таблица с адресами:
CREATE TABLE addrs
(
"ACTSTATUS" integer,
"AOGUID" character varying(36) COLLATE pg_catalog."default",
"AOID" character varying(36) COLLATE pg_catalog."default",
"AOLEVEL" integer,
"AREACODE" integer,
"AUTOCODE" integer,
"CENTSTATUS" integer,
"CITYCODE" integer,
"CODE" character varying(20) COLLATE pg_catalog."default",
"CURRSTATUS" integer,
"ENDDATE" timestamp,
"FORMALNAME" character varying(120) COLLATE pg_catalog."default",
"IFNSFL" integer,
"IFNSUL" integer,
"NEXTID" character varying(36) COLLATE pg_catalog."default",
"OFFNAME" character varying(120) COLLATE pg_catalog."default",
"OKATO" VARCHAR(11),
"OKTMO" VARCHAR(11),
"OPERSTATUS" integer,
"PARENTGUID" character varying(36) COLLATE pg_catalog."default",
"PLACECODE" integer,
"PLAINCODE" character varying(20) COLLATE pg_catalog."default",
"POSTALCODE" integer,
"PREVID" character varying(36) COLLATE pg_catalog."default",
"REGIONCODE" integer,
"SHORTNAME" character varying(15) COLLATE pg_catalog."default",
"STARTDATE" timestamp,
"STREETCODE" integer,
"TERRIFNSFL" integer,
"TERRIFNSUL" integer,
"UPDATEDATE" timestamp,
"CTARCODE" integer,
"EXTRCODE" integer,
"SEXTCODE" integer,
"LIVESTATUS" integer,
"NORMDOC" character varying(36) COLLATE pg_catalog."default",
"PLANCODE" integer,
"CADNUM" integer,
"DIVTYPE" integer
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE address
OWNER to postgres;
Таблица с номерами домов:
CREATE TABLE hous
(
"AOGUID" character varying(36) COLLATE pg_catalog."default",
"BUILDNUM" character varying(10) COLLATE pg_catalog."default",
"ENDDATE" timestamp,
"ESTSTATUS" integer,
"HOUSEGUID" character varying(36) COLLATE pg_catalog."default",
"HOUSEID" character varying(36) COLLATE pg_catalog."default",
"HOUSENUM" character varying(15) COLLATE pg_catalog."default",
"STATSTATUS" integer,
"IFNSFL" integer,
"IFNSUL" integer,
"OKATO" VARCHAR(11),
"OKTMO" VARCHAR(11),
"POSTALCODE" integer,
"STARTDATE" timestamp,
"STRUCNUM" VARCHAR(15),
"STRSTATUS" integer,
"TERRIFNSFL" integer,
"TERRIFNSUL" integer,
"UPDATEDATE" timestamp,
"NORMDOC" character varying(36) COLLATE pg_catalog."default",
"COUNTER" integer,
"CADNUM" VARCHAR(50),
"DIVTYPE" integer
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
Импорт данных осуществляется простым способом. Открываем файлы в Excel и сохраняем их как csv. Дополнительно рекомендуется изменить кодировку, так как в отличии от xml файлов, которые представлены в кодировке utf-8, dbf файлы — в кодировке win-866. Открываем файлы в редакторе (для данной цели подойдет notepad++) и преобразуем в utf-8.
Импорт таблицы с адресами:
COPY addrs FROM 'PathToTheFileADDROB01.csv' DELIMITER ';' CSV;
Импорт таблицы с домами:
COPY addrs FROM 'PathToTheFileHOUSE30.csv' DELIMITER ';' CSV;
Из чего сделана таблица ADDROBXX?
Несмотря на обилие полей, понадобятся только некоторые из них.
Примечание: на fias-nalog.ru можно найти полное описание всех полей.
Важное в таблице HOUSEXX:
Поля могут содержать схожую или идентичную информацию и выходить из ситуации приходится экспериментальным путем. В классе QuerryController (ссылка на репозиторий — ниже) есть метод: chooseBuilding, в котором мы попытались решить эту задачу. Может быть у кого-то получится лучше. Запросы к БД находятся там же.
Далее, после того, как база была импортирована в Postgres — мы занялись созданием API и плагина для нашей системы.
Для API, дабы не изгаляться, использовали Laravel. Схема запросов получилась достаточно простой. Иерархия объектов выглядит следующим образом:
К слову, тестируя систему, мы столкнулись с тем, что не во всех населенных пунктах есть улицы, и не на всех улицах есть дома, что нас немало удивило, и озадачило. Это обстоятельство не давало покоя потому, что если предоставить пользователю возможность самому вводить информацию, то понапишут такого, что невольно возникает вопрос — “Эти люди вообще в школе-то учились?!”.
Поэтому было решено не давать пользователю ни малейшей возможности для самодеятельности, а для таких вот “отсутствующих” адресов предоставить возможность подать заявку на включение отсутствующего адреса в справочную систему.
Схема запросов выглядит просто:
Для последнего пункта формируется список домов с литерами, корпусами, строениями, и прочим.
После всех мытарств сделали плагин на vue.js, для работы со справочником, и его альтернативу на jQuery.
Регион и район можно убрать за ненадобностью, так как они подтягиваются вместе с городами.
При вводе высплывают autocomplete-подсказки, как и в КЛАДР. Правда разница заключается в том что КЛАДР-плагин предназначен для автодополнения, а здесь валидным считается только адрес, выбранный из подсказок.
В папке ASPUDcomponent — находится VueJs компонент для работы с адресной базой.
Исходники доступны в нашем репозитории [7].
С обновлениями ситуация следующая: для начала необходимо по протоколу SOAP получить версии обновлений. Посмотреть как это делается можно в классе UpdateController (метод: filesVersions()).
Примечание: версия, которая указана последней в полученном списке — не обязательно совпадает с той, которую можно скачать на главной странице. Но не стоит спешить скачивать только последнюю версию, так как она может оказаться “битой”. Случались и таким прецеденты. Далее скачивается архив с последней версией и распаковывается. Для работы необходимо использование расширения для php (php_rar.dll).
Ну а далее выбирается необходимый файл региона (или при необходимости все файлы) для обновления БД.
Автор: il_kow
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/postgresql/260517
Ссылки в тексте:
[1] этих статей: https://habrahabr.ru/post/316314/
[2] myfias/choose_dstrict: https://myfias/choose_dstrict
[3] myfias/choose_region: https://myfias/choose_region/
[4] myfias/choose_city: https://myfias/choose_city/
[5] myfias/choose_street: https://myfias/choose_street/
[6] myfias/choose_building: https://myfias/choose_building/
[7] нашем репозитории: https://github.com/KOVCHENKO/fias
[8] Источник: https://habrahabr.ru/post/333424/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.