В качестве документации использовались данные статьи: http://wiki.gis-lab.info/w/%D0%A4%D0%98%D0%90%D0%A1
Исходные скрипты были взяты из gist: https://gist.github.com/wiz/4244207
Все манипуляции проводились на postgresql
версии 10, однако всё должно
работать и на младших версиях 9.x.
Краткая суть импорта данных заключается в следующем:
- Импорт данных из
*.dbf
файлов в postgresql используя утилитуpgdbf 0.6.2
. - Приведение полученной схемы данных в надлежащее состояние, в т.ч. изменение типа данных колонок.
- Удаление исторических данных (неактуальных адресных объектов) - опционально, см. пункт 6 секции "Использование"
- Создание индексов
В скрипте импортируются только следующие таблицы:
addrobj
- Классификатор адресообразующих элементов (край > область > город > район > улица)house
- Сведения по номерам домов улиц городов и населенных пунктов, номера земельных участков и т.пsocrbase
- Типы адресных объектов (условные сокращения и уровни подчинения)
Если необходимо импортировать и другие данные, то это можно сделать с помощью
правки скрипта import.sh
.
Скачать rar-архив с DBF-файлами сайта ФИАС
Распаковать его в директорию _data
ВМЕСТО ПУНКТОВ 4,6,7 (если не требуется пункт 5) можно выполнить:
bash index.sh <DB> <SCHEMA> <OPTIONS>
Создать БД и таблицы (где * - название таблиц) и провести начальный импорт данных, для каждой таблицы выполнить:
bash import_*.sh <DB> <SCHEMA> <OPTIONS>
Если нужно, изменить настройки обновления схемы данных в schema.json и выполнить скрипт
update_schema.py
. Это создаст обновлённый файлupdate_schema.sql
:python update_schema.py
Обновить схему данных:
PGOPTIONS=--search_path=<SCHEMA> psql -f update_schema.sql -d <DB> <OPTIONS>
Удалить неактуальные данные и создать индексы (где * - название таблиц, либо _before - для подготовительных операций, _after - для создания view и mview):
PGOPTIONS=--search_path=<SCHEMA> psql -f indexes_*.sql -d <DB> <OPTIONS>
Проверить скорость выполнения следующих запросов:
-- вывести полный адрес WITH RECURSIVE child_to_parents AS ( SELECT addrobj.* FROM addrobj WHERE aoid = '51f21baa-c804-4737-9d5f-9da7a3bb1598' UNION ALL SELECT addrobj.* FROM addrobj, child_to_parents WHERE addrobj.aoguid = child_to_parents.parentguid AND addrobj.currstatus = 0 ) SELECT * FROM child_to_parents ORDER BY aolevel; -- поиск по части адреса SELECT * FROM addrobj WHERE formalname ILIKE '%Ульян%';
- <DB> - название бд
- <SCHEMA> - название схемы (по дефолту public)
- <OPTIONS> - другие опции и флаги psql (см. документацию psql). Например: '-hlocalhost -Uxlazex -p5432'