yandexmapkit-android
yandexmapkit-android copied to clipboard
MapController.setZoomToSpan(double LAT, double LON)
как я понял, метод делает аджаст зума таким образом, чтобы был виден и текущий центр карты и лат лон, который передается как параметр.
вот значения, которые я получаю на реальном устройстве;
center [lat=50.44946030290322, lon=30.471123797114778]
myLocation [lat=50.38987350463867, lon=30.528392791748047]
after zoom 3.0
работает то отлично, обе позиции видно :) но в реальности зум должен быть 9-10, или я не понимаю логику работы метода??
Может приложить кусок кода чтоб быстрее можно было проверить ваше подозрение .
код наврядле поможет, только запутает(кроме того, мы откатились на прошлую версию мапкита и он просто не сохранился). по факту сначала я делаю мув то позишн с координатами центра карты и зумом 14, потом сет зум то спан и параметрами передаю координаты моего текущего местоположения(оно определено, взято из китового локейшноверлея) как результат я получаю каррент зум = 3, хотя 9 было бы вполне достаточно.
для проверки я дал точные координаты, попробуйте сделать мув + аджаст с этими координатами.
Вы запускаете эти команды одновременно. То есть одна сразу идет за другой ?
нет. последовательнсоть такая:
- асинктаском добавляются елементы на карту(около 300)
- по окончанию работы асинктаска карта центрируется на одной из точек
- запускается новый асинктаск, в котором проверяется, найдена ли текущая позиция смартфона и если она найдена, то вызывается сет зум то спан с координатами май локейшен итема.
Последний асинктаск лишний так как есть возможность получать колбеки когда придут изменения по местоположению, но это не важно. Центрируетесь к элементу через анимацию ?
честно, не помню, какой из методов я использовал. скорее всего без анимации. а между ними есть разница, если не считать анимации перехода к новому центру?
Такая же проблема:
@Override
public void onMyLocationChange(MyLocationItem myLocationItem) {
mapController.setPositionNoAnimationTo(myLocationItem.getGeoPoint());
if (geoPoint != null)
mapController.setZoomToSpan(geoPoint.getLat(), geoPoint.getLon());
}
В geoPoint у меня хранится точка, до которой надо растянуть масштаб. Местоположение пользователя и точка находится в пределах одного города, масштаб же уменьшается, показывая весь континент. Причем нет разницы, использую я setPositionNoAnimationTo() или setPositionAnimationTo()
На данном примере пока рекомендую делать вызов mapController.setZoomToSpan(geoPoint.getLat(), geoPoint.getLon()); через небольшой промежуток времени (для начало попробуйте его запустить для теста через 1000 чтобы убедится что отработало корректно ) или отловить событие что скролл закончился7
Не помогает, ставлю паузу в 4 секунды, он успевает центрироваться на местоположение пользователя, ждет, потом все равно уменьшает масштаб до минимума.
Ой ). Вы отдает целиком точку, но это не верно смотрите пример
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);
И он установит нужный зум чтоб в область помещались все объекты
center [lat=50.44946030290322, lon=30.471123797114778]
myLocation [lat=50.38987350463867, lon=30.528392791748047]
По поводу этих координат все в норме отображаются на экране nexus s масштаб корректный 12 зум
Спасибо, так помогло. Может, стоит это в документации указать, а то это не сильно очевидно?
Может ). Так же еще есть вариант посмотреть как это реализовано в примере
кстати хочу заметить, зумвспан норм отрабатывает, единственное что иногда не все объекты влазят если расстояния большие по долготе. еще было бы неплохо чтобы окончание зума вызывало хоть какой-то ивент, а то пока непонятно как перехватить конец операции и перерисовать. все это не критично, но было бы неплохо глянуть на досуге.
Есть метод для мониторинга сообщений от карты. Посмотрите в примере там есть пример показывающий окончания скрола, зума
но так в этом то и фишка, что зум_енд ивент не срабатывает при зумспан. любые тачевые скейлы и зумы перехватываю и отрисовываю, все другие ситуации у меня работают нормально, но для зумспан заметил что он не дает ивента зум_енд.
@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)) {
//метод перерисовки
}
}
метод перерисовки не вызывается при зумспан
Да действительно вы правы сейчас сейчас глянул так и есть. Поставил багу на это дело. Могу пока посоветовать делать скрол в центр объектов и отлавливать данные колбек
да я пока так и делаю, делаю при зумспане искусственный микросдвиг чтобы перерисовать, так что пока не критично.
Для тех, кто будет мучаться с масштабированием карты через setZoomToSpan, посмотрите решение в https://github.com/yandexmobile/yandexmapkit-android/issues/175. Перенос выполняется корректно, а вот масштабирование - только после инициализации карты и то не всегда. Заметил, что если запущен какой-то запрос, то масштабирование может не выполниться.