Клуб API Карт

Поиск объекта из коллекции в своем регионе

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

Здравствуйте. Есть карта на основе примера в песочнице.

Карта с объектами по всей России. Коллекция создана, geolocation определяет местоположение пользователя, поиск работает, но по названию всегда выдает один и тотже результат - первый из множетсва объектов с одинаковым названием магазина (сетевой магазин). 

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

Также есть вопрос по поиску по полю text (как в примере): как изменить дословный поиск на свободный? Дословный не найдет, например, выражение "аптека москва", если в поле text указано "аптека, москва".

3 комментария

Вы можете переписать функцию фильтрации объектов,

на ту что нужна Вам:

 

        .filter(function (point) {

            return point.text.toLowerCase().indexOf(request.toLowerCase()) != -1;

        })

 

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

Вот измененный пример из песочницы

function init() {    var myMap = new ymaps.Map('map', {            center: [55.7, 37.5],            zoom: 9,            behaviors: ['default', 'scrollZoom']        }),        // Создаем коллекцию.        myCollection = new ymaps.GeoObjectCollection(),        // Создаем массив с данными.        myPoints = [            { coords: [55.77, 37.46], text: 'Трактир' },            { coords: [55.75, 37.47], text: 'Трактир2' },            { coords: [55.73, 37.48], text: 'Трактир3' },            { coords: [55.66, 37.48], text: 'Кафе' },            { coords: [55.65, 37.42], text: 'Ресторан' },            { coords: [55.64, 37.54], text: 'Музей' },            { coords: [55.54, 37.52], text: 'Библиотека' },            { coords: [55.53, 37.56], text: 'Школа' },            { coords: [55.61, 37.61], text: 'Аптека' },            { coords: [55.80, 37.58], text: 'Бар' },            { coords: [55.71, 37.35], text: 'Институт' },            { coords: [55.74, 37.57], text: 'Университет' },            { coords: [55.58, 37.69], text: 'Больница' },            { coords: [55.57, 37.70], text: 'Цирк' },            { coords: [55.55, 37.64], text: 'Магазин' },            { coords: [55.50, 37.75], text: 'Булочная' },            { coords: [55.81, 37.73], text: 'Полиция' },            { coords: [55.73, 37.68], text: 'Салон красоты' },            { coords: [55.86, 37.76], text: 'Баня' },            { coords: [55.38, 37.69], text: 'Гараж' },            { coords: [55.91, 37.50], text: 'Дом' },            { coords: [55.62, 37.32], text: 'Прачечная' },            { coords: [55.85, 37.41], text: 'Стадион' },            { coords: [55.67, 37.24], text: 'Вокзал' }        ];    // Заполняем коллекцию данными.    myPoints.forEach(function (point) {        myCollection.add(new ymaps.Placemark(            point.coords, {                balloonContentBody: point.text            }        ));    });    // Добавляем коллекцию меток на карту.    myMap.geoObjects.add(myCollection);    // Создаем экземпляр класса ymaps.control.SearchControl    var mySearchControl = new ymaps.control.SearchControl({            // Заменяем стандартный провайдер данных (геокодер) нашим собственным.            provider: new CustomSearchProvider(myMap, myPoints),            // Не будем показывать еще одну метку при выборе результата поиска,            // т.к. метки коллекции myCollection уже добавлены на карту.            noPlacemark: true,            resultsPerPage: 5        });    // Добавляем контрол в верхний правый угол,    myMap.controls        .add(mySearchControl, { right: 10, top: 10 })        .add('smallZoomControl');}// Провайдер данных для элемента управления ymaps.control.SearchControl.// Осуществляет поиск геообъектов в по массиву points.// Реализует интерфейс IGeocodeProvider.function CustomSearchProvider(map, points) {    this.map = map;    this.points = points;}// Провайдер ищет по полю text стандартным методом String.ptototype.indexOf.CustomSearchProvider.prototype.geocode = function (request, options) {    var promise = new ymaps.util.Promise(),        map = this.map,        geoObjects = new ymaps.GeoObjectArray(),        // Сколько результатов нужно пропустить.        offset = options.skip || 0,        // Количество возвращаемых результатов.        limit = options.results || 20,        points = this.points            // Ищем в свойстве text каждого элемента массива.            .filter(function (point) {                return point.text.toLowerCase().indexOf(request.toLowerCase()) != -1;            })            .sort(function (a, b) {                var coordSystem = map.options.get('projection').getCoordSystem(),                    center = map.getCenter();                            return coordSystem.getDistance(a.coords, center) > coordSystem.getDistance(b.coords, center)? 1 : -1;            });        // При формировании ответа можно учитывать offset и limit.    points.splice(offset, limit)        // Добавляем точки в результирующую коллекцию.        .forEach(function (point) {            var coords = point.coords,                text = point.text;            geoObjects.add(new ymaps.Placemark(coords, {                name: text + ' name',                description: text + ' description',                balloonContentBody: '

' + text + '

',                boundedBy: [coords, coords]            }));        });    promise.resolve({        // Геообъекты поисковой выдачи.        geoObjects: geoObjects,        // Метаинформация ответа.        metaData: {            geocoder: {                // Строка обработанного запроса.                request: request,                // Количество найденных результатов.                found: geoObjects.getLength(),                // Количество возвращенных результатов.                results: limit,                // Количество пропущенных результатов.                skip: offset            }        }    });    // Возвращаем объект-обещание.    return promise;};ymaps.ready(init);

 

Если поискать "Трактир", результат будет отсортирован по-удаленности от центра карты