Клуб API Карт

Найдено на тему «geoQuery»:
Получение значения properties при клике на точку - находящуюся в GeoQueryResult
Халатин Алексей (ЭлРос)
24 июля 2016, 20:55

Здравствуйте.

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

objects = ymaps.geoQuery([
	{
		type: 'Point',
		coordinates: [56.165423,40.467900],
		id: 0
	},
	{
		type: 'Point',
		coordinates: [56.1657,40.469],
		id: 1
	},
	{
		type: 'Point',
		coordinates: [56.17,40.467900],
		id: 2
	}
]).addToMap(myMap)

при последующем поиске и вешании события?

Полный код такой:

var myMap = new ymaps.Map("map", {
    center: [56.165423,40.467900],
    zoom: 15
}, {
    searchControlProvider: 'yandex#search'
}),
objects = ymaps.geoQuery([
    {
        type: 'Point',
        coordinates: [56.165423,40.467900],
        id: 0
    },
    {
        type: 'Point',
        coordinates: [56.1657,40.469],
        id: 1
    },
    {
        type: 'Point',
        coordinates: [56.17,40.467900],
        id: 2
    }
]).addToMap(myMap),
circle = new ymaps.Circle([[56.165423,40.467900], 500], null, {
    draggable: true,
    fillOpacity: 0.2,
    strokeWidth: 3
    });

myMap.geoObjects.add(circle);

var objectsInsideCircle = objects.searchInside(circle);
objectsInsideCircle.setOptions('preset', 'islands#redIcon');

objects.remove(objectsInsideCircle).removeFromMap(myMap);

objectsInsideCircle.addEvents('click', function(e){
    var id = e.get('target').properties.get('id');

    console.log(id);

});

Логика такая:

1. Добавляем на карту 3 точки.

2. Добавляем на карту круг

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

4. На найденные точки вешаем событие click

5. При клике на точку внутри круга пытаемся получить ее id из properties.id, но получаем undefined

1 комментарий
geoQuery
geoQuery и методы remove* (add*)
sayunot
11 июля 2016, 08:51

никак не могу понять принцип работы методов remove* и add* у geoQuery. например, есть код:

var res = ymaps.geoQuery( yMap.geoObjects) // как понимаю, забираем все объекты типа geo с текущей копии карты 
                .removeFrom(yMap.geoObjects); // тут, по идее, чистим полностью результат geoQuery, загоняем результат в переменную 
        
        res.then(() => {
              console.log('remove:' + yMap.geoObjects.getLength() + ", but res:" + res.getLength());
        }).add(new ymaps.Polyline([[25, 65], [35, 66], [34, 62], [34, 63]])) // добавляем новый объект в результат
        .then(() => {
              console.log('add:' + yMap.geoObjects.getLength() + ", but res:" + res.getLength());
        }).addTo(yMap.geoObjects) // выводим результат в коллекцию geo-объектов 
        .then(() => {
              console.log('addTo:' + yMap.geoObjects.getLength() + ", but res:" + res.getLength());
        });

прогоняем этот код раза 4, в результате ждем такое поведение:

1.  geoQuery, затем вызов removeFrom => результат пустой, однако вывод в консоль "remove:4, but res:3". откуда объекты в результате geoQuery после вызова removeFrom, если и в качестве источника, и в качестве удаляемой коллекции используется yMap.geoObjects? не пойму.

2.  add => должен добавиться новый объект в результат, но в консоле "add:4, but res:3". почему 3, а не 1?

3. addTo => в коллекции yMap.geoObjects должен добавиться результат geoQuery, однако в консоле "addTo:4, but res:3", т.е. с момента вызова removeFrom ничего не изменилось. 

