Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set a max zoom level on LatLngBounds builder

I haven't found an answer in my search, there are a few answers on SO but they didn't work for me.

I have 2 markers on the map and I am using LatLngBounds builder in order to let the camera zoom to the right zoom level to include them both. Everything works as expected aside one thing, when the 2 markers are really close to each other, the map is very very zoomed and well, it doesn't make any sense to have this level of zooming.

LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMarker.getPosition()); builder.include(secondMarker.getPosition()); LatLngBounds bounds = builder.build();  CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, markerPadding); 

Is there a way to force a certain level of zoom, after which the camera won't zoom ? This would avoid having the map too zoomed in/out. Basically I am using 15.0f as level of zoom. If the points are too far away I want the zoom to fit them both. If points are getting close I don't want the zoom level to go beyond 15.0f.

like image 304
Alin Avatar asked Dec 13 '13 16:12

Alin


1 Answers

I have a similar case, where I want at least a map diagonal of 2 kilometers. Therefore I just add two additional points to the builder: the first 1 km north-west of the center of the original bounds and the second 1 km south-east of the center. If these are inside the bounds, they do not change anything. If they are outside of the original bounds, they increase the bounds to a meaningful size.

Here is a full code example:

public LatLngBounds createBoundsWithMinDiagonal(MarkerOptions firstMarker, MarkerOptions secondMarker) {     LatLngBounds.Builder builder = new LatLngBounds.Builder();     builder.include(firstMarker.getPosition());     builder.include(secondMarker.getPosition());          LatLngBounds tmpBounds = builder.build();     /** Add 2 points 1000m northEast and southWest of the center.      * They increase the bounds only, if they are not already larger      * than this.       * 1000m on the diagonal translates into about 709m to each direction. */     LatLng center = tmpBounds.getCenter();     LatLng northEast = move(center, 709, 709);     LatLng southWest = move(center, -709, -709);     builder.include(southWest);     builder.include(northEast);     return builder.build();      }  private static final double EARTHRADIUS = 6366198; /**  * Create a new LatLng which lies toNorth meters north and toEast meters  * east of startLL  */ private static LatLng move(LatLng startLL, double toNorth, double toEast) {     double lonDiff = meterToLongitude(toEast, startLL.latitude);     double latDiff = meterToLatitude(toNorth);     return new LatLng(startLL.latitude + latDiff, startLL.longitude             + lonDiff); }  private static double meterToLongitude(double meterToEast, double latitude) {     double latArc = Math.toRadians(latitude);     double radius = Math.cos(latArc) * EARTHRADIUS;     double rad = meterToEast / radius;     return Math.toDegrees(rad); }   private static double meterToLatitude(double meterToNorth) {     double rad = meterToNorth / EARTHRADIUS;     return Math.toDegrees(rad); } 

Edit, as this seems to be still well liked:

Please see https://stackoverflow.com/a/23092644/2808624 below: Nowadays one would use SphericalUtil for moving LatLng coordinates, instead of coding it on your own.

like image 159
user2808624 Avatar answered Sep 29 '22 11:09

user2808624