yandexmapkit-android icon indicating copy to clipboard operation
yandexmapkit-android copied to clipboard

MapController.setZoomToSpan(double LAT, double LON)

Open bershadskiy opened this issue 12 years ago • 19 comments

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

вот значения, которые я получаю на реальном устройстве;

center [lat=50.44946030290322, lon=30.471123797114778]

myLocation [lat=50.38987350463867, lon=30.528392791748047]

after zoom 3.0

работает то отлично, обе позиции видно :) но в реальности зум должен быть 9-10, или я не понимаю логику работы метода??

bershadskiy avatar Oct 29 '12 10:10 bershadskiy

Может приложить кусок кода чтоб быстрее можно было проверить ваше подозрение .

mksaint13 avatar Nov 19 '12 11:11 mksaint13

код наврядле поможет, только запутает(кроме того, мы откатились на прошлую версию мапкита и он просто не сохранился). по факту сначала я делаю мув то позишн с координатами центра карты и зумом 14, потом сет зум то спан и параметрами передаю координаты моего текущего местоположения(оно определено, взято из китового локейшноверлея) как результат я получаю каррент зум = 3, хотя 9 было бы вполне достаточно.

для проверки я дал точные координаты, попробуйте сделать мув + аджаст с этими координатами.

bershadskiy avatar Nov 19 '12 11:11 bershadskiy

Вы запускаете эти команды одновременно. То есть одна сразу идет за другой ?

mksaint13 avatar Nov 19 '12 12:11 mksaint13

нет. последовательнсоть такая:

  1. асинктаском добавляются елементы на карту(около 300)
  2. по окончанию работы асинктаска карта центрируется на одной из точек
  3. запускается новый асинктаск, в котором проверяется, найдена ли текущая позиция смартфона и если она найдена, то вызывается сет зум то спан с координатами май локейшен итема.

bershadskiy avatar Nov 19 '12 12:11 bershadskiy

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

mksaint13 avatar Nov 19 '12 12:11 mksaint13

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

bershadskiy avatar Nov 19 '12 12:11 bershadskiy

Такая же проблема:

    @Override
    public void onMyLocationChange(MyLocationItem myLocationItem) {
        mapController.setPositionNoAnimationTo(myLocationItem.getGeoPoint());
        if (geoPoint != null)
            mapController.setZoomToSpan(geoPoint.getLat(), geoPoint.getLon());
    }

В geoPoint у меня хранится точка, до которой надо растянуть масштаб. Местоположение пользователя и точка находится в пределах одного города, масштаб же уменьшается, показывая весь континент. Причем нет разницы, использую я setPositionNoAnimationTo() или setPositionAnimationTo()

ookami-kb avatar Nov 19 '12 13:11 ookami-kb

На данном примере пока рекомендую делать вызов mapController.setZoomToSpan(geoPoint.getLat(), geoPoint.getLon()); через небольшой промежуток времени (для начало попробуйте его запустить для теста через 1000 чтобы убедится что отработало корректно ) или отловить событие что скролл закончился7

mksaint13 avatar Nov 19 '12 14:11 mksaint13

Не помогает, ставлю паузу в 4 секунды, он успевает центрироваться на местоположение пользователя, ждет, потом все равно уменьшает масштаб до минимума.

ookami-kb avatar Nov 20 '12 04:11 ookami-kb

Ой ). Вы отдает целиком точку, но это не верно смотрите пример

List<OverlayItem> list = mOverlay.getOverlayItems(); double maxLat, minLat, maxLon, minLon; maxLat = maxLon = Double.MIN_VALUE; minLat = minLon = Double.MAX_VALUE; for (int i = 0; i < count; i++){ GeoPoint geoPoint = list.get(i).getGeoPoint(); double lat = geoPoint.getLat(); double lon = geoPoint.getLon();

        maxLat = Math.max(lat, maxLat);
        minLat = Math.min(lat, minLat);
        maxLon = Math.max(lon, maxLon);
        minLon = Math.min(lon, minLon);
    }
    mMapController.setZoomToSpan(maxLat - minLat, maxLon - minLon);

И он установит нужный зум чтоб в область помещались все объекты

mksaint13 avatar Nov 20 '12 05:11 mksaint13

center [lat=50.44946030290322, lon=30.471123797114778]

myLocation [lat=50.38987350463867, lon=30.528392791748047]

По поводу этих координат все в норме отображаются на экране nexus s масштаб корректный 12 зум

mksaint13 avatar Nov 20 '12 06:11 mksaint13

Спасибо, так помогло. Может, стоит это в документации указать, а то это не сильно очевидно?

ookami-kb avatar Nov 20 '12 06:11 ookami-kb

Может ). Так же еще есть вариант посмотреть как это реализовано в примере

mksaint13 avatar Nov 20 '12 06:11 mksaint13

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

DenisShakinov avatar Nov 27 '12 12:11 DenisShakinov

Есть метод для мониторинга сообщений от карты. Посмотрите в примере там есть пример показывающий окончания скрола, зума

mksaint13 avatar Nov 28 '12 12:11 mksaint13

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

@Override
public void onMapActionEvent(MapEvent event) {
    if (event.getMsg() == MapEvent.MSG_SCALE_END || event.getMsg() == MapEvent.MSG_ZOOM_END
        || (mRefresh && event.getMsg() == MapEvent.MSG_SCROLL_END)) {
            //метод перерисовки
    }
}

метод перерисовки не вызывается при зумспан

DenisShakinov avatar Nov 28 '12 13:11 DenisShakinov

Да действительно вы правы сейчас сейчас глянул так и есть. Поставил багу на это дело. Могу пока посоветовать делать скрол в центр объектов и отлавливать данные колбек

mksaint13 avatar Nov 29 '12 07:11 mksaint13

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

DenisShakinov avatar Nov 29 '12 08:11 DenisShakinov

Для тех, кто будет мучаться с масштабированием карты через setZoomToSpan, посмотрите решение в https://github.com/yandexmobile/yandexmapkit-android/issues/175. Перенос выполняется корректно, а вот масштабирование - только после инициализации карты и то не всегда. Заметил, что если запущен какой-то запрос, то масштабирование может не выполниться.

CoolMind avatar Mar 29 '17 13:03 CoolMind