явно че-т не понимаю (

1 комментарий
geoQuery
Можно ли найти пересечение polyline и polygon?
Константин Кузнецов
15 октября 2015, 14:14

Можно ли получить пересечения с помощью ymaps.geoQuery(...).searchIntersect(...) или еще каким-то образом.

Т.е. если они пересекаются в одной точке, то результатом была бы эта одна точка, если в двух точках, то две точки, если соприкасаются на отрезке, то результат полилиния.


В моем примере например полигон и полилиния имеют одну общую вершину, и выполнив:

    var result = ymaps.geoQuery(polygon).searchIntersect(polyline);

    result.setOptions('fillColor', 'FF0000');

Красным подкрашивается весь полигон, а хотелось бы получить именно пересечение, т.е. точку.

А если:

  var result = ymaps.geoQuery(polygon).intersect(ymaps.geoQuery(polyline));

Вообще result.getLength() равен 0

 

1 комментарий
API 2.1,Polyline,Polygon,geoQuery
Порядок координат в json для использования в geoQuery
Удалённый пользователь
11 сентября 2015, 10:28

Добрый день, вопрос по поводу порядка координат в json.
Есть спецификация geojson в которой говориться, что порядок следования координат long, lat. Если с сервера приходит geoJson согласно этой спецификации, то на клиенте приходится разворачивать координаты, это связанно с тем что geoQuery ожидает порядок lat, long. Однако большинство библиотек формирующих geoJson следуют спецификации. Результат геокодера yandex также возвращает специфицированный json. Так вот вопрос, есть ли способ поменять ожидаемый яндексом порядок координат в json?
P.S. По поводу задать coordorder=longlat при подключении api - не очень, ибо работать непосредственно с координатами хочеться всё таки в формате latlon, как и принято в большинстве геосистем.

1 комментарий
geojson,API 2.1,geoQuery
Дополнительные свойства и поиск по ним
Илья Соколов
26 июля 2015, 11:44

Можно ли в описание объекта помимо текста и координат вставлять свои поля и в последствие делать поиск по этим дополнительным полям?

 

Напрмиер, разместить на карте квартиры однокомнатные и двукомнатные. А потом отфильтровать - оставить только двукомнантые, стоимость которых попадает в заданный диапазон.

1 комментарий
API 2.1,geoQuery
Заголовок не указан
Алексей
29 июня 2015, 09:05

 

 

//Фильтр
        var shownObjects,
            byType = new ymaps.GeoQueryResult();
            byPay = new ymaps.GeoQueryResult();

        if ($('#First').prop('checked'))
        {byType = geoObjects.search('properties.pointtype rlike "first"');}
       
        if ($('#Second').prop('checked'))
        { byType = geoObjects.search('properties.pointtype rlike "second"').add(byType);}

        if ($('#Third').prop('checked'))
        { byType = geoObjects.search('properties.pointtype rlike "third"').add(byType);}
        shownObjects = byType.addToMap(myMap);
        // Объекты, которые не попали в выборку, нужно убрать с карты.
        geoObjects.remove(shownObjects).removeFromMap(myMap);
        filterByVisibleArea();}
       
// Список в соседней области
                filterByVisibleArea();
                myMap.events.add('boundschange', filterByVisibleArea);
                listView
                    .on({
                         click: function (e) {
                            e.preventDefault();
                            myMap.panTo($(e.currentTarget).data('geoObject').geometry.getCoordinates()); }
                    }, 'li');
                function cleanUp() {
                    listView.empty(); }
                function filterByVisibleArea() {
                    cleanUp();
                    ymaps.geoQuery(myMap.geoObjects).searchIntersect(myMap)
                        .each(function (geoObject) {
                        if (currentmapzoom >= 7){
                            var geoObjectView = $('<li><a href="#">' + geoObject.properties.get('title') + currentmapzoom + '</a></li>');
                            geoObjectView.data({ geoObject: geoObject });
                            listView.append(geoObjectView);} }); }
