Клуб API Карт

Получить список объектов в заданной области по названию

Пост в архиве.

Здравствуйте. Есть задача: нужно найти в заданной области список объектов, исходя из их общего названия (например: школа, кафе, ресторан, поликлиника и т.д.). Стандартный geocode с запросом типа "ресторан, россия, москва, %название_станции_метро%" не помог, равно как и попытка сделать запрос "ресторан", и ограничить область поиска через параметр boundedBy. HTTP-запрос вида "http://psearch-maps.yandex.ru/1.x/?text=ресторан, Россия, Москва, метро полянка" тоже ничего не дает.

Понимаю, что где-то что-то не так делаю, но не могу понять, где и что именно. Читал в клубе, что есть ограничение на поиск организаций через API. Не на него ли я натыкаюсь? 

13 комментариев

геокодер ищет только координаты географических топонимов (улицы, города и тд)

POI (points of interest) через АПИ не предоставляются, если только метро через параметр kind

Понятно. А есть ли какой-то стандартный и общепринятый способ это компенсировать, не нарушая лицензии? Например, генерировать подходящую ссылку для пользователя, чтобы он мог по ней переходить и смотреть на самом яндексе уже? Может быть, что-то другое?

общепринятого нет

можно собрать свою базу объектов и искать по ней, либо, если вас устроит такой вариант, то можно и  на maps.yandex.ru давать ссылку.

Можно попробовать поискать "ресторан" на народной карте, для этого надо передать опцию provider: 'yandex#publicMap'

Попробовал переделать с народными картами, не получается. Вот такой код:

ymaps.geocode("Россия, Москва, ресторан, метро Китай-Город",{provider:'yandex#publicMap'})
.then(function (res) {
coord = res.geoObjects.get(0).geometry.getCoordinates();
myCollection.add(new ymaps.Placemark(coord)); 
myMap.setBounds(myCollection.getBounds());

});


выдает ошибку "Uncaught TypeError: Cannot read property 'geometry' of null" при попытке присвоить переменной coord значение. Вроде бы, я правильно задаю провайдера, что может быть не так?

Наверное не найдено

надо сначала проверить что чтото нашлось

 

if(res.geoObjects.getLength()) {
    ...
}

я бы искал просто "ресторан", а "Россия, Москва, метро Китай-Город", выставил бы через опцию boundedBy

Техподдержка ответила, что такой возможности у них нет( Решил пока отказаться от этой возможности, но спасибо за идеи)
Другой вопрос возник: как мне обработать массив объектов? Допустим, у меня есть массив из N строк-адресов, и я хочу каждую прогнать через геокодер, а потом отобразить их на карту вместе.
Самое умное, что придумал, это написать функцию, которая принимает массив, прогоняет через геокодер и отдает массив с координатами:
function search ( myObjects ){

                    for(var i = 0; i < myObjects.length; i++){

                        searchQuery =  myObjects[i];

                        ymaps.geocode(searchQuery).then(function (res) {

                            coord = res.geoObjects.get(0).geometry.getCoordinates();

                            myPlacemarks[i] = res.geoObjects.get(0).geometry.getCoordinates();

                        });

                        alert(myPlacemarks[i]); 

                    };

                    return myPlacemarks;

                }  
Но возвращаемый массив стабильно пустой. Это я чего-то не понимаю в областях видимости, или geocode какой-то очень интересный?
В примерах Яндекса с несколькими метками везде координаты либо статичны, либо генерируются случайно, а не через геокодер прогоняются.

 

Но возвращаемый массив стабильно пустой. Это я чего-то не понимаю в областях видимости, или geocode какой-то очень интересный?

он асинхронный

там же запрос к серверу

А как бы вы посоветовали это реализовать лучше? Хотя бы на словах? Задача-то наверняка из числа стандартных, но вот что-то туплю.

а вам это точно надо каждый раз на клиенте геокодировать?

может можно на сервере один раз 

и в базу записать?

Предполагается, что при первом обращении будет геокодироваться и записываться в базу. Иначе пока никак, поэтому приходится крутиться.

посмотрите эту статью

Да, это практически то, что надо)
Спасибо, вы мне помогли)

Здравствуйте, мы запустили HTTP API Геопоиска, с помощью которого можно получать данные поиска по организациям из Яндекс.Справочника. Пожалуйста, обратите внимание, что пользовательским соглашением API запрещено использовать API Геопоиска без показа карты.