Клуб API Карт

Каким образом определить город и область пользователя в API Яндекс.Карт 2.1?

MurzNN
16 октября 2014, 19:01

Ранее в API 2.0 использовалась следующая конструкция:

 

var regiontxt = ymaps.geolocation.city ? ymaps.geolocation.city : ymaps.geolocation.region;

Но при переходе на API 2.1 этот метод перестал работать и я не смог найти альтернативный вариант чтобы найти текстовое название города.

В документации http://api.yandex.ru/maps/doc/jsapi/2.0/dg/concepts/geolocation.xml есть пример с выводом города

а в http://api.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/geolocation.xml - уже нет, и других вариантов через поиск по словам city, region - найти не удалось.

Сообщите пожалуйста, каким образом можно получить текстовое название города пользователя через API Яндекс.Карт 2.1?

 

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

Спасибо за оперативный ответ! Я второй пример уже пробовал, но он почему-то ничего не выводит:

    console.log('1');
    console.log(result.geoObjects.get(0));
    console.log('2');
    console.log(result.geoObjects.get(0).properties.get('metaDataProperty'));
    console.log('3');
    console.log(result.geoObjects.get(0).properties.get('metaDataProperty').getAll());

- сейчас выводит у меня вот это: http://wstaw.org/m/2014/10/16/plasma-desktopcl3630.png

Т.е. до getAll() - все хорошо, а на нем - уже пусто.

Хотя сейчас поковырялся в объекте metaDataProperty и нашел там параметр LocalityName с городом - http://wstaw.org/m/2014/10/16/plasma-desktopmc3630.png

Но не совсем понятно как его через функцию get получить, можете подсказать?

Там лежит просто ответ геокодера, см. любой пример типа http://api.yandex.ru/maps/jsbox/2.1/direct_geocode

Спасибо за помощь, название города удалось получить вот такой строкой:

console.log(result.geoObjects.get(0).properties.get('metaDataProperty.GeocoderMetaData.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName'));
Там лучше подстраховаться, SubAdministrativeArea может для каких-то городов отсутствовать.

Т.е. если возвращается пустой результат то брать более верхний элемент?

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

Это ведь одна из самых востребованных функций API Яндекс.Карт, т.к. сейчас чуть ли не каждый второй мультирегиональный интернет-магазин пытается угадать город пользователя, чтобы подставить нужный телефон и адреса магазинов.

согласен! где пример...день бился чтобы найти необходимую информацию( издевательство.

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

знатоки, подскажите конкретный пример, чтоб вывести город пользователя. уже замучался я. не понимаю я в джаваскриптах. всё работало нормально в 2.0, пытаюсь, чтоб заработало и на версии апи 2.1, так как на 2.0 не корректно работает виджет доставки янлдекса
hiop-ru,
http://jsfiddle.net/rL7bztfw/
dimik,
крутяк) спасибо. однако город не всегда точно определяется. попробовал вывести регион, заменив в предложенном Вами коде city на region, ничего не вышло=)) можете подсказать с этим?)
hiop-ru,
Можно попробовать добавить kind: 'locality'


http://jsfiddle.net/rL7bztfw/1/
dimik,
всё равно выводится город,а  не регион
hiop-ru,
а для каких координат?
dimik,
не понял, что это значит?) я в Москве)
я подумал, что выводить регион будет целесообразнее, чем город
dimik,
Координаты: 55.75396,37.620393
Город: Москва


