Клуб API Карт

Разъясните использование geocoder.suggest и geocoder.AddressDetails

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

Во что упираюсь:

  1. suggest прекрасно возвращает исправленный вариант для Москвы и Питера, а вот для "Екатиринбург" не выводит исправленный вариант, но дает верные координаты.
  2. AddressDetails... Для Москвы .AddressDetails.Country.Locality.LocalityName , а для областных городов .AddressDetails.Country.AdministrativeArea.Locality.LocalityName. Если поставить их подряд, что в моем понимании должно привести к тому, что отрабатывает сначала первая конструкция, потом вторая, то вторая никак не хочет отрабатывать. Как мне корректно выводить название города при любых условиях?
6 комментариев
1. А не могли бы вы привести пример запроса, для которого suggetst не
срабатывает?
2.Ну можно пробежаться по вложенным объектам до нахождения LocalityName. С этим возникла сложность?
1. Города: "Екатиринбург", "Новосебирск".
Код:
// В b подставляем слово из поиска.
var geocoder = new YMaps.Geocoder(b, {results: 1, boundedBy: map.getBounds()});
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
                if (this.length()) {
                    map.setCenter(this.get(0).getGeoPoint(),10);
                    if (this.suggest != NULL) {
                        alert(this.suggest);
                    }
                 } else {
                    alert("Ничего не найдено")
                }

2. "Ну можно пробежаться по вложенным объектам до нахождения LocalityName. С этим возникла сложность?"
Собственно да. Как проверить существование AdministrativeArea, например?
С первым пунктом разобрался, нужно вместо
                   if (this.suggest != NULL) {
                        alert(this.suggest);
                    }
использовать
                   if (this.suggest) {
                        alert(this.suggest);
                    }
Найти нужно свойство несложно, ищется так:
var geocoder = new YMaps.Geocoder("Екатеринбург", { results : 1 });

YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
    var localityName = getDetail(geocoder.get(0).AddressDetails, "LocalityName");
    console.log(localityName);
});
Рекурсивный поиск осуществляется с помощью небольшой самописной функции getDetail:
function getDetail (details, propName) {
    var result = false;
    for (var i in details) {
        if (i == propName) {
            result = details[propName];
            break;
        } else if (details[i] instanceof Object) {
            result = arguments.callee(details[i], propName);
        }
    }
    return result;
}
Возвращает значение поля, переданного в качестве второго параметра. В случае неудачного поиска возвращает false.
Огромное спасибо!
Михаил Ярополов
28 января 2016, 07:28
Большое спасибо за функцию getDetail!