本文介绍了Google地图获取缩放级别的可见区域半径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在构建一个应用程序,在其中我从onCameraIdle
中的API加载数据。请求需要目标位置和向我提供结果的半径。
我用来从当前摄像头获取半径的代码是:
/**
* @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;
}
我是从here
获得的在某些情况下,我需要获取仅知道缩放级别的半径,以便在缩放动画完成时已将信息加载到地图上。
我尝试调整here中的代码以获得知道缩放级别的半径,而不是相反。
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的情况下,我使用相机的VisibleRegion得到半径尺寸为2.697331 km。如果我用这个公式计算半径,结果是0.008公里。
推荐答案
看起来最佳实践是查找适合内部地图矩形的最小半径值。
您马上就到了,请使用下面修改后的函数,该函数使用Pythagorean theorem查找包含地图"矩形"所需的最小半径。
@Override
public void onMapReady(GoogleMap googleMap) {
this.googleMap = googleMap;
googleMap.setOnMarkerClickListener(this);
googleMap.setOnCameraIdleListener(() -> {
CameraPosition cameraPosition = googleMap.getCameraPosition();
double radiusInMeters = getMapVisibleRadius();
double radiusInKilometers = radiusInMeters / 1000;
double latitude = cameraPosition.target.latitude;
double longitude = cameraPosition.target.longitude;
// TODO you take it from here,
// I use firebase to get relevant markers based on the lat,long,radius
});
}
private double getMapVisibleRadius() {
VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();
float[] distanceWidth = new float[1];
float[] distanceHeight = new float[1];
LatLng farRight = visibleRegion.farRight;
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
LatLng nearLeft = visibleRegion.nearLeft;
Location.distanceBetween(
(farLeft.latitude + nearLeft.latitude) / 2,
farLeft.longitude,
(farRight.latitude + nearRight.latitude) / 2,
farRight.longitude,
distanceWidth
);
Location.distanceBetween(
farRight.latitude,
(farRight.longitude + farLeft.longitude) / 2,
nearRight.latitude,
(nearRight.longitude + nearLeft.longitude) / 2,
distanceHeight
);
double radiusInMeters = Math.sqrt(Math.pow(distanceWidth[0], 2) + Math.pow(distanceHeight[0], 2)) / 2;
return radiusInMeters;
}
这篇关于Google地图获取缩放级别的可见区域半径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!