2016-07-08 5 views
3

У меня есть два маркера на карте, которые должны отображаться одновременно.Google map увеличить масштаб между LatLng Bounds

Это достигается за счет:

final LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
    for (Marker markerTemp : markers) { 
     builder.include(markerTemp.getPosition()); 
    } 

это работает отлично. Однако, когда маркеры находятся близко друг к другу, карта сильно уменьшена. Вот как это бывает: 1- Я выбираю два местоположения, которые находятся близко друг к другу (зум хорошо) 2- Я выбираю два местоположения, которые далеки друг от друга (зум хорошо) 3- Я выбираю два местоположения которые близки друг к другу (масштабирование остается одинаковым, а маркеры - на коленях).

Я проверил так много ссылок в том числе:

(1) https://stackoverflow.com/questions/34247347/initialize-google-map-to-zoom-to-bounds (2) bounds google maps

(3) Setting max zoom level in google maps android api v2 (4) Android map v2 zoom to show all the markers

(5) Adjusting google map (api v2) zoom level in android (6) Set a max zoom level on LatLngBounds builder

(7) android Zoom-to-Fit All Markers on Google Map v2

+0

Почему вы не проверяете расстояние между местоположениями, и если они достаточно близко, увеличьте масштаб больше? –

+0

Я не могу понять, в чем разница между пунктами 1 и 3 ... Если точки слишком близки (допустим, пару метров), ограничительная коробка, возможно, будет маленькой, чтобы ее можно было показать. Обратите внимание, если две точки находятся на одной линии (такой же Lat или тот же Lng), это может привести к проблемам при создании ограничивающей рамки! –

+0

@ Тони попробовал это в определенном подходе. Если у вас есть пример, я буду более чем счастлив попробовать. –

ответ

0

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

метода, чтобы найти прямое расстояние между два местом

location1.distanceTo(location2); 

Теперь, чтобы вычислить радиус, используйте следующее. dummy_radius будет составлять половину выше значения

double circleRad = dummy_radius*1000;//multiply by 1000 to make units in KM 

private int getZoomLevel(double radius){ 
      double scale = radius/500; 
      return ((int) (16 - Math.log(scale)/Math.log(2))); 
} 

float zoomLevel = getZoomLevel(circleRad); 
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLon, zoomLevel)); 
+0

Я дам ему попробовать сейчас –

2

Похоже, вы используете функцию, чтобы при необходимости уменьшать масштаб, но не приближать как можно ближе. Можете ли вы опубликовать часть, которую вы используете, для анимации камеры?

Если вы просто используете

LatLngBounds bounds = builder.build(); 
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 20)); 

он должен работать. И обязательно вызовите его и не заверните в чек, который выглядит, если границы уже видны.

+0

Я делаю точно то же самое. это все тот же вопрос. Thnx –

2

Комплексного решения этой задачи без использования карты отступы. Эта функция займет весь объект latlng и вернется обратно с помощью пары, где сначала будет пара. Сначала будет центр и пара. Второй будет уровнем масштабирования.

public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) { 
    float max = 0; 

    if (l == null || l.length == 0) { 
     return null; 
    } 
    LatLngBounds.Builder b = new LatLngBounds.Builder(); 
    for (int count = 0; count < l.length; count++) { 
     if (l[count] == null) { 
      continue; 
     } 
     b.include(l[count]); 
    } 

    LatLng center = b.build().getCenter(); 

    float distance = 0; 
    for (int count = 0; count < l.length; count++) { 
     if (l[count] == null) { 
      continue; 
     } 
     distance = distance(center, l[count]); 
     if (distance > max) { 
      max = distance; 
     } 
    } 

    double scale = max/1000; 
    int zoom = ((int) (16 - Math.log(scale)/Math.log(2))); 
    return new Pair<LatLng, Integer>(center, zoom); 
} 

вы можете использовать его как follwing

Пара пары = getCenterWithZoomLevel (l1, l2, l3 ..); mGoogleMap.moveCamera (CameraUpdateFactory.newLatLngZoom (пара.первый, пара.секунда));

 Смежные вопросы

  • Нет связанных вопросов^_^