【问题标题】: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?如何根据缩放级别获得等于 Geozone 圆半径的像素数?或区域圆的半径到屏幕像素?
【发布时间】:2016-05-19 15:33:13
【问题描述】:

我正在谷歌地图上创建地理区域。滚动地图时,地图 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;
    }

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

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

您能否提供有关如何使其统一的任何线索?

【问题讨论】:

  • 到底是谁给了-1。这与选票无关,但我想知道这个问题有什么问题??????好吧,我在这篇漂亮的 SOF 帖子stackoverflow.com/questions/13991301/… 的帮助下实现了它。 SOF 应该让提问者知道谁投了反对票并知道哪里出了问题,以便他自己纠正。

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


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2016-08-17
    • 2017-10-09
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多