Поиск объекта его названию реализуется с помощью функции geocode. Однако, эта функция
производит поиск среди объектов, размещенных на обычной или народной карте.
А что делать, если необходимо организовать поиск по собственным объектам
и интегрировать его с API Яндекс.Карт? Написать собственный провайдер поиска,
который можно использовать в функции geocode и элементе управления
Поиск по карте.
Провайдер поиска должен реализовывать интерфейс IGeocodeProvider.
Данный пример показывает, как написать собственный провайдер и подключить его
стандартному элементу управления Поиск по карте.
Обсуждение этого примера можно посмотреть в клубе.
\n\n","custom_search.js":"function init() {\n var myMap = new ymaps.Map('map', {\n center: [55.7, 37.5],\n zoom: 9,\n controls: ['zoomControl']\n }),\n // Создаем коллекцию.\n myCollection = new ymaps.GeoObjectCollection(),\n // Создаем массив с данными.\n myPoints = [\n { coords: [55.77, 37.46], text: 'Трактир' },\n { coords: [55.66, 37.48], text: 'Кафе' },\n { coords: [55.65, 37.42], text: 'Ресторан' },\n { coords: [55.64, 37.54], text: 'Музей' },\n { coords: [55.54, 37.52], text: 'Библиотека' },\n { coords: [55.53, 37.56], text: 'Школа' },\n { coords: [55.61, 37.61], text: 'Аптека' },\n { coords: [55.80, 37.58], text: 'Бар' },\n { coords: [55.71, 37.35], text: 'Институт' },\n { coords: [55.74, 37.57], text: 'Университет' },\n { coords: [55.58, 37.69], text: 'Больница' },\n { coords: [55.57, 37.70], text: 'Цирк' },\n { coords: [55.55, 37.64], text: 'Магазин' },\n { coords: [55.50, 37.75], text: 'Булочная' },\n { coords: [55.81, 37.73], text: 'Полиция' },\n { coords: [55.73, 37.68], text: 'Салон красоты' },\n { coords: [55.86, 37.76], text: 'Баня' },\n { coords: [55.38, 37.69], text: 'Гараж' },\n { coords: [55.91, 37.50], text: 'Дом' },\n { coords: [55.62, 37.32], text: 'Прачечная' },\n { coords: [55.85, 37.41], text: 'Стадион' },\n { coords: [55.67, 37.24], text: 'Вокзал' }\n ];\n\n // Заполняем коллекцию данными.\n for (var i = 0, l = myPoints.length; i < l; i++) {\n var point = myPoints[i];\n myCollection.add(new ymaps.Placemark(\n point.coords, {\n balloonContentBody: point.text\n }\n ));\n }\n\n // Добавляем коллекцию меток на карту.\n myMap.geoObjects.add(myCollection);\n\n // Создаем экземпляр класса ymaps.control.SearchControl\n var mySearchControl = new ymaps.control.SearchControl({\n options: {\n // Заменяем стандартный провайдер данных (геокодер) нашим собственным.\n provider: new CustomSearchProvider(myPoints),\n // Не будем показывать еще одну метку при выборе результата поиска,\n // т.к. метки коллекции myCollection уже добавлены на карту.\n noPlacemark: true,\n resultsPerPage: 5\n }});\n\n // Добавляем контрол в верхний правый угол,\n myMap.controls\n .add(mySearchControl, { float: 'right' });\n}\n\n\n// Провайдер данных для элемента управления ymaps.control.SearchControl.\n// Осуществляет поиск геообъектов в по массиву points.\n// Реализует интерфейс IGeocodeProvider.\nfunction CustomSearchProvider(points) {\n this.points = points;\n}\n\n// Провайдер ищет по полю text стандартным методом String.ptototype.indexOf.\nCustomSearchProvider.prototype.geocode = function (request, options) {\n var deferred = new ymaps.vow.defer(),\n geoObjects = new ymaps.GeoObjectCollection(),\n // Сколько результатов нужно пропустить.\n offset = options.skip || 0,\n // Количество возвращаемых результатов.\n limit = options.results || 20;\n \n var points = [];\n // Ищем в свойстве text каждого элемента массива.\n for (var i = 0, l = this.points.length; i < l; i++) {\n var point = this.points[i];\n if (point.text.toLowerCase().indexOf(request.toLowerCase()) != -1) {\n points.push(point);\n }\n }\n // При формировании ответа можно учитывать offset и limit.\n points = points.splice(offset, limit);\n // Добавляем точки в результирующую коллекцию.\n for (var i = 0, l = points.length; i < l; i++) {\n var point = points[i],\n coords = point.coords,\n text = point.text;\n\n geoObjects.add(new ymaps.Placemark(coords, {\n name: text + ' name',\n deescaped_scription: text + ' deescaped_scription',\n balloonContentBody: '
Поиск объекта его названию реализуется с помощью функции geocode. Однако, эта функция производит поиск среди объектов, размещенных на обычной или народной карте.
А что делать, если необходимо организовать поиск по собственным объектам и интегрировать его с API Яндекс.Карт? Написать собственный провайдер поиска, который можно использовать в функции geocode и элементе управления Поиск по карте.
Провайдер поиска должен реализовывать интерфейс IGeocodeProvider. Данный пример показывает, как написать собственный провайдер и подключить его стандартному элементу управления Поиск по карте.
Обсуждение этого примера можно посмотреть в клубе.