ФИАС
ФИАС
http://fias.nalog.ru/Public/DownloadPage.aspx никто не парсил?
Re: ФИАС
Есть ли преимущества перед КЛАДРом? Я КЛАДР в проектах использую.
В mysql формате: http://www.yegorov-p.ru/proekty/kladr-v-mysql
И здесь, на форуме несколько раз выкладывали.
В mysql формате: http://www.yegorov-p.ru/proekty/kladr-v-mysql
И здесь, на форуме несколько раз выкладывали.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: ФИАС
ФИАС — преемник КЛАДР. Насколько слышал, его распространяют в том числе и в КЛАДР-совместимом формате.
Нравится Yii? Давайте сделаем его лучше!.
Re: ФИАС
Прикрепить бы тему - очень актуальное обсуждение в разрезе Yii.
-
- Сообщения: 86
- Зарегистрирован: 2011.11.03, 15:34
- Откуда: Калининград
Re: ФИАС
Конвертирую ФИАС в pg с помощью pg2dbf утилиты. Плюс использую ltree расширение для postgres'a.
Re: ФИАС
так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Re: ФИАС
Какое отношение данная тема имеет к Yii? оО
Re: ФИАС
Если нужна скорость, то XML тут явно лишний.mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
- resurtm
- Сообщения: 299
- Зарегистрирован: 2010.12.19, 09:13
- Откуда: Казахстан, Алма-Ата
- Контактная информация:
Re: ФИАС
Воспользоваться SAX парсером может стоит?mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Re: ФИАС
Нашел програмулину для парсинга ФИАС, парсит XML файлы фиаса любого размера в mysql запросы
http://zgbox.ru/articles/soft/parsing-b ... xml-parser
http://zgbox.ru/articles/soft/parsing-b ... xml-parser
Re: ФИАС
С помощью XMLReader потоково довольно просто парсится. Подробности тут можно найти http://www.ibm.com/developerworks/ru/li ... index.html
Re: ФИАС
Если нужно, могу выложить свой сырой проект работы с бд ФИАС, от закачки и обновления до поиска по ней, но только с одним предложением, помочь сделать ее быстрее и лучше)) Ссылку в обед скину.
Re: ФИАС
http://basicdata.ru/
ps: отношения к сайту не имею, просто сечас реализовываю поиск по базе ФИАС на проектеНаш сервис предназначен для того, чтобы сделать удобной работу с общедоступными данными. В настоящее время представлены все таблицы базы данных ФИАС — Федеральной Информационной Адресной Системы. Просматривайте данные онлайн на нашем сайте, скачайте дамп базы в формате SQL или воспользуйтесь нашим API для получения данных в формате JSON.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Re: ФИАС
Сегодня выложу код на гитхаб. Как раз проблемы и есть в поиске, т.к доки нормальной к описанию ФИАСа по интервалам домов(HouseInt) и по частным случаям домов(Houses) не нашел, по этому и выкладываю, чтобы сделать сделать всем хорошо. В КЛАДР хоть структура была понятно описана поиска.
Re: ФИАС
https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.
Re: ФИАС
Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.
Re: ФИАС
Если еще актуально
Для последовательного заполнения формы от индекса к дому
Внимание! Структура таблиц (и названия) MySQL должна повторять КЛАДРовские DBF.
Да, и еще этот запрос не учитывает изменения кодов объектов (таблица ALTNAMES.DBF) - там муть страшная (последние 2 цифры kladr - это код атуальности, если не "00"("51"), то бла-бла-бла, ищи через "altnames" соответствие).
КЛАДР: этот запрос (MySQL) получает все адреса с кодами и сокращениями (от региона до домов/корпусов) "1-го нижнего уровня" по почтовому индексу (там, где запрос становится "последним" массивом значений).ol5 писал(а):Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.
Для последовательного заполнения формы от индекса к дому
Код: Выделить всё
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
Да, и еще этот запрос не учитывает изменения кодов объектов (таблица ALTNAMES.DBF) - там муть страшная (последние 2 цифры kladr - это код атуальности, если не "00"("51"), то бла-бла-бла, ищи через "altnames" соответствие).
Re: ФИАС
Нужно, а кода так и нетsashaYY писал(а):https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.
вообще надо сделать виджет с выпадающими списками адресных объектов и автокомплитом на улицу, т.к. довольно многим необходим подобный функционал с выбором адреса.
Re: ФИАС
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
$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 выбранного адресного объекта, на котором у нас существуют дома
Код: Выделить всё
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;
}
---------
Необходимо учитывать, что улицы могут принадлежать области или субъекту (Москва, например), Дом может принадлежать городу или области, и не быть привязанным какой-либо улице, На улице может не быть домов, могут отличаться типы объектов, например, вместо село - поселок.
Итак, что бы найти улицу - надо последовательно пройти от субъекта до нижнего уровня. Для использования на сайте такой механизм очень не удобен.
Оптимальный вариант - предложить пользователю ввести название своего населенного пункта - например, ввод с автокомплитом и в выпадающем списке предложить уточнить, к какой именно области он относится, т.к. много повторений названий населенных пунктов в разных областях. Ну и далее ввод улицы и дома.