// фильтр по видимой области.
                function filterByVisibleArea() {
                    cleanUp();
                    ymaps.geoQuery(myMap.geoObjects).searchIntersect(myMap)
                        .each(function (geoObject) {
                        if (currentmapzoom >= 7){
                            var geoObjectView = $('<li><a href="#">' + geoObject.properties.get('title') + currentmapzoom + '</a></li>');

                            geoObjectView.data({ geoObject: geoObject });
                       
                            listView.append(geoObjectView);
                        }
                        });
                }

 
//При этом кластер организован согласно примеру ранее Добавить кластер:

window.geoObjects = ymaps.geoQuery(json);
window.myClusterer = geoObjects.clusterize();
myMap.geoObjects.add(myClusterer);

 

При этом перестает корректно работать фильтр и перестает работать список объектов. Каким образом можно удалять/добавлять точки в кластере и выводить все точки в видимой области в список?

 

Так же вопрос, как передать в "Открыть в Яндекс.Картах" координаты активной метки, для которой открыт балун?

кластеризатор,API 2.1,geoQuery
Построение маршрута посредством route.
Aleksey Korsakov
30 мая 2015, 23:40

Есть карта с метками Placemark, каждой метке перед добавлением ее в myMap.geoObjects задано свойство "name", которое эквивалентно id записи в БД.

Вопрос: могу ли я перебрав geoObjects, найти нужные мне метки, сравнив их name с id, пришедшим из БД, и затем построить маршрут по этим меткам достав из объекта координаты? И как это сделать?

И как достать Placemark'и и их name? Пробовал так:

 

myMap.geoObjects.each(function (geoObject) {
    for(var key in myMap.geoObjects) {
        console.log(myMap.geoObjects.name);
    }
});
2 комментария
маршрутизация,API 2.1,geoQuery
Поиск маркеров по properties в коллекции
Verstaka
20 мая 2015, 22:23

Есть массив

 

var groups = [

{

coordinates: [55.826564, 37.532527],

title: 'Title',

color: 'gray'

},

{...}

]

 

 

Есть пустая коллекция

myCol = new ymaps.GeoObjectCollection();

 

Из массива достаем нужную инфу и создаем маркеры

 

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

placemark = new ymaps.Placemark(groups[i].coordinates, {

title: groups[i].title,

color: groups[i].color

});

myCol.add(placemark); // Добавляем в коллекцию

}

 

 

Добавляем на карту

myMap.geoObjects.add(myCol);

 

Все работает идеально.

 

А теперь я хочу выбрать все маркеры, у которых color == 'red'

 

 

var result = ymaps.geoQuery(myMap.geoObjects);

console.log(result.search('properties.color == "red"').getLength())

 

Получаю 0.

 

Причем если так,

console.log(result.search('geometry.coordinates.0 > 100').getLength())

То все ищется корректно.

 

Немного поизучав вопрос, выясняется, что на этапе

myCol.add(placemark); // Добавляем в коллекцию

properties теряется.

 

Есть ли варианты, кроме создания разных коллекций?

5 комментариев
метка,API 2.1,коллекции,geoQuery
Фильтрация меток!
Владимир Усольцев
12 мая 2015, 10:16

У меня есть фильтры на карте, проблема в том что при некоторой фильтрации меток в фокусе карты не остается, как сделать чтобы карта перемещалась в то место где есть метки или зум уменьшался?

5 комментариев
API 2.1,geoQuery
исчезают метки при установке видимой области карты
amarieea91
21 марта 2015, 12:50

Здравствуйте! 

Добавляю метки через objectManager. В objectManager включена кластеризация. После добавления меток хочу установить видимую область карты по добавленым меткам таким образом:

 var bounds = ymaps.geoQuery(objectManager.objects).getBounds();

    myMap.setBounds(bounds);

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

 

function initMap() {

    objectManager = new ymaps.ObjectManager({

        clusterize: true,

        groupByCoordinates: true,

        gridSize: 32,

    });

 

    var coords = { Lat: 53.8993, Lng: 27.5622, Zoom: 6 };

    myMap = new ymaps.Map("map", {

        center: [coords.Lat, coords.Lng],

        zoom: coords.Zoom,

        behaviors: ['default', 'scrollZoom']

    });

}

 

