Сравнение двух местоположений по их долготе и широте

Привет, мне нужно вызвать событие в onchangelocation(), сравнив текущую широту и долготу с некоторой сохраненной широтой и долготой, но я получаю сообщение об ошибке. eclipse не распознает расстояние ключевого слова, и для исправления ошибки он дает подсказку к методу ящика «расстояние», имеющему 4 параметра... как это исправить??? или какой-то другой способ сделать ту же работу???

спасибо и привет. код прикреплен ниже

@Override
public void onLocationChanged(Location location) {
 double currentLat=location.getLatitude();
 double currentLon=location.getLongitude();

    if (distance(lat,lon,currentLat,currentLon)<2.0){
 //do what you want to do...
  }
}

person user2590541    schedule 11.08.2013    source источник
comment
Вам нужно написать функцию Distance, в Android ее нет. Вы также можете проверить это: developer.android.com/training/location/geofencing. html   -  person Ran    schedule 11.08.2013
comment
сэр, я просто хочу сравнить два значения широты и долготы. если совпало, то хотите вызвать одно событие, другое другое событие. есть ли другой простой способ сделать это... это мой полный код stackoverflow.com/questions/18150929/   -  person user2590541    schedule 11.08.2013
comment
так что это проблема метода расстояния. Вы опубликуете подпись дистанционного метода.   -  person Sandeep    schedule 11.08.2013
comment
Проблема в том, что у него нет дистанционного метода.   -  person Philipp Jahoda    schedule 11.08.2013


Ответы (3)


На самом деле вам нужно реализовать функцию, называемую расстоянием, которая будет вычислять расстояние между двумя местоположениями. Расчет расстояния между двумя точками — один из возможных способов сравнения значений долготы и широты.

Пример их сравнения:

@Override
public void onLocationChanged(Location location) {

 double lat2 = location.getLatitude();
 double lng2 = location.getLongitude();

    // lat1 and lng1 are the values of a previously stored location
    if (distance(lat1, lng1, lat2, lng2) < 0.1) { // if distance < 0.1 miles we take locations as equal
       //do what you want to do...
    }
}

/** calculates the distance between two locations in MILES */
private double distance(double lat1, double lng1, double lat2, double lng2) {

    double earthRadius = 3958.75; // in miles, change to 6371 for kilometer output

    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);

    double sindLat = Math.sin(dLat / 2);
    double sindLng = Math.sin(dLng / 2);

    double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
        * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

    double dist = earthRadius * c;

    return dist; // output distance, in MILES
}

И в Котлине:

private fun distance(lat1: Double, lng1: Double, lat2: Double, lng2: Double): Double {
    val earthRadius = 3958.75 // in miles, change to 6371 for kilometer output

    val dLat = Math.toRadians(lat2 - lat1)
    val dLng = Math.toRadians(lng2 - lng1)

    val sindLat = sin(dLat / 2)
    val sindLng = sin(dLng / 2)

    val a = sindLat.pow(2.0) +
            (sindLng.pow(2.0) * cos(Math.toRadians(lat1)) * cos(Math.toRadians(lat2)))

    val c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return earthRadius * c // output distance, in MILES
}
person Philipp Jahoda    schedule 11.08.2013
comment
сэр, я просто хочу сравнить два значения широты и долготы. если совпало, то хотите вызвать одно событие, другое другое событие. есть ли другой простой способ сделать это... это мой полный код stackoverflow.com/questions/18150929/ - person user2590541; 11.08.2013
comment
Тогда вам следует выразить себя именно так, а не использовать несуществующую функцию под названием Distance. - person Philipp Jahoda; 11.08.2013
comment
я пытался, но получил ошибки... можете ли вы сделать пример кодирования для этой цели - person user2590541; 11.08.2013
comment
У вас есть полный пример в моем коде. Этот метод вычисляет расстояние между двумя точками и, конечно же, может использоваться для сравнения. Например, если расстояние между двумя точками меньше 0,01 мили, вы можете считать их равными. - person Philipp Jahoda; 11.08.2013
comment
я пробовал, но это не дает желаемых результатов, пожалуйста, проверьте, что я делаю неправильно... - person user2590541; 11.08.2013
comment
Может проблема в if (distance(lat,lon,currentLat,currentLon)<2.0) Что такое 2.0? - person iCantSeeSharp; 11.08.2013
comment
я попробовал это, но это не дает желаемых результатов, пожалуйста, проверьте, что я делаю неправильно... у меня есть подкласс, в котором я работаю над onlocationchanges(), а затем я вызываю его в основном действии. когда я вызываю его в основном, он показывает ошибку для параметров, которые я пытаюсь исправить, используя 2 возможности: 1. Дать параметру null 2. Дать параметру значение Location. Но в обоих случаях это просто завершает мое приложение. Любая идея, сэр ??? - person user2590541; 11.08.2013

Вы можете использовать статический метод distanceBetween() следующим образом:

import android.location.Location

float[] distance = new float[1];

Location.distanceBetween(lat, lon, currentLat, currentLon, distance);

// distance[0] is now the distance between these lat/lons in meters
if (distance[0] < 2.0) {
    // your code...
}

Если у вас есть два объекта Location, другим вариантом является distanceTo()

person yuval    schedule 24.02.2015

Все 4 входных параметра находятся в формате с плавающей запятой. Расстояние относительное, а не реальное. Вам нужно преобразовать это расстояние в реальное расстояние, выполнив поиск по какой-либо формуле в Интернете :( Я использовал это в своем приложении, чтобы получить ближайшую станцию ​​​​метро от моего текущего местоположения. Надеюсь, этот фрагмент кому-то поможет :)

float distance(float lat,float lon,float clat,float clon)
{
    float distance;
    float temp1;
    float temp2;
    temp1=(float)((lat-clat)*(lat-clat));
    temp2=(float)((lon-clon)*(lon-clon));
    distance=temp1+temp2;
    return distance;
}
person Venkatesh Suvarna    schedule 17.08.2014