0

基本上标题说明了一切。我不想像现在那样在地图上绘制数据库中的每个条目,而是想查询数据库并只绘制坐标落在用户当前位置周围绘制的圆圈内的条目,但是我不能很想知道怎么做。目前,我已经编写了代码,在地图上绘制用户当前位置以及存储在我的数据库中的所有条目的位置以及当前位置周围的圆圈(见下图)。根据我下面的图片,我只希望绘制圆圈内的三个标记。

当前代码

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

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

4

2 回答 2

1

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

所以,用这种方法来获取中心和一些 LatLng 之间的距离并设置一个条件

距离 <= 半径

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);
}
于 2013-03-11T13:29:35.760 回答
0

Ok, I've figured out a solution using the LatLngBounds class I referred to in my question. What it does is:

  1. Creates a new rectangular perimeter around the user's current latitude and longitude co-ordinates (this example is roughly one square kilometer).
  2. It then checks if the perimeter contains the co-ordinates stored in the database.
  3. If it does, the marker is plotted on the map.

    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();
        }
    }
    
于 2013-03-11T22:08:51.070 回答