После многих попыток я принял решение. Я предполагаю, что у вас есть отступ за пределами радиуса (например, если у вас радиус = 10000 м, то это будет 2500 м влево и вправо). Также вы должны иметь точность в метрах. Вы можете установить подходящий зум с рекурсией (бинарный поиск). Если вы измените moveCamera
на animateCamera
, вы получите интересную анимацию поиска. Чем больше радиус, тем более точное значение увеличения вы получите.
private fun getCircleZoomValue(latitude: Double, longitude: Double, radius: Double,
minZoom: Float, maxZoom: Float): Float {
val position = LatLng(latitude, longitude)
val currZoom = (minZoom + maxZoom) / 2
val camera = CameraUpdateFactory.newLatLngZoom(position, currZoom)
googleMap!!.moveCamera(camera)
val results = FloatArray(1)
val topLeft = googleMap!!.projection.visibleRegion.farLeft
val topRight = googleMap!!.projection.visibleRegion.farRight
Location.distanceBetween(topLeft.latitude, topLeft.longitude, topRight.latitude,
topRight.longitude, results)
// Difference between visible width in meters and 2.5 * radius.
val delta = results[0] - 2.5 * radius
val accuracy = 10 // 10 meters.
return when {
delta < -accuracy -> getCircleZoomValue(latitude, longitude, radius, minZoom,
currZoom)
delta > accuracy -> getCircleZoomValue(latitude, longitude, radius, currZoom,
maxZoom)
else -> currZoom
}
}
Использование:
if (googleMap != null) {
zoomCircle(latitude, longitude, radius, googleMap!!.minZoomLevel,
googleMap!!.maxZoomLevel)
}
Вы должны вызывать этот метод не ранее, чем внутри первого события googleMap?.setOnCameraIdleListener
, см. animateCamera работает, а moveCamera не работает для GoogleMap - Android . Если вы назовете его сразу после onMapReady
, у вас будет неправильное расстояние, потому что карта не будет рисоваться сама в это время.
Внимание! Уровень масштабирования зависит от местоположения (широта). Таким образом, круг будет иметь разные размеры с одинаковым уровнем масштабирования в зависимости от расстояния от экватора (см. Определение разумного уровня масштабирования для Карт Google с учетом точности определения местоположения ).