Клуб API Карт

Не загружается карта

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

Использую Android WebView и геолокацию. В браузере код отрабатывает без проблем. В Андроид же - показывает попытку геолоцирования и пустоту.

Прикладываю весь JS. В чем может заключаться разница в поведении?

 

 

ymaps.ready(firstLoad);




    function createMap (state, geo) {

        console.log('start create');

        var cMap = new ymaps.Map('map', state);

        cMap.events.add('click', function (e) {


                var coords = e.get('coords');

                ymaps.geocode(coords).then(function (res) {

                    var firstGeoObject = res.geoObjects.get(0);

                       console.log(firstGeoObject.properties.get('name'));

                });


            });

        console.log(cMap);

        if (geo != null) {

            geo.geoObjects.options.set('preset', 'islands#blueCircleIcon');

            cMap.geoObjects.add(geo.geoObjects);

        }

        cMap.setZoom(17);

        console.log('return create');

        return cMap;

    }

    

function firstLoad() {

    var map;

    ymaps.geolocation.get().then(function (res) {

        var mapContainer = $('#map'),

            bounds = res.geoObjects.get(0).properties.get('boundedBy'),

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

            mapState = ymaps.util.bounds.getCenterAndZoom(

                bounds,

                [mapContainer.width(), mapContainer.height()]

            );

        console.log('ok');    

        map = createMap(mapState, res);

    }, function (e) {

        // Если место положение невозможно получить, то просто создаем карту.

        console.log('Not ok');

        map = createMap({

            center: [55.751574, 37.573856],

            zoom: 2

        }, null);

    });


}

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

А что reject-обработчик срабатывает? Что приходит в "е"?

Удалённый пользователь
27 января 2016, 22:31

По консоль логу - срабатывает по основной ветке, в reject не падает. Однако createMap как-будто и не вызывается. В то же время, в браузере работает все как задумано.

Надо дебажить.

выводите boundedBy и mapContainer.width()/height() - все значения должны быть. Подключите АПИ с параметром &mode=debug, может будут исключения ловиться в webwiev  

Удалённый пользователь
27 января 2016, 22:31

Проблема решена. Видимо дело в JS функциях webkit браузера.

Заменил 

1. $('#map') на  document.getElementById('map')

2. mapContainer.width(), mapContainer.height() на  mapContainer.offsetWidth, mapContainer.offsetHeight

 

Теперь вопрос в производительности. Достаточно простой пример занял по замерам (performance.now() на входе и выходе ymaps.ready) 34 секунды с 4G интернетом. Можно ускориться каким-нибудь образом?

Убрали &mode=debug?

Удалённый пользователь
27 января 2016, 22:31

Убрал.

и все равно 34 сек?

на что именно время уходит загрузка АПИ или отрисовка карты с объектами?

Удалённый пользователь
27 января 2016, 22:31

Отрисовка карты занимает 466 мс, все время уходит (20 с из 22) на геолокацию:

var t2 = performance.now();
ymaps.geolocation.get().then(function (res) {
    var t3 = performance.now();

 t3 - t2 дает 20с. Может, мне лучше самому получать координаты от gps и отдавать их в JS и не использовать geolocation?

можно опциями отключить автогеокодирование и использовать провайдер - 'yandex' если не нужна прям суперточность до дома

Удалённый пользователь
27 января 2016, 22:31

Проблема в том, что нужна точность как раз до дома. Яндекс.Навигатор находит мое местоположение почти моментально. Здесь дело в каком-либо private api или просто диком несовершенстве моего примера?