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

时间:2016-02-09 15:17:32

标签: android google-maps google-maps-api-3 geometry android-geofence

我正在谷歌地图上创建Geozones。滚动地图时,地图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 http://stackoverflow.com/a/6452332/3209739
        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;
    }

嗯,这很好用。我开始验证其他位置然后开始显示变化。圆宽小于地图的默认圆。我分析了它,以便在我在赤道上的任何位置周围设置圆圈时,它完美地显示(与默认圆同步)。例如,对于肯尼亚的肯定是肯定在赤道的位置,例如,圆与完全同步。看到附加的scrrenshot。如果我继续远离赤道,圆圈会从默认圆圈越来越小。比如,对于德国来说,位置圈几乎是默认值的一半......请参阅随附的scrrenshot。

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

你能帮忙解决一下如何让它变得均匀吗?

1 个答案:

答案 0 :(得分:1)

Android Maps API v2 draw circle帖子的致谢和感谢。

我可以用给定的纬度,经度和半径(从给定的纬度,长度)以米为单位计算圆的宽度。

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);
}