仅在绘制的圆形或周边内绘制标记Google Maps v2 Android

时间:2013-03-11 13:19:38

标签: android google-maps google-maps-markers geometry area

基本上标题说明了一切。我不是像我现在那样在地图上绘制数据库中的每一个条目,而是想查询数据库,只绘制坐标围绕用户当前位置绘制的圆圈的条目,但是我不能很清楚如何做到这一点。目前,我编写了代码,用于绘制用户在地图上的当前位置以及存储在我的数据库中的所有条目的位置以及当前位置周围的圆圈(参见下图)。根据下面的图片,我只想绘制圆圈内的三个标记。

Current Code

有没有人知道是否有任何方法可以检查存储在我的数据库中的latlng坐标是否属于圆圈区域?或者如果没有,任何人都可以提出任何使用类似想法的替代方案。

另一个我想到的是使用方形/矩形而不是圆形,这样我就可以简单地将条目的坐标与方形/矩形的边界进行比较,但我真的不知道这是多么可行被视为Google Maps API不支持这些形状。我也遇到了LatLngBounds类,这可能很有用,但我找不到任何使用它的示例代码。我怎么可能这样做?

2 个答案:

答案 0 :(得分:1)

我相信圆圈有一个固定的半径和一个中心点。

因此,请使用此方法获取中心与某些LatLng之间的距离并设置条件

距离< = radius

public static String getDistance(LatLng ll_source, LatLng ll_destination,
        int unit) {


    int Radius = 6371;// radius of earth in Km

    double lat1 = ll_source.latitude;
    double lat2 = ll_destination.latitude;
    double lon1 = ll_source.longitude;
    double lon2 = ll_destination.longitude;
    double dLat = Math.toRadians(lat2 - lat1);
    double dLon = Math.toRadians(lon2 - lon1);
    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(Math.toRadians(lat1))
            * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2)
            * Math.sin(dLon / 2);
    double c = 2 * Math.asin(Math.sqrt(a));
    double valueResult = Radius * c;
    double km = valueResult / 1;
    DecimalFormat newFormat = new DecimalFormat("####");
    Integer kmInDec = Integer.valueOf(newFormat.format(km));
    double meter = valueResult % 1000;
    Integer meterInDec = Integer.valueOf(newFormat.format(meter));
    DecimalFormat df = new DecimalFormat("#.#");
    return df.format(valueResult);
}

答案 1 :(得分:0)

好的,我已经找到了一个使用我在问题中提到的LatLngBounds类的解决方案。它的作用是:

  1. 围绕用户当前的纬度和经度坐标创建一个新的矩形边界(此示例大约为一平方公里)。
  2. 然后检查周界是否包含存储在数据库中的坐标。
  3. 如果是,则在地图上绘制标记。

    public void getNearbyMarkers(){
        LatLngBounds perimeter = new LatLngBounds(new LatLng(currentLat - 0.004,
                currentLon - 0.004), new LatLng(currentLat + 0.004, currentLon + 0.004));
    
    
        if (perimeter.contains(LatlongFromDatabase)) {
            //Plot Marker on Map
        } else {
            Toast.makeText(getApplicationContext(), "Co-ordinates not in perimeter!", 8).show();
        }
    }