в прошлом коде иногда выдавал мне Красногорск.
dimik,
и в этом новом коде иногда определяет как Красногорск
hiop-ru,
Это координаты в центре Москвы
dimik,
Проблема в том, что Хром блокирует геолокацию по http.
Смотреть надо по https
https://jsfiddle.net/rL7bztfw/2/
dimik,
по https координаты 55.8085168,37.822161 .  однако, при этом в браузере всплывает окошко с запросом на разрешение предоставить геоданные. 
пожалуйста, можете сделать вывод региона, а не города. так же как Вы сделали, только регион (область) чтоб выводился, а не город=) тогда никаких табличек не будет и всё равно, что он определит Красногорск, например. ведь выводится будет "Москва и Московская область" ну или другой регион, в котором юзер)
hiop-ru,
Удалите из кода provider: "browser"
dimik,
удалил. так всё равно выводится город, а не регион=))
dimik,
всё равно не так. в ИЕ11 вообще не работает. в последнем ИЕ на 10 винде спрашивает про местоположение
hiop-ru,
Если лень читать мануал к API, может вообще этим не заниматься? А ведь там сказано, что по умолчанию provider: 'auto', т.е. скрипт пытается определить местоположение всеми доступными способами, включая запрос геолокации у браузера, для определения по ip нужно указать provider: 'yandex'. Про регион смотрите GeocodeResult, а именно, его метод  getAdministrativeAreas()
cyber-jet,
Если человек не слишком разбирается в чем-то нельзя посылать его подальше. Раньше в API 2.0 все было более или менее понятно и элементарно: https://jsfiddle.net/dmitryv/y5LLyz1m/
А как сейчас в API 2.1 получить область по ip до сих пор непонятно, и думаю не только мне! Об этом и здесь говорят, например, MurzNN и ceo.roman... Нормальных примеров в руководстве в отличие от API 2.0 нигде нет. Город определяется по IP неверно - Красногорск вместо Москвы, поэтому нафиг.Как прикрутить GeocodeResult + getAdministrativeAreas() к https://jsfiddle.net/rL7bztfw/2/ (с provider: 'yandex') чтобы получить область? Или ещё как-то получить область?Может кто-то помочь?
viarlar,
смотрите GeocodeResult он расширяет возможности GeoObject, своими событиями и методами, вот код для получения области, метод ".getAdministrativeAreas()":
 
ymaps.ready(function(){
    ymaps.geolocation.get({
        provider: 'yandex'
    }).then(function (result) {
        var loc = result.geoObjects.get(0).getAdministrativeAreas();
        console.log(loc);
    });
});
viarlar,
Не слишком разбираться и не хотеть разбираться это совсем разные вещи. Вам написали какой класс надо посмотреть в документации, а вы сидите и ждёте "Нормальных примеров"


https://jsfiddle.net/y5LLyz1m/7/
cyber-jet, Спасибо за конкретный пример!
dimik, тоже спасибо за пример!)
Если чтобы получить пример, нужно выслушать нравоучение, я готов его прослушать несколько раз. В принципе, стимулирует, наверное.)) Для тех, у кого программирование не является профильным именно примеры дают возможность решить практические задачи без углубления в тонкости работы с javascript. В руководстве и документации Яндекса для данного случая примеров к API 2.1 нет!  На основе документации у меня за немалое время без полных знаний javasctipt получить результат не получилось. В классах не силён, как будет время, буду разбираться и изучать...
evgeny-nosikov
15 мая, 21:40
dimik,
Спасибо за примеры.
Но, возможно, закралась ошибка. Я нахожусь в г. Брянск, Брянской области
А данный пример выдает: Россия, Республика Бурятия, село Брянск
до недавнего времени использовал такой код на сайте
$(function(){
ymaps.ready(init);
function init() {
var geolocation = ymaps.geolocation;
if (geolocation) {
$("#order-fld-2")
.html(geolocation.country + ', ' + geolocation.region + ', ' + geolocation.city);
}}
});
https://jsfiddle.net/dmitryv/y5LLyz1m/

получал тот город, который указан в настройках. но теперь внезапно это перестало работать и показывает тот регион, где пользователь реально находится. можно как-то это вернуть?
dv@nadizele.ru,
Нет, это вернуть нельзя
А есть вариант корректного возвращения области для столиц? 
В свойстве AdministrativeAreaName, если объект столица, возвращается не область, а название города. 


Решается это через api, как нибудь ? 



startmars@tut.by,
города федерального значения, например, Москва, не входят в какую-либо область