Немогу удалить поисковую строку на яндекс карте, все методы перепробовал, не реогирует
Добрый день. Подскажите где копать. Стоит задача вывести на карте объекты инфраструктуры (школы, банк, аптека....) по нажатию на соответствующую кнопку. Объекты предопределены (каждый запрос в своей кнопке). Делаю так:
<input type="button" name="s_request" value="Школа"/>
<input type="button" name="s_request" value="Аптека"/>
<input type="button" name="s_request" value="Банк"/>
$('input[name="s_request"]').on('input click', function (e) {
var request = e.target.value;
searchControl.search(request);
});
Вроде работает - вопрос:
1. как одномоментно вывести две категории (школа, аптека).
п.с. не знаю насколько правильный этот метод, может подскажите что лучше
спасибо
Следующим ниже кодом устанавливаю метку с возможностью перетаскивания (взял из примеров). Также на карте есть форма поиска, которая тоже ставит метку. И если я уже поставил свою метку мышкой , а потом решил поставить метку с помощью формы поиска, то установится новая метка, и того на карте будет уже две метки. Но мне нужно чтобы при поиске через форму устанавливалась моя метка, а если она уже установлена то просто бы перемещалась на адрес найденый через поиск. Т.е. всего на карте должна быть максимум одна метка. Подскажите, пожалуйста, как тут быть?
ymaps.ready(init);
var myMap,
myPlacemark;
function init(){
myMap = new ymaps.Map("map", {
center: [55.76, 37.64],
zoom: 16,
controls: ['zoomControl', 'fullscreenControl', 'typeSelector', 'rulerControl', 'searchControl']
});
myMap.events.add('click', function (e) {
var coords = e.get('coords');
// Если метка уже создана – просто передвигаем ее.
if (myPlacemark) {
myPlacemark.geometry.setCoordinates(coords);
}
// Если нет – создаем.
else {
myPlacemark = createPlacemark(coords);
myMap.geoObjects.add(myPlacemark);
// Слушаем событие окончания перетаскивания на метке.
myPlacemark.events.add('dragend', function () {
myPlacemark.geometry.getCoordinates();
});
}
});
// Создание метки.
function createPlacemark(coords) {
return new ymaps.Placemark(coords, {
iconCaption: 'метка...'
}, {
preset: 'islands#violetDotIconWithCaption',
draggable: true
});
}
}Есть поиск через SearchControl, как в примере: https://tech.yandex.ru/maps/jsbox/2.1/search_control_ppo
Нужно собирать метки в кластеры и кастомно их стилизовать.
С провайдером yandex#search не работает опция noPlacemark, чтобы просто их не показывать. Сейчас я в then возвращаемого промиса сохраняю результаты, чищу поиск через searchControl.clear(), делаю свои метки, собираю кластеризатором и наношу обратно на карту. Это громоздко и глючит, т.к. искать нужно при драге карты, и если быстро таскать, нативные результаты таки успевают показаться.
Можно ли просто стилизовать те метки, которые выводит поиск?
Здравствуйте.
Использую 3 searchControl на карте для вывода разных типов объектов (магазины, кафе итд). Как сделать, чтобы результаты поисков имели разные иконки вместо синих?
Может есть более верные варианты как это сделать?
Пробовал использовать geocoder для получения списка, но он не находит объекты по тем же словам или показывает 1 московский главный филиал по названию. Хотя там можно добавить placeMark'и из результатов поиска с нужными иконками.
Странно, что в Казани ( "Оптово-розничный торговый центр Порт", его координаты около точки: 55.7240, 49.1952) и в Москве (сеть магазов "Да!") нашлись магазины с фиолетовыми иконкам.
----------------
document.getElementById('showfoodshops').onclick = function () {
if (!searchFoodShopsCtl) {
console.log('Start adding food shops...');
objColl = new ymaps.GeoObjectCollection();
myMap.geoObjects.add(objColl);
searchFoodShopsCtl = new ymaps.control.SearchControl({
options: {
provider: 'yandex#search',
noPopup : true
}
});
myMap.controls.add(searchFoodShopsCtl);
searchFoodShopsCtl.search('магазины продуктов');
// ymaps.geocode('магазины').then(function (res) {
// console.log(res.geoObjects.getLength()+' object(s) detected');
// objColl.add(res.geoObjects);
// console.log('Food shops added');
// });
$('#showfoodshops').attr('value', 'Скрыть Продуктовые');
}
else {
console.log('Start food shops...');
myMap.controls.remove(searchFoodShopsCtl);
searchFoodShopsCtl = null;
//objColl.removeAll();
//myMap.geoObjects.remove(objColl);
//objColl.destroy();
//objColl = null;
$('#showfoodshops').attr('value', 'Показать Продуктовые магазы');
console.log('Food shops deleted');
}
};
Сабж. Может кто поделиться примером кастомного поля поиска (searchControl).
Необходимо поменять вид кнопки "Найти"
Я хочу сделать возможность поиска по карте адреса для доставки пиццы.
Так как доставка возможно только рядом то я хочу ограничить этот район.
Я попробовал создать карту, с поиском
https://jsfiddle.net/jjjktrmq/1/
При этом подсказки для поиска выводятся не ограниченные по данным координатам.
начав вводить "В" получаю результат Воркута, кликнув по которому - нет результатов
Как сделать так, чтобы при наборе адреса ограничивалось только указанными координатами?
Здравствуйте!
Исходные данные: Есть сайт. На нем есть карточки организаций. Информация о каждой организации выводится на отдельной странице. В карточке организации выводится Яндекс.Карта с адресами этой организации. Вывод адресов организации осуществляется с помощью поиска с использованием control.SearchControl.
Задача: Необходимо оптимизировать алгоритм вывода адресов организации, чтобы не превысить дневной лимит (25000 запросов) и чтобы ускорить отображение адресов на карте.
Возникли вопросы:
1. За какое количество запросов к геокодеру считается 1 поисковый запрос, выполненный с помощью control.SearchControl с провайдером 'yandex#search' (за 1, или в соответствии с количеством найденных организаций)?
2. Возможно ли поиск организаций, выполненный с помощью control.SearchControl закэшировать (к примеру на 1 сутки), чтобы при каждом повторном открытии страницы вместо нового поиска данные об адресах этой организации для вывода на карте брались из кэша? Если да, то как (инструменты, примеры, куда копать)?
Прошу помочь.
Добрый день. Сделал поиск не по объектам карты, а по базе данных, а уже скрипт возвращает названия и координаты, на которые уже масштабируется карта и открывается балун найденного объекта. При этом в результатах поиска может быть до нескольких десятков вариантов. Нужно как-то кастомизировать стандартный поисковый контрол, чтобы при переходе по одному из результатов не закрывался список найденных результатов. Кроме того, хочется не показывать все, скажем, 100 результатов поиска в списке, а, например, по 20, и добавлять кнопку "Показать ещё 20". Можно ли сделать такие вещи со стандартным контролом? И как изменить поведение карты при клике на результат поиска? Нужно масштабировать не до максимального масштаба, а до определённого.
Если нет, то тогда хотелось бы понять, как сделать свой контрол. Сделать свой layout для SearchControl? Или создавать новый пользовательский контрол? Есть такой пример: https://yandex.ru/blog/ymapsapi/1631, но там нет многих нужных вещей. К тому же, нет примера, как реализовать список с поисковыми результатами (именно результатами, а не подсказками при вводе - они как раз-таки не нужны).
Очень надеюсь на подсказку.
Добрый день. Хочу сделать свой собственный поиск по объектам, но искать нужно не по объектам на карте, а по запросу к другому скрипту. Пишем текст - отправляем строку скрипту, скрипт возвращает ответ в JSON, мы этот ответ обрабатываем и выводим на карте и заполняем список результатов.
В песочнице есть пример поиска по своим объектам на карте: https://tech.yandex.ru/maps/jsbox/2.1/custom_search
Так же в песочнице есть собственное отображение результатов: https://tech.yandex.ru/maps/jsbox/2.1/custom_search_results
Однако в документации API (https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IGeocodeProvider-docpage/) не описана даже возможность создания своего собственного провайдера.
Как мне реализовать поиск по запросу к другому скрипту?
Кстати результаты лучше выводить через SuggestView, если надо темизировать их по-своему?
var searchControl = new ymaps.control.SearchControl({
options: {
useMapBounds: true,
noPlacemark: true,
maxWidth: 400
}
});
map.controls.add(searchControl);Что не так?
Всем привет!
Понадобилось слегка подкрутить стандартный контрол searchControl, а именно, сместить его, чтобы разместить рядом с логотипом. Это отключило опцию float и адаптивность пропала: на маленьких экранах поле поиска теперь вылезает за край. Хотелось бы каким-то образом (в идеале через CSS) задать ширину поля поиска для маленьких экранов. Как это можно проще всего сделать? Все css-классы с неудобным префиксом ymaps-2-1-39, в документации подходящих параметров не нашел, а делать полностью свой шаблон не хочется — изменения мелкие. Может кто подскажет?
Добрый день, а есть ли у кого пример как реализовать поиск по собственным объектам, которые были загружены на карту с помощью ObjectManager?
Я пытался делать, взяв за основу данный пример: https://tech.yandex.ru/maps/jsbox/2.1/custom_search и даже получаю результат поиска, но не работает самаое главное, при выборе объекта из выпадающего списка я получаю ошибку в консоль "Uncaught TypeError: Cannot read property '1' of undefined" и больше ничего не происходит.
Собственно как я пытался сделать:
Создаю обжект менеджер:
objectManager = new ymaps.ObjectManager({
clusterize: true,
gridSize: 32,
groupByCoordinates: true,
});
myMap.geoObjects.add(objectManager)И загружаю в него данные (этот момент опустил)
Создаю экземляр класса ymaps.control.SearchControl:
var mySearchControl = new ymaps.control.SearchControl({
options: {
provider: new CustomSearchProvider(objectManager),
noPlacemark: true,
resultsPerPage: 5,
size: 'large'
}
});И собственно сам провайдер:
function CustomSearchProvider(points)
{
this.points = points;
}
CustomSearchProvider.prototype.geocode = function (request, options)
{
var deferred = new ymaps.vow.defer(),
geoObjects = new ymaps.GeoObjectCollection(),
offset = options.skip || 0,
limit = options.results || 20;
var search_points = this.points.objects.getAll();
var points = [];
for (var i = 0, l = search_points.length; i < l; i++)
{
var point = search_points[i];
if(point.properties.search_text.toLowerCase().indexOf(request.toLowerCase()) != -1)
{
points.push(point);
}
}
points = points.splice(offset, limit);
for (var i = 0, l = points.length; i < l; i++)
{
var point = points[i],
coords = point.properties.coords;
geoObjects.add(new ymaps.Placemark(coords,
{
name: point.properties.address,
description: point.properties.text,
boundedBy: [coords, coords]
}));
}
deferred.resolve(
{
geoObjects: geoObjects,
metaData: {
geocoder: {
request: request,
found: geoObjects.getLength(),
results: limit,
skip: offset
}
}
});
return deferred.promise();
};Помогите советом, что я делаю не так?
Тут уже задавили этот вопрос, но вдруг что-то изменилось?
Возможно ли отловить событие клика по подсказке в SearchControl?
Здравствуйте! Сколько не искал - не нашел ответа на свой вопрос. Подскажите, пожалуйста, куда копать.
Использую API v2.1.26. На карте стандартный searchControl. Если результатов поиска больше одного, то по нажатию Enter открывается ниспадающий список результатов (не подсказок, а именно результатов), при этом выбрать результат с клавиатуры нет никакой возможности: нажатие Tab уводит на следующую после карты ссылку, нажатие стрелки вниз открывает список саджестов. Нет даже возможности выбрать первый результат из списка повторным нажатием Enter (что было бы, вроде, логично). Пробовал ловить нажатия кнопок на инпуте searchControl-а, но это лишено смысла, т.к. элементы списка результатов не являются ссылками, и фокус на них поставить не получается.
Сопутствующий вопрос: почему в searchControl-е значение инпута обновляется по выбору одного из саджестов по нажатию Enter, а не по фокусу на саджесте, как это сделано на maps.yandex.ru? Так было бы гораздо удобнее набирать адреса - нажал пару букв, вниз, затем сразу запятую и дом. Вроде как такой подход сильно распространен, да и на самих Я.Картах он используется, а здесь получается, что жмешь стрелку вниз, затем на рефлексе жмешь запятую, и список саджестов пропадает, т.к. значение не было подставлено.