Клуб API Карт

Поиск и сортировка объектов

spiritabsolute
31 марта 2014, 16:56

Привет всем! Подскажите, где подсмотреть реализацию поиска, и изменения выборки по своим данным.

Данные приходят на страницу с помощью ymapsml. 

Мне нужно сделать, что то типа сортировки по статусам. Есть 4 статуса, они будут написаны возле карты, по клику на них, нужно будет показывать только те метки которые имеют этот статус. Изначально приходят все метки. В документации на этой странице http://api.yandex.ru/maps/doc/jsapi/2.x/dg/concepts/geoquery.xml увидел что то похожее, то есть как будто можно сделать выборку по всем объектам на карте, и уже по ним искать этот статус. Но ничего не получается. Пробовал искать просто по названиям меток, все равно он пишет количество объектов 0, хотя метки с таким названием есть. И сам массив с выборкой тоже появляется, когда делаешь останов кода, проверяешь переменную, в ней есть результат.

Пока что пытаюсь по клику выполнять поиск вот таким образом... http://jsfiddle.net/u9MPk/

29 комментариев
Подписаться на комментарии к посту

Посмотрите пример в песочнице http://api.yandex.ru/maps/jsbox/geoobjects_menu

Пытаюсь сделать по аналогии.

Не понятно по какому полю мне искать с помощью метода seach, если у меня данные приходят на карту в xml в поле $[metaDataProperty.AnyMetaData.status] в виде строки.

Все, что приходит в поле AnyMetaData доступно вот по какой ссылке через геообъект

geoObject.properties.get('metaDataProperty.AnyMetaData.status')

Поиск, соответственно, нужно делать по такому же полю

var objects = ymaps.geoQuery(geoXmlLoad('url'));

objects.search('properties.metaDataProperty.AnyMetaData.status == "1"').addToMap(myMap);

 

что-то типа того.

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

спасибо! сейчас попробую! 

var objects = ymaps.geoQuery(geoXmlLoad('http://map.nameshell.ru/ymapsml.php'));

Uncaught ReferenceError: geoXmlLoad is not defined

ругнулся на вот эту строчку :(

замените на ymaps.geoXml.load('...')

shownObjects = objects.addToMap(myMap);

Uncaught TypeError: Object # has no method 'addToMap'

теперь на эту :(

http://jsfiddle.net/NB73a/

инициализация карты у меня такая, api 2.0

пока что пробую только по клику 1 статуса отыскать по номеру телефона для теста... 

http://jsfiddle.net/NB73a/1/

Если вы уже отдельно получаете объекты из geoXml, не надо второй раз их запрашивать для добавления в geoQuery.

Поправила немного код - в балуне что-то показалось, не знаю, то, что надо или не то =)

спасибо большое! завтра продолжу побеждать это все дело :)

Так же не понятна эта строчка,

shownObjects = byColor.intersect(byShape).addToMap(myMap);

Как мне ее записать, если у меня только один параметр byColor например, куда девать byShape и что писать в intersect. Или просто записать shownObjects = byColor.addToMap(myMap);

Так как не понятно по какому критерию осуществлять поиск в моем случае, не могу проверить даже работу... :(

У меня приходит вот такой xml http://map.nameshell.ru/ymapsml.php

Как мне сделать поиск по полю статус с этим методом seach() ?

 

Привет! В общем у меня получился вот такой код. http://jsfiddle.net/uhTvP/

В 3 строчке вызываю подключение к xml потому что не смог понять как мне обратиться к начальному результату этого подключения при инициализации карты. Ругалось на 5 строчку 'res' , пришлось сделать так.. :)

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

Второе, это то что поиск получается не срабатывает, потому что на карте только 1 метка с таким телефоном, а он добавляет все равно все... 

http://map.nameshell.ru/shop-map/ вот тут можно посмотреть пример! При клике на "Интернет магазин" выше карты срабатывает этот код, который я дал выше. Подскажи, пожалуйста, как починить.

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

 Попробуйте поотлаживать код. Например, посмотреть, сколько элементов хранится в какой выборке.

