Поиск ближайшего объекта

Open in CodeSandbox

С помощью объекта GeoQueryResult можно создавать объекты на карте из их JSON-описания.

В данном примере рассматривается, как найти объекты выборки, ближайшие к произвольному объекту на карте (например к метро). А также как находить объекты, ближайшие к месту клика.

<!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="find_closest_object.js"
            type="text/javascript"
        ></script>
        <style>
            body,
            html {
                font-family: Arial;
                font-size: 11pt;
                padding: 0;
                margin: 0;
                width: 100%;
                height: 95%;
            }
            p {
                padding: 10px;
            }
            #map {
                width: 100%;
                height: 85%;
            }
        </style>
    </head>
    <body>
        <p>
            При клике на карту будет открываться балун ближайшей к месту
            клика метки
        </p>
        <div id="map"></div>
    </body>
</html>
ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map(
            "map",
            {
                center: [55.73, 37.75],
                zoom: 12,
            },
            {
                searchControlProvider: "yandex#search",
            }
        ),
        cafe,
        metro;

    function findClosestObjects() {
        // Найдем в выборке кафе, ближайшее к найденной станции метро,
        // и откроем его балун.
        cafe.getClosestTo(metro.get(0)).balloon.open();

        // Будем открывать балун кафе, который ближе всего к месту клика
        myMap.events.add("click", function (event) {
            cafe.getClosestTo(event.get("coords")).balloon.open();
        });
    }

    // Описания кафе можно хранить в формате JSON, а потом генерировать
    // из описания геообъекты с помощью ymaps.geoQuery.
    cafe = ymaps
        .geoQuery({
            type: "FeatureCollection",
            features: [
                {
                    type: "Feature",
                    properties: {
                        balloonContent:
                            'Кофейня "Дарт Вейдер" - у нас есть печеньки!',
                    },
                    geometry: {
                        type: "Point",
                        coordinates: [55.724166, 37.545849],
                    },
                },
                {
                    type: "Feature",
                    properties: {
                        balloonContent:
                            'Кафе "Горлум" - пирожные прелесть.',
                    },
                    geometry: {
                        type: "Point",
                        coordinates: [55.717495, 37.567886],
                    },
                },
                {
                    type: "Feature",
                    properties: {
                        balloonContent:
                            'Кафе "Кирпич" - крепкий кофе для крепких парней.',
                    },
                    geometry: {
                        type: "Point",
                        coordinates: [55.721018, 37.631057],
                    },
                },
            ],
            // Сразу добавим точки на карту.
        })
        .addToMap(myMap);

    // С помощью обратного геокодирования найдем метро "Кропоткинская".
    metro = ymaps
        .geoQuery(ymaps.geocode([55.744828, 37.603423], { kind: "metro" }))
        // Нужно дождаться ответа от сервера и только потом обрабатывать полученные результаты.
        .then(findClosestObjects);
}