ФИАС
Добавлено: 2012.03.25, 15:11
http://fias.nalog.ru/Public/DownloadPage.aspx никто не парсил?
Если нужна скорость, то XML тут явно лишний.mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
Воспользоваться SAX парсером может стоит?mat.twg писал(а):так! как работать с SQL вопросов не вызывает, но вот а как работать с XML Фиаса (не зря ведь его сделали), там есть схемы XSD и файл XML Адресов, где всё в одной 'куче' и весит под гиг. Простенький пасинг xml, который мне приходилось делать раньше тут выдаёт очень плохие результаты, явно нужно парсить как-то с XSD... покажите как или направьте на путь ссылкой на доку, пожалуйста.
ps: отношения к сайту не имею, просто сечас реализовываю поиск по базе ФИАС на проектеНаш сервис предназначен для того, чтобы сделать удобной работу с общедоступными данными. В настоящее время представлены все таблицы базы данных ФИАС — Федеральной Информационной Адресной Системы. Просматривайте данные онлайн на нашем сайте, скачайте дамп базы в формате SQL или воспользуйтесь нашим API для получения данных в формате JSON.
КЛАДР: этот запрос (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
Нужно, а кода так и нетsashaYY писал(а):https://github.com/liff4you/fias для тех кому нужно., код будет сегодня. Спс.
ol5 писал(а):Нужно для сайта сделать возможность выбрать адрес из справочника. странно прочитал документацию, но связать область, город, район, улицу и дом не получилось. подскажите есть где то пример как правильно сделать выборку из баз КЛАДРА или ФИАС.
Код: Выделить всё
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;
Код: Выделить всё
SELECT AOGUID,FORMALNAME,SHORTNAME,OKATO,POSTALCODE
FROM fias_addrobj fa
WHERE fa.AOLEVEL=1 AND fa.ACTSTATUS=1
ORDER BY FORMALNAME
Код: Выделить всё
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
Код: Выделить всё
SELECT 1
FROM fias_addrobj
WHERE PARENTGUID=? AND ACTSTATUS=1 AND AOLEVEL IN (7,90,91) limit 1
Код: Выделить всё
SELECT 1 FROM fias_house fh WHERE fh.AOGUID=? limit 1
Код: Выделить всё
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)
Код: Выделить всё
select OKATO,HOUSENUM,STRUCNUM,BUILDNUM,POSTALCODE FROM fias_house fh WHERE fh.AOGUID=? ORDER BY CAST(HOUSENUM as SIGNED)
Код: Выделить всё
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;
}