function addPlacesToMap(places) {

    objectManager.add(places);

    objectManager.objects.options.set({

        iconLayout: 'default#image',

        iconOffset: [0, 0],

        balloonCloseButton: true,

        balloonPanelMaxMapArea: 'Infinity',

        preset: ''

    });

    myMap.geoObjects.add(objectManager);

    var bounds = ymaps.geoQuery(objectManager.objects).getBounds();

    myMap.setBounds(bounds);

}

 

10 комментариев
метка,API 2.1,менеджер объектов,область видимости,geoQuery
Ставить метки из Базы Данных MySQL
khomchanovsky
17 марта 2015, 12:43

Добрый день!Появился вот такой вопрос:

Есть файл excel с названием объектов (где должна быть метка), парой координат (долгота и широта) и типом (т.е. острова,города,достопримечательности и прочее). Тип определен для списка.

Можно ли чтоб эти метки подгружались к карте не из js файла, а из базы данных (по-поводу создания базы данных знаю только что excel файл можно сохранить в csv формате и подгрузить через phpMyAdmin - с этим,кстати тоже появились проблемы - таблица собралась,но данные отображены некорректно (я так понимаю проблемы с кодировкой и разделителями) - но это уже другой вопрос! Сейчас интересно именно про подгрузку данных на карту из БД. Если возможно буду разбираться дальше.

Спасибо за любую помощь!

2 комментария
MySQL,API 2.1,geoQuery
Как кластеризовать объекты добавленные geoQuery через Ajax в формате JSON?
Павел Чернохаев
15 марта 2015, 16:43

Возможно ли это сделать? Если возможно, то дайте пожалуйста пример или функцию, которая этим занимается?

 

БлагоДарю!

1 комментарий
кластеризатор,API 2.1,geoQuery
Фильтрация range ползунками
raketaprod
14 марта 2015, 17:05

Всем привет! Столкнулся с проблемой фильтрации, а точнее не могу понять, почему значения не срабатывают.
За основу range слайдера беру jquery ui slider - range slider с двумя ползунками. И есть JSON файл, у которого в properties прописано два значения - minprice и maxprice ( "properties": {"maxprice": "20000", "minprice": "1000"...}) и есть код:



 

ymaps.ready(init);

function init() {
var myMap = new ymaps.Map('YMapsID', {
center: [37.573856, 55.751574],
zoom: 10
});

jQuery.getJSON('data1.json', function (json) {

var myObjects = ymaps.geoQuery(json)
.addToMap(myMap)
.applyBoundsToMap(myMap, {
checkZoomRange: true
});

var shownObjects,
byColor = new ymaps.GeoQueryResult(),
byShape = new ymaps.GeoQueryResult(),
byPrice = new ymaps.GeoQueryResult();


function checkState () {
// Отберем объекты по цвету.
if ($('#red').prop('checked')) {
// Будем искать по двум параметрам:
// - для точечных объектов по полю preset;
// - для контурных объектов по цвету заливки.
byColor = myObjects.search('options.fillColor = "#ff1000"')
.add(myObjects.search('options.preset = "islands#yellowStretchyIcon"'));
}
if ($('#red').prop('checked')) {
// Будем искать по двум параметрам:
// - для точечных объектов по полю preset;
// - для контурных объектов по цвету заливки.
byCity = myObjects.search('properties.fillColor = "#ff1000"')
.add(myObjects.search('options.preset = "islands#yellowStretchyIcon"'));
}
if ($('#green').prop('checked')) {
byColor = myObjects.search('options.fillColor = "#00ff00"')
.add(myObjects.search('options.preset = "islands#greenStretchyIcon"'))
// После того, как мы нашли все зеленые объекты, добавим к ним
// объекты, найденные на предыдущей итерации.
.add(byColor);
}
if ($('#yellow').prop('checked')) {
byColor = myObjects.search('options.fillColor = "#ffcc00"')
.add(myObjects.search('options.preset = "twirl#yellowIcon"'))
.add(byColor);
}
// Отберем объекты по форме.
if ($('#point').prop('checked')) {
byShape = myObjects.search('geometry.type = "Point"');
}
if ($('#polygon').prop('checked')) {
byShape = myObjects.search('geometry.type = "Polygon"').add(byShape);
}
if ($('#circle').prop('checked')) {
byShape = myObjects.search('geometry.type = "Circle"').add(byShape);
}


// Вот тут:
var minimus = $( "#slider-range" ).slider( "values", 0 );
byPrice = myObjects.search('properties.minpr > minimus').add(byPrice);
//

// Мы отобрали объекты по цвету и по форме. Покажем на карте объекты,
// которые совмещают нужные признаки.
shownObjects = byColor.intersect(byShape).intersect(byPrice).addToMap(myMap);
// Объекты, которые не попали в выборку, нужно убрать с карты.
myObjects.remove(shownObjects).removeFromMap(myMap);

}

$('#red').click(checkState);
$('#green').click(checkState);
$('#yellow').click(checkState);
$('#point').click(checkState);
$('#polygon').click(checkState);
$('#circle').click(checkState);

$(function() {
$('#slider-range').slider({
range: true,
min: 0,
max: 8000,
values: [ 75, 7750 ],
slide: function( event, ui ) {
$( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
},
stop: function(event, ui) {
checkState();
}
});
$( "#amount" ).val( "$" + $( "#slider-range" ).slider( "values", 0 ) +
" - $" + $( "#slider-range" ).slider( "values", 1 ) );
});
});
}

 

За основу брал фильтрацию 2.0. И вывести фильтрацию по option.preset получилось нормально, а теперь при выполнении всей функции checkState() все просто исчезает.

Может кто знает, как без objectManager'a? И в чем ошибка может быть, что все пропадает?

З.Ы. Подобное делал через objectManager, при том очень гладко все прошло - сформирован запрос к json файлу на изменение чего либо, и проверяет просто properties.

12 комментариев
Javascript,API 2.1,geoQuery
Как открыть балун метки по клику вне карты
Сергей
13 марта 2015, 11:58

Подскажите, пожалуйста, как можно программно центрировать метку (panTo) и затем открывать ее балун (balloon.open)?

 

В настоящей реализации есть карта на которую добавлен Clusterer , в него затем добавляются Placemark с индивидуальными данными для балунов. Нужно по клику на описании адреса (метки) расположенном вне карты центрировать карту по метке и открывать ее балун.

 

 

var markData = {
   lat: 10,
   lon:20,
   title: 'title',
   image: 'image',
   link: 'link'
}
ymaps.ready(function()
{
     var map = new ymaps.Map('id', {
           center: [0,0],
           zoom: 0,
     }),
     clusterer = new ymaps.Clusterer(),
     mark = new ymaps.Placemark([markData.lat, markData.lon],
           {
                title: markData.title,
                image: markData.image,
                link: markData.link
           },
           {
                balloonLayout: 'balloon html...'
           }
      )
    
     map.geoObjects.add(clusterer)
     clusterer.add(mark)
     map.setBounds(clusterer.getBounds())
})
$('#someMarkLink').on('click', function(){
    здесь известны данные метки (markData) добавленной на карту
    необходимо центрировать карту по метке и открыть ее балун
})

 

4 комментария
API 2.1,geoQuery
Как скрыть оставшуюся часть карты?
Антоний Великий
4 марта 2015, 02:48

Всем доброго времени суток! 

Я так и не понял, как сделать маску вокруг определённой региона\области что бы скрыть все остальное.

Прошу не кидайтесь ссылкой на пример. Я его вторые сутки понять не могу. Там слишком все громоздко.

Пожалуйста!!! Напишите пример маски (или хотя бы ткните пальцем в строчку кода из примера, в которой есть нужная мне информация) для любого региона\области.

 

Вот код уже готового, выделенного региона (вокруг него надо все спрятать):

ymaps.geoQuery(ymaps.regions.load("RU", {
    lang: "ru",
    quality: 3
})).search('properties.hintContent = "Самарская область"').setOptions('fill', false).addToMap(map);

 

Заранее всем спасибо!

3 комментария
regions,API 2.1,API 2.0,geoQuery
Скрипт перестаёт выполняться
Костерин Максим
30 ноября 2014, 20:27

Пытаюсь найти в каком полигоне появляется результат поиска. Но на строчке myMap.geoObjects.searchInside(ttk_polygon.geometry); выполнение кода останавливается. Отладчик не выдает ни одной ошибки. 

Не совсем понимаю, какой объект использовать для вызова searchInside.

 

mySearchControl.events.add('resultselect', function (e) {
        var index = e.get('index');
        mySearchControl.getResult(index).then(function (res) {
            mySearchResults.add(res);           
            objectsInTTk = myMap.geoObjects.searchInside(ttk_polygon.geometry);
            objectsInMoscow = myMap.geoObjects.searchInside(mkad_polygon.geometry);
            if (objectsInTTk.length) {

                // Адрес внутри ТТК
                console.log('внутри ттк');

            } else if (objectsInMoscow.length) {

                // Адрес внутри МКАД
                console.log('внутри мкад');

            } else {

                // Адрес за МКАД
                // Расчет расстояния до адреса
                console.log('за мкад');       
            }

 

 

Помогите разобраться. Спасибо!

3 комментария
API 2.1,коллекции,geoQuery
Центрирование карты
g29m62zb
19 ноября 2014, 21:08

Здравствуйте! Разобрался с гео-определением, Загрузкой данных с помощью JQuery и добавление их на карту (JSON).

Это помогло

Остался последний момент:

6 фирм на карте. 5 радом - а одна в Аргентине, на другом конце карты. Но мне надо насильно центрировать карту ровно по Москве - и пускай Аргентина не будет видна (прокрутит сам, если что).

 

var myMap = new ym.Map('YMapsID', {
center: [37.64, 55.76],

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

1 комментарий
области видимости,jQuery,API 2.1,geoQuery
Как отобразить одну конкретную метку?
s a
18 ноября 2014, 18:34

Добрый день. 

Есть карта.

На ней 100 меток.

У каждой метки есть тип и ид.

Обычно отображается все сразу.

Но иногда нужно отображать только метки одного типа или только метки другого типа.

Это можно решить через коллекции как я понял.

Но иногда нужно скрыть все метки кроме одной. Как это сделать?

Нашел тут свойство visible - оно подходит.

Но как в метку передать уникальный id чтобы потом по нему найти из программы - не понял.

И еще - а через jquery будет работать как нить так или надо обязательно пользоватся api yandex.map

$('ymaps').hide();

 $('ymaps #uid').show(); 

5 комментариев
метка,API 2.1,geoQuery
map.setBounds(Collection) только для видимых маркеров внутри коллекции
diz2html
12 ноября 2014, 23:39

Есть необходимость фильтровать коллекцию с маркерами по разным параметрам - одни прятать, другие выводить.

После чего необходимо задать границы карты по видимым маркерам внутри коллекции.(map.setBounds(Collection))

Можно ли так сделать, или нужно создавать новую коллекцию и помещать туда отфильтрованные видимые маркеры?

2 комментария
API 2.1,область видимости,geoQuery
Поиск меток по окружности
shtepselb95
29 октября 2014, 17:28

Можно ли найти все метки в заданном радиусе как нибудь? То есть задаёшь точку и радиус, а карта выдает все метки, которые вошли туда. В документации не нашел такого, или может быть плохо искал.

2 комментария
метка,API 2.1,круг,geoQuery