当用户靠近标记时收到通知-osmdroid

时间:2018-10-03 22:30:04

标签: android gps location osmdroid

我目前正在尝试构建一个应用,用户在靠近标记时会收到通知,或者在我的情况下,我正在使用Osmdroid的ItemizedOverlay,我想知道是否有办法做到这一点数百个标记,而不会在几分钟内耗尽电池。 我看到了一些方法,但是当您只有几个标记时,所有方法都适用。 如果有人可以帮助我,我将非常高兴。

2 个答案:

答案 0 :(得分:1)

为补充@Barns的回答,有2条评论:

  • 使用osmdroid时,您没有LatLng,而您有GeoPoint,
  • ,您无需编写自己的getDistanceMeters,因为GeoPoint已经拥有 此方法:

    GeoPoint.distanceToAsDouble(其他最终IGeoPoint)

答案 1 :(得分:0)

如果标记具有静态位置,则无需重复加载它们。

如果您只想计算地球上两点之间的距离,并且具有经度和纬度坐标,则不需要任何Google API的地图或其他库。这只是额外的开销和维护成本。只需像这样创建一个静态方法:

public static double getDistanceMeters(LatLng pt1, LatLng pt2){
    double distance = 0d;
    try{
        double theta = pt1.longitude - pt2.longitude;
        double dist = Math.sin(Math.toRadians(pt1.latitude)) * Math.sin(Math.toRadians(pt2.latitude))
                + Math.cos(Math.toRadians(pt1.latitude)) * Math.cos(Math.toRadians(pt2.latitude)) * Math.cos(Math.toRadians(theta));

        dist = Math.acos(dist);
        dist = Math.toDegrees(dist);
        distance = dist * 60 * 1853.1596;
    }
    catch (Exception ex){
        System.out.println(ex.getMessage());
    }
    return distance;
} 

然后您可以执行以下操作:

public static boolean checkDistanceIsClose(LatLng pt1, LatLng pt2, double distance){
    boolean isInDistance = false;
    try{
        double calcDistance = getDistanceMeters(pt1, pt2)

        if(distance <= calcDistance){
            isInDistance = true;
        }
    }
    catch (Exception ex){
        System.out.println(ex.getMessage());
    }
    return isInDistance;
} 

相同的算法适用于任何平台。只需将其翻译为适当的程序语言即可。