Клуб API Карт

Поиск ближайшего объекта на карте [РЕШЕНО]

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

Подскажите что делаю не так.

Нужно перебрать все объекты на карте и найти ближайший.

 

searchControl.events.add('resultselect',

function() {

...

                var dist=6200000;

var y = searchControl.state.get('currentIndex')

searchControl.getResult(y).then(function (result) {

geoResult = result.geometry.getCoordinates();

});

map.geoObjects.each(function (obj3) {

dist2 = ymaps.coordSystem.geo.getDistance(obj3.properties.get('coordPosition'), geoResult);

if ( dist2 < dist ) { obj4 = obj3; dist = dist2;}

filterObject = obj4;

});

...

});

 

Получаю:

Uncaught TypeError: Cannot read property '0' of undefined

 

8 комментариев

earchControl.getResult(y) - асинхронный вызов

Понятно.

Только спотыкается она тут: obj3.properties.get('coordPosition')

Хотя может я что-то не так понял.

такого тоже нет

obj3.properties.get('coordPosition') вернет undefined

надо obj3.geometry.getCoordinates()

 

В таком случае получаю:

Cannot call method 'getCoordinates' of null

Ничего не понимаю.

В старых картах работал с массивами объектов, а в новой версии решил с уже добавленными на карту объектами.

 

var filterObject = ml[0].get(0).forEach(function (obj3) {

dist2 = obj3.getGeoPoint().distance(geoResult.getGeoPoint());

if ( dist2 < dist ) { obj4 = obj3; dist = dist2;}

return obj4;

});


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

ну видимо у тебя там коллекция попадает в obj3

вообще map.geoObjects лучше не перебирать (там много чего может быть)

а работать с отдельной коллекцией в которой только нужные тебе объекты будут

Если сделать

ml[0].each(function (obj3) {

то

obj3.properties.get('coordPosition');

выдает undefined, а 

obj3.geometry.getCoordinates();

снова Cannot call method 'getCoordinates' of null

 

в коллекции может быть еще она коллекция =)

яйцо в утке, утка в зайце, заяц ... и так до безконечности )

Коллекция или нет можно проверить через obj3 instanceof ymaps.GeoObjectCollection ну или duck typing используй

 

PS

get('coordPosition'); можно больше не пробовать, - это в объекте события так получать координаты.

Большое спасибо. Все время об этом забываю, т.к. занимаюсь картами с большыми перерывами.