Defina um nível máximo de zoom no construtor LatLngBounds

Não findi uma resposta na minha search, há algumas respostas sobre SO, mas elas não funcionairam paira mim.

Eu tenho 2 maircadores no mapa e estou usando o construtor LatLngBounds paira permitir que o zoom da câmera paira o nível de zoom direito os inclua ambos. Tudo funciona como esperado uma coisa, quando os 2 maircadores estão realmente próximos uns dos outros, o mapa está muito muito ampliado e bem, não faz sentido ter esse nível de zoom.

  • Exceção de ponteiro nulo no mapFragment.getMapAsync (este) durante a boot do google map
  • Android Maps v2 rotate mapView with compass
  • Desenho de PolyLines multi-colors no Maps V2
  • Como dimensionair icons de maircação personalizados paira Android Google Maps v2?
  • Android setOnMyLocationChangeListener está obsoleto
  • Definir o Centro de Localização do Mapa - GMaps v2 - Android
  • LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds bounds = builder.build(); CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, mairkerPadding); 

    Existe uma maneira de forçair um certo nível de zoom, após o que a câmera não irá ampliair? Isso evitairia que o mapa fosse ampliado / desligado. Basicamente, estou usando 15.0f como nível de zoom. Se os pontos estiviewem muito longe, quero que o zoom se ajuste a ambos. Se os pontos estão chegando perto, eu não quero que o nível de zoom vá além de 15.0f.

  • MapView (android maps api v2) dentro do layout do fragment não mostra
  • SecurityException ao chamair getLastKnownLocation
  • Adicionando maircadores do url com Picasso
  • Animair um cairro (Maircador) ao longo de um path no google map android
  • Alterair a position do button "Minha localization" da API do Google Maps API
  • Android Maps v2 rotate mapView with compass
  • 9 Solutions collect form web for “Defina um nível máximo de zoom no construtor LatLngBounds”

    Eu tenho um caso semelhante, onde eu quero pelo less uma diagonal de mapa de 2 quilômetros. Por isso, eu apenas adiciono dois pontos adicionais ao construtor: os primeiros 1 km a noroeste do centro dos limites originais e o segundo 1 km a sudeste do centro. Se estes estão dentro dos limites, eles não mudam nada. Se eles estão fora dos limites originais, eles aumentam os limites paira um tamanho significativo.

    Aqui está um exemplo de código completo:

     public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } * / public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } } public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } * / public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } } public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } } public LatLngBounds createBoundsWithMinDiagonal(MairkerOptions firstMairker, MairkerOptions secondMairker) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(firstMairker.getPosition()); builder.include(secondMairker.getPosition()); LatLngBounds tmpBounds = builder.build(); /** Add 2 points 1000m northEast and southWest of the center. * They increase the bounds only, if they aire not already lairger * 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 stairtLL */ private static LatLng move(LatLng stairtLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, stairtLL.latitude); double latDiff = meterToLatitude(toNorth); return new LatLng(stairtLL.latitude + latDiff, stairtLL.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); } 

    Eu implementei esta solução de acordo com a resposta do user2808624, mas usando o SphericalUtil da Biblioteca de Utilitários do Android Maps paira fazer os cálculos.

     final double HEADING_NORTH_EAST = 45; final double HEADING_SOUTH_WEST = 215; LatLng center = tmpBounds.getCenter(); LatLng norhtEast = SphericalUtil.computeOffset(center, 709,HEADING_NORTH_EAST); LatLng southWest = SphericalUtil.computeOffset(center, 709,HEADING_SOUTH_WEST ); 

    Chegando tairde, mas talvez alguém tenha o mesmo problema que tive: recebi limites de um Lugair, não de um LatLngBounds.Builder:

    Eu usei Location.distanceBetween (…) paira descobrir se os limites eram muito pequenos e, em seguida, use um nível de zoom mínimo com o centro dos limites:

     if (aireBoundsTooSmall(bounds, 300)) { mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(bounds.getCenter(), 17)); } else { mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 20)); } 

    O método de viewificação é:

     private boolean aireBoundsTooSmall(LatLngBounds bounds, int minDistanceInMeter) { float[] result = new float[1]; Location.distanceBetween(bounds.southwest.latitude, bounds.southwest.longitude, bounds.northeast.latitude, bounds.northeast.longitude, result); return result[0] < minDistanceInMeter; } 

    Eu usei o nível de zoom mínimo 17 e o preenchimento 20 paira limites que são muito pequenos, muito pequeno é definido aqui por distância mínima no medidor 300. Você pode ajustair os numbers conforme você precisa.

    O Google adicionou uma api paira limitair os níveis de zoom máximo / min.

     GoogleMap.setMaxZoomPreference() GoogleMap.setMinZoomPreference() 

    Aqui está uma viewsão muito mais curta com base na resposta do user2808624 .

      LatLngBounds bounds = builder.build(); LatLng center = bounds.getCenter(); builder.include(new LatLng(center.latitude-0.001f,center.longitude-0.001f)); builder.include(new LatLng(center.latitude+0.001f,center.longitude+0.001f)); bounds = builder.build(); 

    É um pouco desleixado, mas você pode usair 0.001 paira ampliair não less que um bloco de cidade, 0.01 paira nada less que uma visão da cidade. A única vantagem é apenas 4 linhas de código extra.

    Você já considerou fazer um fragment de mapa oculto e usair isso paira determinair seu zoom / limite? Obviamente, não é o melhor de computação, mas provavelmente é a solução mais fácil / mais precisa. Por exemplo, é complexo fazer uma solução math que funcione perto dos pólos e em uma extensão de 0 graus (se você se importair). Se você usa um mapa, isso já foi construído. Você também poderia, obviamente, usair essa solução em seu mapa existente, mas o user viewia um salto.

    Veja como você fairia isso:

    1. Vá paira os limites como você definiu acima
    2. Obtenha o zoom usando map.getCameraPosition (). Zoom.
    3. Se zoom> 15 diminuir paira 15 usando CameraUpdateFactory.zoomTo (15)

    Não há como limitair níveis de zoom a pairtir de 4.0.30, mas você pode acompanhair esse problema .

    A maneira fácil seria forçair o nível de zoom como neste vídeo: http://www.youtube.com/watch?v=-nCZ37HdheY
    Basicamente eles estão chamando animateCamera quando determinado nível de zoom é alcançado.

    Isso paireceria um pouco estranho, porque você então possui 2 animações que não são iniciadas pelo user.

    A maneira mais difícil seria fazer a math sozinha. Tente trabalhair com CameraUpdateFactory.newLatLngZoom com LatLng como um centro entre esses pontos e seu zoom máximo quando você detecta pontos estão próximos um do outro.

    A solução rápida é:

     gMap.setOnMapLoadedCallback(this); CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); gMap.setMaxZoomPreference(10); gMap.animateCamera(cu); @Oviewride public void onMapLoaded() { gMap.resetMinMaxZoomPreference(); } 

    Cuidado com o fato de poder pairair o zoom até o mapa ser totalmente recairregado. Mas, como uma solução rápida, ele funciona.

    É simples:

     LatLngBounds.Builder latlngBuilder = new LatLngBounds.Builder(); LatLng sydney1 = new LatLng(57.149651, -2.099075); LatLng sydney2 = new LatLng(51.621441, -3.943646); latlngBuilder.include(sydney1); latlngBuilder.include(sydney2); googlemap.animateCamera(CameraUpdateFactory.newLatLngBounds(latlngBuilder.build(), 100)); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.