Страница 1 из 2

ФИАС

Добавлено: 2012.03.25, 15:11
alexk984
http://fias.nalog.ru/Public/DownloadPage.aspx никто не парсил?

Re: ФИАС

Добавлено: 2012.03.25, 18:22
Dismal
Есть ли преимущества перед КЛАДРом? Я КЛАДР в проектах использую.
В mysql формате: http://www.yegorov-p.ru/proekty/kladr-v-mysql
И здесь, на форуме несколько раз выкладывали.

Re: ФИАС

Добавлено: 2012.03.25, 19:01
samdark
ФИАС — преемник КЛАДР. Насколько слышал, его распространяют в том числе и в КЛАДР-совместимом формате.

Re: ФИАС

Добавлено: 2012.04.06, 06:53
mat.twg
Прикрепить бы тему - очень актуальное обсуждение в разрезе Yii.

Re: ФИАС

Добавлено: 2012.04.06, 18:22
samdark
Готово.

Re: ФИАС

Добавлено: 2012.04.08, 14:23
chelishchevi
Конвертирую ФИАС в pg с помощью pg2dbf утилиты. Плюс использую ltree расширение для postgres'a.

Re: ФИАС

Добавлено: 2012.05.05, 15:41
mat.twg
так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.

Re: ФИАС

Добавлено: 2012.05.11, 20:15
Hett
Какое отношение данная тема имеет к Yii? оО

Re: ФИАС

Добавлено: 2012.05.11, 20:16
Hett
mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Если нужна скорость, то XML тут явно лишний.

Re: ФИАС

Добавлено: 2012.05.13, 16:10
resurtm
mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Воспользоваться SAX парсером может стоит?

Re: ФИАС

Добавлено: 2012.09.26, 13:22
zlom
Нашел програмулину для парсинга ФИАС, парсит XML файлы фиаса любого размера в mysql запросы
http://zgbox.ru/articles/soft/parsing-b ... xml-parser

Re: ФИАС

Добавлено: 2012.09.28, 02:23
matperez
С помощью XMLReader потоково довольно просто парсится. Подробности тут можно найти http://www.ibm.com/developerworks/ru/li ... index.html

Re: ФИАС

Добавлено: 2013.01.31, 23:40
sashaYY
Если нужно, могу выложить свой сырой проект работы с бд ФИАС, от закачки и обновления до поиска по ней, но только с одним предложением, помочь сделать ее быстрее и лучше)) Ссылку в обед скину.

Re: ФИАС

Добавлено: 2013.02.08, 11:08
6pblcb
http://basicdata.ru/
Наш сервис предназначен для того, чтобы сделать удобной работу с общедоступными данными. В настоящее время представлены все таблицы базы данных ФИАС — Федеральной Информационной Адресной Системы. Просматривайте данные онлайн на нашем сайте, скачайте дамп базы в формате SQL или воспользуйтесь нашим API для получения данных в формате JSON.
ps: отношения к сайту не имею, просто сечас реализовываю поиск по базе ФИАС на проекте

Re: ФИАС

Добавлено: 2013.02.12, 01:15
sashaYY
Сегодня выложу код на гитхаб. Как раз проблемы и есть в поиске, т.к доки нормальной к описанию ФИАСа по интервалам домов(HouseInt) и по частным случаям домов(Houses) не нашел, по этому и выкладываю, чтобы сделать сделать всем хорошо. В КЛАДР хоть структура была понятно описана поиска.

Re: ФИАС

Добавлено: 2013.02.12, 01:43
sashaYY
https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.

Re: ФИАС

Добавлено: 2013.02.13, 15:46
ol5
Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.

Re: ФИАС

Добавлено: 2013.02.16, 14:12
freewill
Если еще актуально
ol5 писал(а):Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.
КЛАДР: этот запрос (MySQL) получает все адреса с кодами и сокращениями (от региона до домов/корпусов) "1-го нижнего уровня" по почтовому индексу (там, где запрос становится "последним" массивом значений).
Для последовательного заполнения формы от индекса к дому

Код: Выделить всё

