ФИАС

Полезные базы данных: города, страны, ZIP-коды и т.д.
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

ФИАС

Сообщение alexk984 »

http://fias.nalog.ru/Public/DownloadPage.aspx никто не парсил?
Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

Re: ФИАС

Сообщение Dismal »

Есть ли преимущества перед КЛАДРом? Я КЛАДР в проектах использую.
В mysql формате: http://www.yegorov-p.ru/proekty/kladr-v-mysql
И здесь, на форуме несколько раз выкладывали.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ФИАС

Сообщение samdark »

ФИАС — преемник КЛАДР. Насколько слышал, его распространяют в том числе и в КЛАДР-совместимом формате.
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: ФИАС

Сообщение mat.twg »

Прикрепить бы тему - очень актуальное обсуждение в разрезе Yii.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ФИАС

Сообщение samdark »

Готово.
chelishchevi
Сообщения: 86
Зарегистрирован: 2011.11.03, 15:34
Откуда: Калининград

Re: ФИАС

Сообщение chelishchevi »

Конвертирую ФИАС в pg с помощью pg2dbf утилиты. Плюс использую ltree расширение для postgres'a.
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: ФИАС

Сообщение mat.twg »

так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Hett
Сообщения: 127
Зарегистрирован: 2011.04.25, 07:18

Re: ФИАС

Сообщение Hett »

Какое отношение данная тема имеет к Yii? оО
Hett
Сообщения: 127
Зарегистрирован: 2011.04.25, 07:18

Re: ФИАС

Сообщение Hett »

mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Если нужна скорость, то XML тут явно лишний.
Аватара пользователя
resurtm
Сообщения: 299
Зарегистрирован: 2010.12.19, 09:13
Откуда: Казахстан, Алма-Ата
Контактная информация:

Re: ФИАС

Сообщение resurtm »

mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Воспользоваться SAX парсером может стоит?
zlom
Сообщения: 1
Зарегистрирован: 2012.09.26, 13:19

Re: ФИАС

Сообщение zlom »

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

Re: ФИАС

Сообщение matperez »

С помощью XMLReader потоково довольно просто парсится. Подробности тут можно найти http://www.ibm.com/developerworks/ru/li ... index.html
sashaYY
Сообщения: 42
Зарегистрирован: 2013.01.31, 23:25
Откуда: Краснодар
Контактная информация:

Re: ФИАС

Сообщение sashaYY »

Если нужно, могу выложить свой сырой проект работы с бд ФИАС, от закачки и обновления до поиска по ней, но только с одним предложением, помочь сделать ее быстрее и лучше)) Ссылку в обед скину.
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: ФИАС

Сообщение 6pblcb »

http://basicdata.ru/
Наш сервис предназначен для того, чтобы сделать удобной работу с общедоступными данными. В настоящее время представлены все таблицы базы данных ФИАС — Федеральной Информационной Адресной Системы. Просматривайте данные онлайн на нашем сайте, скачайте дамп базы в формате SQL или воспользуйтесь нашим API для получения данных в формате JSON.
ps: отношения к сайту не имею, просто сечас реализовываю поиск по базе ФИАС на проекте
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
sashaYY
Сообщения: 42
Зарегистрирован: 2013.01.31, 23:25
Откуда: Краснодар
Контактная информация:

Re: ФИАС

Сообщение sashaYY »

Сегодня выложу код на гитхаб. Как раз проблемы и есть в поиске, т.к доки нормальной к описанию ФИАСа по интервалам домов(HouseInt) и по частным случаям домов(Houses) не нашел, по этому и выкладываю, чтобы сделать сделать всем хорошо. В КЛАДР хоть структура была понятно описана поиска.
sashaYY
Сообщения: 42
Зарегистрирован: 2013.01.31, 23:25
Откуда: Краснодар
Контактная информация:

Re: ФИАС

Сообщение sashaYY »

https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.
ol5
Сообщения: 2
Зарегистрирован: 2013.02.13, 15:03
Контактная информация:

Re: ФИАС

Сообщение ol5 »

Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.
freewill
Сообщения: 13
Зарегистрирован: 2011.12.26, 16:48

Re: ФИАС

Сообщение 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" соответствие).
MaxS
Сообщения: 9
Зарегистрирован: 2009.09.01, 08:25
Откуда: Moscow
Контактная информация:

Re: ФИАС

Сообщение MaxS »

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

вообще надо сделать виджет с выпадающими списками адресных объектов и автокомплитом на улицу, т.к. довольно многим необходим подобный функционал с выбором адреса.
MaxS
Сообщения: 9
Зарегистрирован: 2009.09.01, 08:25
Откуда: Moscow
Контактная информация:

Re: ФИАС

Сообщение 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;
   }


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

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