我遇到了Google Maps APIv2的一个非常棘手的问题:我想在标记周围绘制一个圆圈(到目前为止没有任何漫反射),但是圆圈的半径必须根据缩放级别缩放,因此标记的大小和圆圈始终保持相同的比例。
我尝试完成包含当前缩放级别,最大和最小缩放级别以及标记图标大小的计算,但结果(至少从我的计算)得出地图增加/减少缩放级别的方式根据用户交互不是线性的(我认为它是以某种方式指数)。
任何人都知道如何做到这一点?
**UPDATE**
部分解决方案可作为答案,欢迎您提出改进建议
答案 0 :(得分:0)
由于我的声誉,我无法发表评论,但您应该尝试使用zoomChangeListener,我会在其他问题中发现这一点。
创建
OnCameraChangeListener
的实现,并传递一个 它的实例到您的GoogleMap的setOnCameraChangeListener()
。您的 只要用户,就应该使用onCameraChange()
调用监听器 更改缩放,居中或倾斜。你找到了新的缩放级别 来自您传递的CameraPosition对象。
每当它发生时你需要:
你只需要为不同的缩放进行数学运算。
public OnCameraChangeListener getCameraChangeListener()
{
new OnCameraChangeListener()
{
@Override
public void onCameraChange(CameraPosition position)
{
googleMap.clear();
setMarkers();
float actualZoom = position.zoom;
drawCircle(actualZoom);
}
};
}
答案 1 :(得分:0)
我已经制作了部分解决方案:
不幸的是,它仅适用于缩放级别> 5.5。这是由距离计算引起的,由于地球的球形,它根据摄像机的位置给出不同的结果。
以下是代码,如果有人知道如何改进它:
public double getRadius(){
mapWidth = (double) mapFragment.getView().getWidth();
LatLngBounds bb = map.getProjection().getVisibleRegion().latLngBounds;
double distance = distance((bb.northeast.latitude - bb.southwest.latitude)/2, bb.northeast.longitude, (bb.northeast.latitude - bb.southwest.latitude)/2, bb.southwest.longitude);
double metersPerPixel = distance / mapWidth;
return 70*metersPerPixel;
}
private static double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
dist = (dist * 1.609344)*1000;
return (dist);
}
private static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private static double rad2deg(double rad) {
return (rad * 180 / Math.PI);
}
计算距离here
的代码