Android:地图v2:在标记

时间:2015-10-28 14:32:00

标签: android google-maps geometry google-maps-api-2 marker

我遇到了Google Maps APIv2的一个非常棘手的问题:我想在标记周围绘制一个圆圈(到目前为止没有任何漫反射),但是圆圈的半径必须根据缩放级别缩放,因此标记的大小和圆圈始终保持相同的比例。

我尝试完成包含当前缩放级别,最大和最小缩放级别以及标记图标大小的计算,但结果(至少从我的计算)得出地图增加/减少缩放级别的方式根据用户交互不是线性的(我认为它是以某种方式指数)。

任何人都知道如何做到这一点?

                                     **UPDATE**

部分解决方案可作为答案,欢迎您提出改进建议

2 个答案:

答案 0 :(得分:0)

由于我的声誉,我无法发表评论,但您应该尝试使用zoomChangeListener,我会在其他问题中发现这一点。

  

创建OnCameraChangeListener的实现,并传递一个   它的实例到您的GoogleMap的setOnCameraChangeListener()。您的   只要用户,就应该使用onCameraChange()调用监听器   更改缩放,居中或倾斜。你找到了新的缩放级别   来自您传递的CameraPosition对象。

每当它发生时你需要:

  1. ClearTheMap
  2. 再次设置标记
  3. 阅读zoomLevel
  4. 根据缩放级别绘制圆圈
  5. 你只需要为不同的缩放进行数学运算。

    public OnCameraChangeListener getCameraChangeListener()
    {
        new OnCameraChangeListener() 
        {
            @Override
            public void onCameraChange(CameraPosition position) 
            {
                googleMap.clear();
                setMarkers();
                float actualZoom = position.zoom;
                drawCircle(actualZoom);
        }
    };
    }
    

答案 1 :(得分:0)

我已经制作了部分解决方案:

  • 我将BoundingBox当前显示在地图上
  • 获取其中一个边角之间的距离
  • 以像素为单位获取地图尺寸
  • 计算每像素的米数
  • 将此值乘以标记图标的大小

不幸的是,它仅适用于缩放级别> 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

的代码