如何根据缩放级别获得等于 Geozone 圆半径的像素数?或区域圆到屏幕像素的半径?

How to get number of pixels equals to a radius of Geozone circle according to zoom level? OR Radius of zone circle to screen pixels?

我正在 google 地图上创建地理区域。地图 API 提供的默认 Circle 在滚动地图时会滞后。所以,我想创建自己的圈子(覆盖在地图上)。我创建了半径为 300 米的固定圆。这个圆的宽度应该像默认的地图圆一样根据缩放级别改变。我写了一个如下的方法,通过将半径和缩放级别作为参数来计算像素。我还添加了默认圈子以验证我的圈子对不同地址的准确性。

//Adjusts the width and height of circle according to radius and zoom level
    private void adjustCircleWidth(final LatLng center, final double zoom) {
        //With inputs from topic "Zoom" from https://developers.google.com/maps/documentation/android-api/views
        double widthOfWorldDP = 256 * Math.pow(2, zoom);

        int radius = 300; //meters.
        int circleWidthMeters = radius * 2;  // *2 to get diameter or width.

        //From google and alsop from this SOF post 
        int EQUATOR_LENGTH_METERS = 40075004; //in meters..

        float dpOfCircle = (float) ((widthOfWorldDP * circleWidthMeters) / EQUATOR_LENGTH_METERS);

        //converts dp to pixels depending on device density..
        int pixels = (int) convertDpToPixels(dpOfCircle);

        mCircleView.requestLayout();
        mCircleView.getLayoutParams().height = pixels;
        mCircleView.getLayoutParams().width = pixels;
    }

好吧,这很好用。我开始验证其他位置然后它开始显示变化。圆形宽度小于地图的默认圆形。我对其进行了分析,以了解当我围绕赤道上的任何位置设置圆圈时,它会完美显示(与默认圆圈同步)。例如,圆圈与肯尼亚的默认位置完美同步,因为肯尼亚位于赤道上。请参阅随附的截图。如果我继续远离赤道,圆圈会从默认圆圈变得越来越小。比如说,对于德国来说,因为定位圈几乎是默认圈的一半...请参阅附件截图。

这是因为我使用的公式与赤道有关。

你能帮忙提供一些线索吗?

非常感谢Android Maps API v2 draw circle post。

我可以在给定纬度、经度和半径(从给定的纬度、经度)(以米为单位)的情况下以像素为单位计算圆的宽度。

private int convertZoneRadiusToPixels(double lat, double lng, double radiusInMeters) {
    double EARTH_RADIUS = 6378100.0;
    double lat1 = radiusInMeters / EARTH_RADIUS;
    double lng1 = radiusInMeters / (EARTH_RADIUS * Math.cos((Math.PI * lat / 180)));

    double lat2 = lat + lat1 * 180 / Math.PI;
    double lng2 = lng + lng1 * 180 / Math.PI;

    Point p1 = mMap.getProjection().toScreenLocation(new LatLng(lat, lng));
    Point p2 = mMap.getProjection().toScreenLocation(new LatLng(lat2, lng2));
    return Math.abs(p1.x - p2.x);
}