Я создаю приложение, в которое я загружаю данные из API в onCameraIdle
. Запросу нужны целевое местоположение и радиус, в котором я могу получить результаты.
Код, который я использую для получения радиуса от текущей камеры:
/**
* @param map The Map on which to compute the radius.
* @return The circle radius of the area visible on map, in meters.
*/
public float getRadiusVisibleOnMap(GoogleMap map) {
VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
LatLng farRight = visibleRegion.farRight;
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
LatLng nearLeft = visibleRegion.nearLeft;
float[] distanceWidth = new float[1];
Location.distanceBetween(
(farRight.latitude + nearRight.latitude) / 2,
(farRight.longitude + nearRight.longitude) / 2,
(farLeft.latitude + nearLeft.latitude) / 2,
(farLeft.longitude + nearLeft.longitude) / 2,
distanceWidth
);
float[] distanceHeight = new float[1];
Location.distanceBetween(
(farRight.latitude + nearRight.latitude) / 2,
(farRight.longitude + nearRight.longitude) / 2,
(farLeft.latitude + nearLeft.latitude) / 2,
(farLeft.longitude + nearLeft.longitude) / 2,
distanceHeight
);
float radius;
if (distanceWidth[0] > distanceHeight[0]) {
radius = distanceWidth[0];
} else {
radius = distanceHeight[0];
}
return radius;
}
Я получил его из здесь
В некоторых случаях мне нужно получить радиус, зная только уровень масштабирования, чтобы информация уже загружалась на карту после завершения анимации масштабирования.
Я попытался настроить код из здесь, чтобы получить радиус, зная уровень масштабирования, а не наоборот.
public int getZoomLevel(Circle circle) {
if (circle != null) {
double radius = circle.getRadius();
double scale = radius / 500;
zoomLevel = (int) (16 - Math.log(scale) / Math.log(2));
}
return zoomLevel;
}
Я получил формулу:
Формула неверна. Он не выводит правильные размеры. Для уровня масштабирования 14 я получаю размер радиуса 2,697331 км, используя VisibleRegion камеры. Если я вычислю радиус по формуле, результат будет 0,008 км.