Вот код 

objects.search('properties.metaDataProperty.AnyMetaData.phone == "+7 (812) 490-66-70"');

        shownObjects = objects.addToMap(myMap);

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

 

После строчки

objects.search('properties.metaDataProperty.AnyMetaData.phone == "+7 (812) 490-66-70"');

переменная objects не меняет свой состав, потому что выборки в geoQuery неизменяемые

 

Правильно делать так

shownObjects = objects.search('properties.metaDataProperty.AnyMetaData.phone == "+7 (812) 490-66-70"').addToMap(myMap);


Соответственно по этой же причине и удаление не срабатывало

поменял код, все равно не срабатывает. http://jsfiddle.net/KYc9c/

ставлю остановы, в строчке 5 6 7

в 5 строчке массив shownObjects пустой

в 6 строчке shownObjects == GeoQueryResult {_sl: Array[1], _J: null, _tl: null, _ul: s, _vl: true…} как мне разобраться в нем там куча данных

в 7 строчке shownObjects  == GeoQueryResult {_sl: Array[6], _J: null, _tl: null, _ul: s, _vl: true…} 

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

Вызывайте у выборок getLength - будет видно, сколько в них объектов.

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

Почитайте документацию, поотлаживайте, направление верное, но надо доработать.

да! разобрался в чем логический косяк, вот я ниже написал, теперь нужно синтаксис правильный, почему то удаление в 7 строчке вообще не срабатывает. подскажите пожалуйста правильный синтаксис в моем случае, с моей инициализацией, для удаления всех меток, и добавления меток полученных в результате поиска

objects.remove(shownObjects).removeFromMap(myMap);GeoQueryResult {_sl: Array[5], _J: null, _tl: null, _ul: s, _vl: true…}вот эта строчка, не удаляет ничего с карты...

Сколько элементов в выборке shownObjects?

Сколько элементов в выборке objects.remove(shownObjects)?

objects.remove(shownObjects).getLength()5

а всего на карте 6!!! то есть как будто все правильно! но на карте ничего не убирается 

shownObjects.getLength() показал что там 1 объект! значит поиск сработал правильно! осталось только правильный синтаксис написать добавления этого 1 объекта на карту, и удаления всех остальных! подскажите, пожалуйста!

в момент перехода на 7 строчку! то есть после добавления в 6 строчке

shownObjects.getLength() показывает снова 6 !

в предыдущей строчке shownObjects.getLength() равен 1!

Почему это происходит ?

если 6 строчка есть, то есть добавление результата поиска, то objects.remove(shownObjects).getLength() показывает 0, если ее комментировать то 5

http://jsfiddle.net/29uZs/

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

objects.getLength()6objects.remove(shownObjects).getLength()5shownObjects.getLength()

1


Но строчка удаления с карты меток не срабатывает! Что то с синтаксисом удаления меток с карты

В общем косяк в удалении , методы objects.removeFromMap(myMap); и objects.remove(myMap); не срабатывают, хотя они как будто что то делают, появляется массив в консоли, но с карты ничего не удаляется. Спасибо тебе за помощь , ты очень помогла, я создам тему, мб кто подскажет альтернативу такому удалению.

Я кажется понимаю - все метки хранятся в коллекции, которая добавлена на карту. Поэтому их бессмысленно удалять с карты - они все в коллекции.

Надо попробовать вот так

objects.removeFrom(res.geoObjects)

Вообще там надо внимательно смотреть, откуда и куда удалять-добавлять объекты, с карты или из коллекции

К сожалению так же :( Что то сработало, но метки остались на карте. 

objects.removeFrom(res.geoObjects)GeoQueryResult {_sl: Array[12], _J: null, _tl: null, _ul: s, _vl: true…}

в 6 строчке нужно поставить полное удаление всех меток с карты,

а в 7 строке добавить на нее метки удовлетворяющие результату поиска.

Подскажите, как это будет выглядить в синтаксисе.