На прошлой неделе была выпущена новая версия API, в которой была добавлена возможность обратного геокодирования.
Обратное геокодирование - это процесс преобразования географических координат объекта в почтовый адрес.
Вызов обратного геокодирования отличается от прямого только тем, что вместо строки с адресом передаются координаты объекта.
Осуществлять обратное геокодирование можно с использованием любого из двух интерфейсов: http и javascript.
Пример использования обратного геокодера по http-интерфейсу.
http://geocode-maps.yande
Пример использования обратного геокодера по javascript-интерфейсу.
var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(37.611706,55.75862));
map.addOverlay(geocoder);
Первым результатом будет объект с точностью до дома, второй - до улицы и т. д. Тем самым каждый последующий результат будет более общим относительно предыдущего.
Инструмент "Информация" - это элемент управления, который позволяет по координатам щелчка мыши пользователя определять почтовый адрес объекта (или ближайший адрес к нему). Посмотреть инструмент в действии можно на странице maps.yandex.ru.
Используя javascript-интерефейс, т. е. объект YMaps.Geocoder можно создать аналог инструмента "Информация".
Создадим элемент управления (назовем его InformationControl), для этого реализуем интерфейс YMasp.IControl.
// Элемент управления "Информация"
function InformationControl () {
// Вызывается при добавлении элемента управления на карту
this.onAddToMap = function (parentMap) {}
// Вызывается при удалении элемента управления с карты
this.onRemoveFromMap = function () {}
}
При добавлении элемента управления на карту будет создаваться обработчик щелчков мыши по карте. При щелчке на карту будет добавляться метка с координатами щелчка мыши и результат геокодирования.
// Вызывается при добавлении элемента управления на карту
this.onAddToMap = function (parentMap) {
map = parentMap;
// Создание обработчика кликов по карте
listener = YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
// Выключаем обработчиков событий, чтобы к геокодеру ушло не более одного запроса
// (по окончанию геокодированияю включаем обработчик вновь)
listener.disable();
// Координаты клика мышью
var clickPoint = mEvent.getGeoPoint();
...
// Отмечаем точку по которой щелкнул пользователь
clickPlace = new YMaps.Placemark(clickPoint, {style: anchorStyle});
clickPlace.description = clickPoint.toString();
map.addOverlay(clickPlace);
// Запуск процесс геокодирования
this.geocode(clickPoint);
}, this);
}
Метод geocode() запускает процесс геокодирования и добавляет результат на карту. В данном методе создаются обработчики для событий геокодера Load и Fault, в которых происходит обработка результатов поиска (в частности, включается обработчиков кликов по карте).
// Геокодирует точку
this.geocode = function (clickPoint) {
// Запуск процесса геокодирования
var geocoder = new YMaps.Geocoder(clickPoint);
// Обработчик успешного завершения геокодирования
YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
// Получение результата поиска
geoResult = this.getResult(geocoder);
if (geoResult) {
map.addOverlay(geoResult);
geoResult.openBalloon();
} else {
alert("Ничего не найдено!");
}
// Включаем обработчик кликов по карте
listener.enable();
}, this);
// Обработчик неудачного геокодирования
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, err) {
alert("Произошла ошибка при геокодировании: " + err);
// Включаем обработчик кликов по карте
listener.enable();
});
Метод getResult() возвращает результат с различной точностью в зависимости от масштаба.
// Возвращает результат различной точности в зависимости от масштаба
this.getResult = function (geocoder) {
// Точность: город, страна
function isOther (result) {
return result.precision == "other";
}
// Точность: улица
function isStreet (result) {
return result.precision == "street";
}
// Точность: дом
function isHouse (result) {
return !isOther(result) && !isStreet(result);
};
// Выбор точности поиска
var filter = isHouse;
if (map.getZoom() < 10) {
filter = isOther;
} else if (map.getZoom() < 15) {
filter = isStreet;
}
// Возвращает первый найденный результат
return geocoder.filter(filter)[0];
}
Создадим экземпляр созданного класса InformationControl, а также кнопку на панели инструментов, которая позволит включать и выключать созданный элемент управления.
// Создание элемента управления "Информация"
var informationControl = new InformationControl();
// Создание новой кнопки
// Добавляем ее к стандартной группе кнопок на панеле инструментов
var buttonInformation = new YMaps.ToolBarRadioButton(YMaps.ToolBar.DEFAULT_GRO UP, {
icon: "http://maps.yandex.ru/i/info-button.png",
hint: "Информация"
});
// Включение/выключение инструмента "Информация"
YMaps.Events.observe(buttonInformation, buttonInformation.Events.Select, function () {
map.addControl(informationControl);
});
YMaps.Events.observe(buttonInformation, buttonInformation.Events.Deselect, function () {
map.removeControl(informationControl);
});
// Добавление элементов управления на карту
var toolBar = new YMaps.ToolBar();
toolBar.add(buttonInformation);
map.addControl(toolBar);
Посмотреть пример в действии можно по адресу: http://rodlex.narod.ru/ex