Клуб API Карт

Обратное геокодирование

Карты
1 февраля 2010, 15:45

На прошлой неделе была выпущена новая версия API, в которой была добавлена возможность обратного геокодирования.

Обратное геокодирование - это процесс преобразования географических координат объекта в почтовый адрес.

Вызов обратного геокодирования отличается от прямого только тем, что вместо строки с адресом передаются координаты объекта.

Осуществлять обратное геокодирование можно с использованием любого из двух интерфейсов: http и javascript.

Пример использования обратного геокодера по http-интерфейсу.
http://geocode-maps.yandex.ru/1.x/?geocode=37.611706,55.75862&key=API-ключ

Пример использования обратного геокодера по javascript-интерфейсу.

var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(37.611706,55.75862));

map.addOverlay(geocoder);


Первым результатом будет объект с точностью до дома, второй - до улицы и т. д. Тем самым каждый последующий результат будет более общим относительно предыдущего.

На основе javascript-интерфейса создадим инструмент "Информация".
 
Инструмент "Информация" - это элемент управления, который позволяет по координатам щелчка мыши пользователя определять почтовый адрес объекта (или ближайший адрес к нему). Посмотреть инструмент в действии можно на странице
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, в которых происходит обработка результатов поиска (в частности, включается обработчиков кликов по карте).
При успешном результате геокодирования наиболее релевантный результат геокодирования (если он был найден с помощью метода getResult()) добавляется на карту. 
 
 // Геокодирует точку
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 isCountry (result) {
        return result.kind == "country" || result.kind == "province" || result.kind == "locality";
    }

    // Точность: улица
    function isStreet (result) {
        return result.kind == "street" || result.kind == "district";
    }

    // Точность: дом
    function isHouse (result) {
        return !isCountry(result) && !isStreet(result);
    };

    // Выбор точности поиска
    var filter = isHouse;
    if (map.getZoom() < 10) {
        filter = isCountry;
    } 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_GROUP, {
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://ymaps.narod2.ru/examples/reversegeocoderinformation.html
Обратное геокодирование

===Эта статья относится к старой версии API Яндекс.Карт — 1.х. Рекомендуем использовать API 2.0 Яндекс.Карт.=== 

На прошлой неделе была выпущена новая версия API 1.х, в которой была добавлена возможность обратного геокодирования.

Обратное геокодирование - это процесс преобразования географических координат объекта в почтовый адрес.

Вызов обратного геокодирования отличается от прямого только тем, что вместо строки с адресом передаются координаты объекта.

Осуществлять обратное геокодирование можно с использованием любого из двух интерфейсов: http и javascript.

Пример использования обратного геокодера по http-интерфейсу.
http://geocode-maps.yandex.ru/1.x/?geocode=37.611706,55.75862&key=API-ключ

Пример использования обратного геокодера по javascript-интерфейсу.

var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(37.611706,55.75862)

map.addOverlay(geocoder);


Первым результатом будет объект с точностью до дома, второй - до улицы и т. д. Тем самым каждый последующий результат будет более общим относительно предыдущего.

На основе javascript-интерфейса создадим инструмент "Информация".
 
Инструмент "Информация" - это элемент управления, который позволяет по координатам щелчка мыши пользователя определять почтовый адрес объекта (или ближайший адрес к нему). Посмотреть инструмент в действии можно на странице 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, в которых происходит обработка результатов поиска (в частности, включается обработчиков кликов по карте).
При успешном результате геокодирования наиболее релевантный результат геокодирования (если он был найден с помощью метода getResult()) добавляется на карту. 
 
 // Геокодирует точку
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 isCountry (result) {
        return result.kind == "country" || result.kind == "province" || result.kind == "locality";
    }

    // Точность: улица
    function isStreet (result) {
        return result.kind == "street" || result.kind == "district";
    }

    // Точность: дом
    function isHouse (result) {
        return !isCountry(result) && !isStreet(result);
    };

    // Выбор точности поиска
    var filter = isHouse;
    if (map.getZoom() < 10) {
        filter = isCountry;
    } 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_GROUP, {
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://ymaps.narod2.ru/examples/reversegeocoderinformation.html