用于创建用户定义的地理围栏的算法

时间:2014-02-26 05:25:09

标签: java android android-geofence

我有一个纬度&经度一点。我想要所有的纬度和读数读数相对于给定点的半径为500M的经度。有什么方法吗?可能吗?是他们的任何算法吗?

2 个答案:

答案 0 :(得分:1)

有许多公式可用于计算两个纬度/长点之间的距离(由于高度变化,它不会精确,但非常接近),并根据距离过滤您的采样点从你的角度来看。

可以在这里找到有关可用内容(包括数学和源代码)的精彩概述:http://www.movable-type.co.uk/scripts/latlong.html

浏览并选择最符合您需求的距离公式。

答案 1 :(得分:0)

以下是StackOverflow的解决方案,用于查找Usman Kurd的2个位置之间的距离

https://stackoverflow.com/a/14394403/2128327

通过一些调整,我们可以使用他的功能:

  public double getKmDistance(GeoPoint StartP, GeoPoint EndP) {
    int Radius=6371;//radius of earth in Km         
    double lat1 = StartP.getLatitudeE6()/1E6;
    double lat2 = EndP.getLatitudeE6()/1E6;
    double lon1 = StartP.getLongitudeE6()/1E6;
    double lon2 = EndP.getLongitudeE6()/1E6;
    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("####");
    kmInDec =  Integer.valueOf(newFormat.format(km));
    meter=valueResult%1000;
    meterInDec= Integer.valueOf(newFormat.format(meter));
    Log.i("Radius Value",""+valueResult+"   KM  "+kmInDec+" Meter   "+meterInDec);

    return kmInDec;
 }

然后让我们说你有一个地点列表:

ArrayList<GeoPoint> geoPoints = new ArrayList<GeoPoint>();

我们目前的位置:

GeoPoint currentLocation = new GeoPoint(..);

然后你可以这样做:

ArrayList<GeoPoint> within500Km = new ArrayList<GeoPoint>();

for (GeoPoint g : geoPoints)
    if (getKmDistance(currentLocation, g) <= 500.0)
        within500Km.add(g);

for(GeoPoint g : within500Km)
    System.out.println("> "+g.getLatitudeE6()+" : "+g.getLongitudeE6()+" ");