Прямое геокодирование

Open in CodeSandbox

API позволяет определять координаты объекта по его названию (прямое геокодирование) и название объекта по его координатам (обратное геокодирование).

Оба вида геокодирования производятся с помощью функции geocode. Результат, возвращаемый этой функцией, может быть сразу размещён на карте.

В данном примере используется прямое геокодирование: чтобы на карте отметить Нижний Новгород, определяются координаты его центра, после чего на карту добавляется метка с найденными координатами.

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

<!DOCTYPE html>

<html>
    <head>
        <title>Прямое геокодирование</title>
        <meta
            http-equiv="Content-Type"
            content="text/html; charset=utf-8"
        />
        <!--
        Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
        Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
    -->
        <script
            src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&amp;apikey=<ваш API-ключ>"
            type="text/javascript"
        ></script>
        <script src="direct_geocode.js" type="text/javascript"></script>
        <style type="text/css">
            html,
            body,
            #map {
                width: 100%;
                height: 100%;
                margin: 0;
                padding: 0;
            }
        </style>
    </head>
    <body>
        <div id="map" />
    </body>
</html>
ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map("map", {
        center: [55.753994, 37.622093],
        zoom: 9,
    });

    // Поиск координат центра Нижнего Новгорода.
    ymaps
        .geocode("Нижний Новгород", {
            /**
             * Опции запроса
             * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/geocode.xml
             */
            // Сортировка результатов от центра окна карты.
            // boundedBy: myMap.getBounds(),
            // strictBounds: true,
            // Вместе с опцией boundedBy будет искать строго внутри области, указанной в boundedBy.
            // Если нужен только один результат, экономим трафик пользователей.
            results: 1,
        })
        .then(function (res) {
            // Выбираем первый результат геокодирования.
            var firstGeoObject = res.geoObjects.get(0),
                // Координаты геообъекта.
                coords = firstGeoObject.geometry.getCoordinates(),
                // Область видимости геообъекта.
                bounds = firstGeoObject.properties.get("boundedBy");

            firstGeoObject.options.set(
                "preset",
                "islands#darkBlueDotIconWithCaption"
            );
            // Получаем строку с адресом и выводим в иконке геообъекта.
            firstGeoObject.properties.set(
                "iconCaption",
                firstGeoObject.getAddressLine()
            );

            // Добавляем первый найденный геообъект на карту.
            myMap.geoObjects.add(firstGeoObject);
            // Масштабируем карту на область видимости геообъекта.
            myMap.setBounds(bounds, {
                // Проверяем наличие тайлов на данном масштабе.
                checkZoomRange: true,
            });

            /**
             * Все данные в виде javascript-объекта.
             */
            console.log(
                "Все данные геообъекта: ",
                firstGeoObject.properties.getAll()
            );
            /**
             * Метаданные запроса и ответа геокодера.
             * @see https://api.yandex.ru/maps/doc/geocoder/desc/reference/GeocoderResponseMetaData.xml
             */
            console.log("Метаданные ответа геокодера: ", res.metaData);
            /**
             * Метаданные геокодера, возвращаемые для найденного объекта.
             * @see https://api.yandex.ru/maps/doc/geocoder/desc/reference/GeocoderMetaData.xml
             */
            console.log(
                "Метаданные геокодера: ",
                firstGeoObject.properties.get(
                    "metaDataProperty.GeocoderMetaData"
                )
            );
            /**
             * Точность ответа (precision) возвращается только для домов.
             * @see https://api.yandex.ru/maps/doc/geocoder/desc/reference/precision.xml
             */
            console.log(
                "precision",
                firstGeoObject.properties.get(
                    "metaDataProperty.GeocoderMetaData.precision"
                )
            );
            /**
             * Тип найденного объекта (kind).
             * @see https://api.yandex.ru/maps/doc/geocoder/desc/reference/kind.xml
             */
            console.log(
                "Тип геообъекта: %s",
                firstGeoObject.properties.get(
                    "metaDataProperty.GeocoderMetaData.kind"
                )
            );
            console.log(
                "Название объекта: %s",
                firstGeoObject.properties.get("name")
            );
            console.log(
                "Описание объекта: %s",
                firstGeoObject.properties.get("description")
            );
            console.log(
                "Полное описание объекта: %s",
                firstGeoObject.properties.get("text")
            );
            /**
             * Прямые методы для работы с результатами геокодирования.
             * @see https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeocodeResult-docpage/#getAddressLine
             */
            console.log("\nГосударство: %s", firstGeoObject.getCountry());
            console.log(
                "Населенный пункт: %s",
                firstGeoObject.getLocalities().join(", ")
            );
            console.log(
                "Адрес объекта: %s",
                firstGeoObject.getAddressLine()
            );
            console.log(
                "Наименование здания: %s",
                firstGeoObject.getPremise() || "-"
            );
            console.log(
                "Номер здания: %s",
                firstGeoObject.getPremiseNumber() || "-"
            );

            /**
             * Если нужно добавить по найденным геокодером координатам метку со своими стилями и контентом балуна, создаем новую метку по координатам найденной и добавляем ее на карту вместо найденной.
             */
            /**
             var myPlacemark = new ymaps.Placemark(coords, {
             iconContent: 'моя метка',
             balloonContent: 'Содержимое балуна <strong>моей метки</strong>'
             }, {
             preset: 'islands#violetStretchyIcon'
             });

             myMap.geoObjects.add(myPlacemark);
             */
        });
}