Поиск по индексу, Возможность поиска местоположений по индексу
Алексей
Гость
12.12.2012 18:19:14
Здравствуйте. Подскажите можно ли с помощью имеющегося API получить местоположение основываясь на индексе - т.е. имеется индекс 183038, при обращении через API получаем г. Мурманск, ул. Миронова, д. 3. Видел есть компонент который позволяет по адресу в итоге получить индекс, хотелось бы решить обратную задачу - по индексу - адрес.
Алексей, здравствуйте! С помощью функции SKladrEntry::GetList можно определить код КЛАДР для индекса, если выбрать с фильтром по индексу элемент. Потом, например, с помощью функции SKladr::GetPostAddrString получить адрес по этому коду КЛАДР в виде строки, или с помощью SKladr::GetPostAddr в виде массива.
Описание api:
Если что-то непонятно из описания api, можно посмотреть в коде модуля, если у вас он зарегистрирован. Например, примеры использования функции SKladrEntry::GetList есть в разных функциях.
В код я и посмотрел (и в принципе подход через SKladrEntry::GetList сразу "заприметил";), но в том то и дело код $arRes = SKladrEntry::GetList("", array("NAME"=>"ASC";), "00", array("ZIP" => "183038";), array("NAME","CODE","SOCR","ZIP";)); в явном виде обращается к регионам. Даже что бы понять какую таблицу выбрать для поиска и фильтрации - необходим код.
Алексей, у меня сейчас нет под рукой сайта с кладром чтобы точно сказать, но может получится сначала определить код региона через SKladrEntry::GetList, с фильтром array("ZIP" => "183%") или array("ZIP" => "183000"), а потом использовать полученный двузначный код региона уже при выборке адреса, т.е. при следующем вызове SKladrEntry::GetList. Например, у региона Санкт-Петербург индекс 198000, я не помню точно у всех регионов аналогично или нет, посмотрите, если да, то этот способ должен работать.
Или еще другой вариант: выбрать с помощью SKladrEntry::GetList все регионы, потом сделать SQL запрос из нескольких таблиц. Сложность состоит в том, что сначала искать в таблицах с домами, потом, если ничего не найдено, в таблицах с улицами, а если не найдено там, то в таблицах с остальными уровнями кладр (1-4).
Вот структура таблиц:
Цитата
4. Таблицы с данными регионов
Для каждого региона - 4 таблицы: g_kladr_kladr_NN, g_kladr_street_NN, g_kladr_doma_NN, g_kladr_altnames_NN, где NN - двузначный код региона.
Таблица g_kladr_kladr_NN
Стандартные поля КЛАДР:
Поле Тип Ноль По умолчанию NAME varchar(40) Да NULL SOCR varchar(10) Да NULL CODE char(13) Да NULL ZIP varchar(6) Да NULL GNINMB varchar(4) Да NULL UNO varchar(4) Да NULL OCATD varchar(11) Да NULL STATUS varchar(1) Да NULL
Дополнительные поля:
Поле Тип Ноль По умолчанию Описание ACTIVE char(1) Нет 'Y' Активность SORT int(11) Нет 100 Сортировка
Таблица g_kladr_street_NN
Стандартные поля КЛАДР
Поле Тип Ноль По умолчанию NAME varchar(40) Да NULL SOCR varchar(10) Да NULL CODE char(17) Да NULL ZIP varchar(6) Да NULL GNINMB varchar(4) Да NULL UNO varchar(4) Да NULL OCATD varchar(11) Да NULL
Дополнительные поля:
Поле Тип Ноль По умолчанию Описание ACTIVE char(1) Нет 'Y' Активность SORT int(11) Нет 100 Сортировка
Таблица g_kladr_doma_NN
Стандартные поля КЛАДР:
Поле Тип Ноль По умолчанию NAME varchar(40) Да NULL KORP varchar(10) Да NULL SOCR varchar(10) Да NULL CODE char(19) Да NULL ZIP varchar(6) Да NULL GNINMB varchar(4) Да NULL UNO varchar(4) Да NULL OCATD varchar(11) Да NULL
Таблицы создаются только если загружен соответствующий регион, поэтому нужно сначала выбрать какие регионы загружены с помощью SKladrEntry::GetList.
Но сами sql запросы будет несложные, хоть и длинные (просто названия нескольких таблиц указываются через запятую в отличие от выборки из одной таблицы):
Таким образом можно сделать функцию для поиска по индексу.