Клуб API Карт

По какому критерию сравниваются объекты при выполнении групповых операций с ymaps.geoQuery?

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

 Ситуация такая:

Объявил карту, на событие 'boundschange' сделал ajax загрузку объектов с данными

Всего объектов до 10 тысяч поэтому использую при запросе e.get("newBounds") и запрашиваю с сервера то, что нужно для отображения

Раньше пользовался коллекциями ymaps.GeoObjectCollection

Каждый загруженный объект помимо координат имел уникальный идентификатор

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

Сейчас хочу воспользоваться geoQuery для дополнительного функционала

loadedObjectsQuery=ymaps.geoQuery(myList)
oldObjectsQuery=ymaps.geoQuery(myMap.geoObjects)
loadedObjectsQuery.remove(oldObjectsQuery).addToMap(myMap)
oldObjectsQuery.remove(loadedObjectsQuery).removeFromMap(myMap)

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

как можно задать способ сравнения объектов для определения их уникальности?

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

У нас не предусмотренf кастомная функция-компаратор в методах add и remove. Так что делать это придется, грубо говоря, вручную.

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

Вообщем для рисования данных из объекта data получилась такая функция


function(data){
  myList=[]
  for (key in data){
    placemark=new ymaps.Placemark([data[key][2],data[key][1]])
    placemark.data=key
    myList.push(placemark)
    }
  loadedObjectsQuery=ymaps.geoQuery(myList)
  oldObjectsQuery=ymaps.geoQuery(myMap.geoObjects)
  toDelete=oldObjectsQuery.search(function(o){if (loadedObjectsQuery.search(function(l){return l.data==o.data}).getLength()==0) return true})
  toDelete.removeFromMap(myMap)
  noDraw=loadedObjectsQuery.search(function(l){if (oldObjectsQuery.search(function(o){return l.data==o.data}).getLength()==1) return true})
  loadedObjectsQuery.remove(noDraw).addToMap(myMap)
        }