SELECT
t1.`index`,
t6.code region_code, t6.name region_name, t6.socr region_socr,
t5.code area_code, t5.name area_name, t5.socr area_socr,
t4.code town_code, t4.name town_name, t4.socr town_socr,
t3.code place_code, t3.name place_name, t3.socr place_socr,
t2.code street_code, t2.name street_name, t2.socr street_socr,
t1.code house_code, t1.name house_name, LOWER(t1.socr) house_socr, t1.korp house_korp
FROM doma t1
LEFT JOIN street t2 ON '0000'<>SUBSTR(t2.code,12,4) AND RPAD(SUBSTR(t1.code,1,15),17,'0')=t2.code
LEFT JOIN kladr t3 ON '000'<>SUBSTR(t3.code,9,3) AND RPAD(SUBSTR(t1.code,1,11),13,'0')=t3.code
LEFT JOIN kladr t4 ON '000'<>SUBSTR(t4.code,6,3) AND RPAD(SUBSTR(t1.code,1,8),13,'0')=t4.code
LEFT JOIN kladr t5 ON '000'<>SUBSTR(t5.code,3,3) AND RPAD(SUBSTR(t1.code,1,5),13,'0')=t5.code
LEFT JOIN kladr t6 ON RPAD(SUBSTR(t1.code,1,2),13,'0')=t6.code
WHERE t1.`index`='$post_index' /* почтовый индекс здесь */
GROUP BY region_code, area_code, town_code, place_code, street_code
ORDER BY region_name, area_name, town_name, place_name, street_name
Внимание! Структура таблиц (и названия) MySQL должна повторять КЛАДРовские DBF.
Да, и еще этот запрос не учитывает изменения кодов объектов (таблица ALTNAMES.DBF) - там муть страшная (последние 2 цифры kladr - это код атуальности, если не "00"("51"), то бла-бла-бла, ищи через "altnames" соответствие).

Re: ФИАС

