Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   поиск по картам яндекс (https://javascript.ru/forum/jquery/82347-poisk-po-kartam-yandeks.html)

Dolf 21.04.2021 20:34

поиск по картам яндекс
 
Добрый день, уважаемые коллеги. Возможно вопрос не много не туда.
Но прошу помощи. Подскажите, пожалуйста, как делают поиск по карте яндекс, (нужно именно по яндекс), когда пользователь видит карту и кнопки с объектами, при клике например на кнопку - "школы", на карте появляются все близлежащие школы, по клику на "рестораны", скрываются школы, отображаются рестораны.
Пример - https://v-stremlenii.ru/?utm_source=...12665479848550

Может кто то подобное делал? Подскажите как это делается. Заранее благодарю.

Вот так можно делать поиск, но тут как бы есть строка поиска. А можно как то это сделать без строки?
function init() {
    var myMap = new ymaps.Map('map', {
        center: [55.74, 37.58],
        zoom: 13,
        controls: []
    });
    
    // Создадим экземпляр элемента управления «поиск по карте»
    // с установленной опцией провайдера данных для поиска по организациям.
    var searchControl = new ymaps.control.SearchControl({
        options: {
            provider: 'yandex#search'
        }
    });
    
    myMap.controls.add(searchControl);
    
    // Программно выполним поиск определённых кафе в текущей
    // прямоугольной области карты.
    searchControl.search('школы');
}

ymaps.ready(init);

рони 21.04.2021 21:14

Dolf,
что мешает перенести строку 20 на кнопку и создать ещё кучу подобных кнопок?

Dolf 21.04.2021 21:23

рони,
Без вот этого
var searchControl = new ymaps.control.SearchControl({
        options: {
            provider: 'yandex#search'
        }
    });

Не работает. Тоже думал что так получится. Но нет.

Dolf 21.04.2021 21:26

у них есть песочница:
https://yandex.ru/dev/maps/jsbox/2.1/search_control_ppo
Можно там сразу видеть как будет.

рони 21.04.2021 21:39

Dolf,
там есть пример Поиск по координатам — обратное геокодирование

Dolf 21.04.2021 21:54

рони,
Кажется что то работает вот так:
function init() {
    var myMap = new ymaps.Map('map', {
        center: [55.74, 37.58],
        zoom: 13,
       
    });
    
    // Создадим экземпляр элемента управления «поиск по карте»
    // с установленной опцией провайдера данных для поиска по организациям.
    var searchControl = new ymaps.control.SearchControl({
        options: {
            provider: 'yandex#search'
        }
    });
    
    myMap.controls.add(searchControl);
    
    // Программно выполним поиск определённых кафе в текущей
    // прямоугольной области карты.
    searchControl.search('больница');
}

ymaps.ready(init);


Наверное можно накинуть на кнопку нужное.

рони 21.04.2021 22:02

Dolf,
https://yandex.ru/dev/maps/jsbox/2.1/reverse_geocode/

здесь строка 12 скрипта reverse_geocode.js, перенести на кнопку

Dolf 22.04.2021 17:34

рони,
Все же тут можно использовать только для метро, городов.
А мне надо было для организаций. Но Вы правильно меня натолкнули в первом случае. Сейчас примерно вот так описал оно работает.
// Функция ymaps.ready() будет вызвана, когда
    // загрузятся все компоненты API, а также когда будет готово DOM-дерево.
    ymaps.ready(init);
    function init(){
        // Создание карты.
        var myMap = new ymaps.Map("ymap", {
            // Координаты центра карты.
            // Порядок по умолчанию: «широта, долгота».
            // Чтобы не определять координаты центра карты вручную,
            // воспользуйтесь инструментом Определение координат.
            center: [<?= $centerX;?>, <?= $centerY;?>],
            // Уровень масштабирования. Допустимые значения:
            // от 0 (весь мир) до 19.
            zoom: <?= $zoom;?>,
            controls: ['zoomControl', 'typeSelector',  'fullscreenControl']
        }, {
                autoFitToViewport: 'always',
                searchControlProvider: 'yandex#search'
            }),
            objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: false,
            // ObjectManager принимает те же опции, что и кластеризатор.
            gridSize: 32,
            clusterDisableClickZoom: false,
        });

        // Чтобы задать опции одиночным объектам и кластерам,
        // обратимся к дочерним коллекциям ObjectManager.
        objectManager.objects.options.set('preset', 'islands#greenDotIcon');
        objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
        myMap.geoObjects.add(objectManager);
        objectManager.add(<?= $markers;?>);

        var searchControl = new ymaps.control.SearchControl({
            options: {
                maxWidth: 'small',
               // noPopup: true,
                provider: 'yandex#search'
            }
        });

        myMap.controls.add(searchControl);

        $(document).ready(function () {
            $('body').on('click', '.school', function () {
                let button = $('#school').text();
                searchControl.search(button);
            });
        });

        $(document).ready(function () {
            $('body').on('click', '.med', function () {
                let button = $('#med').text();
                searchControl.search(button);
            });
        });

        $(document).ready(function () {
            $('body').on('click', '.mol', function () {
                let button = $('#mol').text();
                searchControl.search(button);
            });
        });

        $(document).ready(function () {
            $('body').on('click', '.child', function () {
                let button = $('#child').text();
                searchControl.search(button);
            });
        });
    }

Можно развивать дальше думается. Спасибо Вам как всегда!

Dolf 22.04.2021 17:36

Наверняка есть более изящные решения. Но пока на первых парах так работает)

рони 22.04.2021 18:36

Dolf,
уберите все $(document).ready(function () {
и сделайте кнопки все одинаковыми, без id.

и тогда будет одна строка в js
$('body').on('click', '.search', function () {
                 searchControl.search(this.dataset.search);
            });


<button class="search" type="button" data-search="школа">школа</button> 
<button class="search" type="button" data-search="кафе">кафе</button>


Часовой пояс GMT +3, время: 11:24.