Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Establecer un nivel máximo de zoom en el constructor LatLngBounds

No he encontrado una respuesta en mi búsqueda, hay algunas respuestas sobre SO pero no funcionaron para mí.

Tengo 2 marcadores en el mapa y estoy usando LatLngBounds constructor con el fin de dejar que la cámara de zoom a la derecha nivel de zoom para incluir ambos. Todo funciona como se esperaba a un lado, cuando los 2 marcadores están muy cerca el uno del otro, el mapa está muy muy ampliado y bien, no tiene sentido tener este nivel de zoom.

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

¿Hay una manera de forzar un cierto nivel de zoom, después de que la cámara no se zoom? Esto evitaría tener el mapa demasiado acercado / alejado. Básicamente estoy usando 15.0f como nivel de zoom. Si los puntos están demasiado lejos quiero que el zoom se ajuste a los dos. Si los puntos se están acercando no quiero que el nivel de zoom vaya más allá de 15.0f.

  • Pinch Zoom ListView Android
  • Zoom y arrastrar imágenes usando matriz en android
  • En evento de zoom para google maps en android
  • Android imageView: configuración de los parámetros de arrastrar y comprimir el zoom
  • Comportamiento extraño de superposición al ampliar el MapView
  • Acción de zoom en android utilizando appium-python-client
  • ¿Cómo pellizcar zoom imagen en zoom de imagen android?
  • ¿Cómo puedo hacer que un SurfaceView sea más grande que la pantalla?
  • 9 Solutions collect form web for “Establecer un nivel máximo de zoom en el constructor LatLngBounds”

    Tengo un caso similar, donde quiero al menos una diagonal de mapa de 2 kilómetros. Por lo tanto, sólo añado dos puntos adicionales al constructor: el primer 1 km al noroeste del centro de los límites originales y el segundo 1 km al sureste del centro. Si estos están dentro de los límites, no cambian nada. Si están fuera de los límites originales, aumentan los límites a un tamaño significativo.

    Aquí hay un ejemplo de código completo:

     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); } 

    Implementé esta solución de acuerdo con la respuesta de user2808624, pero usando el SphericalUtil de la Biblioteca de utilidades de Google Maps para hacer los 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 ); 

    Google ha añadido una api para limitar los niveles de zoom máximo / mínimo.

     GoogleMap.setMaxZoomPreference() GoogleMap.setMinZoomPreference() 

    Esta es una versión mucho más corta basada en la respuesta de 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(); 

    Es un poco descuidado, pero se puede utilizar 0,001 para zoom no menos de un bloque de la ciudad, 0,01 para nada menos que una vista de la ciudad. La única ventaja son sus 4 líneas extra de código.

    ¿Ha considerado crear un fragmento de mapa que está oculto y usarlo para determinar su zoom / límites? Obviamente no es el mejor computacionalmente, pero es probablemente la solución más fácil / más precisa. Por ejemplo, es complejo hacer una solución matemática que funcione cerca de los polos ya través de 0 grados de longitud (si te importa). Si utiliza un mapa, ya está todo incorporado. También podría obviamente utilizar esta solución en su mapa existente, pero el usuario vería un rebote.

    Así es como lo haría:

    1. Ir a los límites como lo has definido anteriormente
    2. Obtener el zoom utilizando map.getCameraPosition (). Zoom.
    3. Si el zoom> 15 se reduce a 15 utilizando CameraUpdateFactory.zoomTo (15)

    No hay manera de limitar los niveles de zoom desde 4.0.30, pero puede seguir este problema .

    La manera más fácil sería forzar el nivel de zoom como en este video: http://www.youtube.com/watch?v=-nCZ37HdheY
    Básicamente están llamando a animateCamera cuando se animateCamera cierto nivel de zoom.

    Eso sería un poco extraño, porque entonces tienes 2 animaciones que no son iniciadas por el usuario.

    La manera dura sería hacer las matemáticas usted mismo. Trate de trabajar con CameraUpdateFactory.newLatLngZoom con LatLng como un centro entre estos puntos y su zoom máximo cuando detecte puntos están cerca unos de otros.

    Llegar tarde, pero tal vez alguien tiene el mismo problema que tuve: He recibido los límites de un lugar, no de un LatLngBounds.Builder:

    Utilicé Location.distanceBetween (…) para averiguar si los límites eran demasiado pequeños, y luego usar un nivel de zoom mínimo con el centro de los límites:

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

    El método de chequeo es:

     private boolean areBoundsTooSmall(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; } 

    Utilicé el nivel de zoom min 17 y el relleno 20 para los límites que son demasiado pequeños, demasiado pequeño se define aquí por la distancia mínima en el metro 300. Puede ajustar los números según sus necesidades.

    El arreglo rápido es:

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

    Tenga en cuenta que podría detener el zoom hasta que el mapa se vuelve a cargar completamente. Pero como solución rápida funciona.

    Es simple:

     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)); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.