Алгоритм создания пользовательских геозон

я получил широту и долготу точки. мне нужны все показания широты и долготы в радиусе 500 м относительно этой точки. есть ли способ для этого? Является ли это возможным? есть ли у них какой-либо алгоритм для этого?


person NaVaNeeTh PrOdHutuR    schedule 26.02.2014    source источник
comment
Краткий ответ: в настоящее время такого метода нет.   -  person Lucifer    schedule 26.02.2014
comment
Почему бы вам не использовать API-интерфейс Geofence для Android?   -  person Mohd Mufiz    schedule 26.02.2014
comment
полное решение находится по адресу developer.android.com/training/location/geofencing.html   -  person Jitesh Upadhyay    schedule 26.02.2014
comment
На окружности радиусом 500 м бесконечно много точек - что вы на самом деле хотите спросить? Вы хотите свериться со списком, чтобы увидеть, какие значения находятся в пределах определенного расстояния от заданной точки?   -  person Floris    schedule 27.02.2014


Ответы (2)


Существует множество формул для расчета расстояния между двумя точками широты/долготы (оно не будет точным из-за изменения высоты, но очень близко) и фильтрации точек выборки на основе расстояния от заданной точки. точка.

Хороший обзор того, что доступно (с математикой и исходным кодом), доступен здесь: http://www.movable-type.co.uk/scripts/latlong.html

Просмотрите там и выберите формулу расстояния, которая лучше всего соответствует вашим потребностям.

person Jason C    schedule 26.02.2014
comment
Вы связали мой любимый сайт с этой проблемой; и пункт об ошибке из-за высоты хороший... - person Floris; 27.02.2014

Вот решение на StackOverflow для определения расстояния между двумя точками от Усмана Курда.

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()+" ");
person Khaled.K    schedule 26.02.2014
comment
@NaVaNeeThPrOdHutuR мой код использует 500 км, вы можете изменить его - person Khaled.K; 26.02.2014
comment
Дополнительная информация из ответа, который на самом деле был комментарием: я публикую ссылку здесь, потому что ссылка не работает в комментариях. developer.android.com/training/location/geofencing.html - person Michael Durrant; 27.02.2014