Добавлено: 2013.02.18, 14:00
MaxS
sashaYY писал(а):https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.
Нужно, а кода так и нет :(

вообще надо сделать виджет с выпадающими списками адресных объектов и автокомплитом на улицу, т.к. довольно многим необходим подобный функционал с выбором адреса.

Re: ФИАС

Добавлено: 2013.02.27, 13:33
MaxS
ol5 писал(а):Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.

После импорта БД ФИАС из XML в MySQL (с помощью какой-то программки, которая перегоняет фиасовский исходник xml в sql-запросы, гуглится) получили таблицу fias_addrobj и таблицу с домами (в ней все понятно, дома относятся к адресному объекту из fias_addrobj по AOGUID)

Таблица с адресными объектами построена по принципу Adjacency List (т.е. родитель хранится в колонке PARENTGUID')

Ниже примерное описание таблицы addrobj, без учета истечения срока действия адреса и т.д.

Код: Выделить всё

CREATE TABLE `fias_addrobj` (
    `AOID` VARCHAR(36) NULL DEFAULT NULL,
    `AOGUID` VARCHAR(36) NULL DEFAULT NULL,
    `PARENTGUID` VARCHAR(36) NULL DEFAULT NULL,
    `FORMALNAME` VARCHAR(47) NULL DEFAULT NULL,
    `OFFNAME` VARCHAR(77) NULL DEFAULT NULL,
    `SHORTNAME` VARCHAR(10) NULL DEFAULT NULL,
    `AOLEVEL` TINYINT(1) NULL DEFAULT NULL,
    `REGIONCODE` TINYINT(2) NULL DEFAULT NULL,
    `AREACODE` TINYINT(3) NULL DEFAULT NULL,
    `AUTOCODE` TINYINT(1) NULL DEFAULT NULL,
    `CITYCODE` TINYINT(3) NULL DEFAULT NULL,
    `CTARCODE` TINYINT(3) NULL DEFAULT NULL,
    `PLACECODE` TINYINT(3) NULL DEFAULT NULL,
    `STREETCODE` TINYINT(4) NULL DEFAULT NULL,
    `EXTRCODE` TINYINT(4) NULL DEFAULT NULL,
    `SEXTCODE` TINYINT(3) NULL DEFAULT NULL,
    `PLAINCODE` VARCHAR(15) NULL DEFAULT NULL,
    `CODE` TINYINT(2) NULL DEFAULT NULL,
    `CURRSTATUS` TINYINT(2) NULL DEFAULT NULL,
    `ACTSTATUS` TINYINT(1) NULL DEFAULT NULL,
    `LIVESTATUS` TINYINT(1) NULL DEFAULT NULL,
    `CENTSTATUS` TINYINT(1) NULL DEFAULT NULL,
    `OPERSTATUS` TINYINT(2) NULL DEFAULT NULL,
    `IFNSFL` TINYINT(4) NULL DEFAULT NULL,
    `IFNSUL` TINYINT(4) NULL DEFAULT NULL,
    `TERRIFNSFL` TINYINT(4) NULL DEFAULT NULL,
    `TERRIFNSUL` TINYINT(4) NULL DEFAULT NULL,
    `OKATO` VARCHAR(11) NULL DEFAULT NULL,
    `OKTMO` INT(8) NULL DEFAULT NULL,
    `POSTALCODE` INT(6) NULL DEFAULT NULL,
    `STARTDATE` VARCHAR(10) NULL DEFAULT NULL,
    `ENDDATE` VARCHAR(10) NULL DEFAULT NULL,
    `UPDATEDATE` VARCHAR(10) NULL DEFAULT NULL,
    `NEXTID` VARCHAR(36) NULL DEFAULT NULL,
    `PREVID` VARCHAR(36) NULL DEFAULT NULL,
    `NORMDOC` VARCHAR(36) NULL DEFAULT NULL,
    INDEX `FORMALNAME` (`FORMALNAME`),
    INDEX `AOGUID` (`AOGUID`),
    INDEX `PARENTGUID` (`PARENTGUID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
 
В данной таблице содержатся все адресные объекты, от субъектов до ПГТ, проспектов, улиц, дорог и т.д.
в поле AOGUID содержится "уникальный" идентификатор адресного объекта. Поле PARENTGUID, соответственно, ссылка на вышестоящий объект.
AOLEVEL - уровень адресного объекта: 1- верхний (субъекты), 7 - нижний (улицы).

Выбор самого верхнего уровня "субъекты", куда входят республики, области и Москва с Санкт-Петербургом (да да, они суверенные субъекты):

Код: Выделить всё

SELECT AOGUID,FORMALNAME,SHORTNAME,OKATO,POSTALCODE 
FROM fias_addrobj fa
WHERE fa.AOLEVEL=1 AND fa.ACTSTATUS=1
ORDER BY FORMALNAME
Выбор нижестоящего адресного объекта
вместо ? полученный верхним запросом AOGUID

Код: Выделить всё

SELECT AOGUID,FORMALNAME,SHORTNAME,AOLEVEL,OKATO,POSTALCODE
FROM fias_addrobj fa
WHERE fa.PARENTGUID=? AND fa.ACTSTATUS=1 AND fa.AOLEVEL < 7
ORDER BY fa.FORMALNAME
Данный запрос выберет все адресные объекты, относящиеся к выбранному ранее субъекту (районы, города, поселки и т.д.)

Проверка наличия Улиц на выбранном адресном объекте:
вместо ? проверяемый AOGUID

Код: Выделить всё

SELECT 1
FROM fias_addrobj
WHERE PARENTGUID=? AND ACTSTATUS=1 AND AOLEVEL IN (7,90,91) limit 1
Проверка наличия Домов на выбранном адресном объекте
вместо ? проверяемый AOGUID

Код: Выделить всё

SELECT 1 FROM fias_house fh WHERE fh.AOGUID=? limit 1
Запрос на поиск улицы (для autocomplete)

$street - кусок названия улицы
? - AOGUID выбранного адресного объекта, на котором у нас существуют улицы

Код: Выделить всё

SELECT AOGUID, PARENTGUID, FORMALNAME, SHORTNAME,AOLEVEL,OKATO,POSTALCODE
FROM fias_addrobj
WHERE LOWER(FORMALNAME) REGEXP ' . $street . ' AND PARENTGUID=? AND ACTSTATUS=1 AND AOLEVEL IN (7,90,91)
Поиск дома по AOGUID
? - AOGUID выбранного адресного объекта, на котором у нас существуют дома

Код: Выделить всё

select OKATO,HOUSENUM,STRUCNUM,BUILDNUM,POSTALCODE FROM fias_house fh WHERE fh.AOGUID=? ORDER BY CAST(HOUSENUM as SIGNED)

Построение массива по сохраненному AOGUID

Достаточно сохранять AOGUID самого нижнего уровня, что бы дойти до верхнего (субъект).

пример функции для восстановления дерева адресных объектов по коду улицы.

$street_code = AOGUID

Код: Выделить всё

   public function tree_by_street($street_code)
   {
      $row['AOLEVEL'] = 7;
      $row['PARENTGUID'] = $street_code;

      $tree = Array();

      while ($row['AOLEVEL'] != 1)
      {
         $sql = 'SELECT AOGUID,FORMALNAME,SHORTNAME,PARENTGUID,AOLEVEL,OKATO,POSTALCODE
              FROM fias_addrobj fa
              WHERE fa.AOGUID=? AND fa.ACTSTATUS=1';
         $res = $this->db->query($sql, Array($row['PARENTGUID']));
         $row = $res->result_array();
         $row = $row[0];
         $tree[$row['AOLEVEL']] = $row;
      }

      return $tree;
   }


---------
Необходимо учитывать, что улицы могут принадлежать области или субъекту (Москва, например), Дом может принадлежать городу или области, и не быть привязанным какой-либо улице, На улице может не быть домов, могут отличаться типы объектов, например, вместо село - поселок.

Итак, что бы найти улицу - надо последовательно пройти от субъекта до нижнего уровня. Для использования на сайте такой механизм очень не удобен.
Оптимальный вариант - предложить пользователю ввести название своего населенного пункта - например, ввод с автокомплитом и в выпадающем списке предложить уточнить, к какой именно области он относится, т.к. много повторений названий населенных пунктов в разных областях. Ну и далее ввод улицы и дома.