Показать ближайший результат геокодера на карте

Я застрял на этой проблеме. Я ищу магазины Tesco в этом геокодере. Есть ли способ получить только самый близкий результат geo.getFromLocationName?

  private void setUpMap() throws IOException {
   Geocoder geo = new Geocoder(getApplicationContext(), Locale.getDefault());
    List<Address> addressList= geo.getFromLocationName("Tesco",1);
    Address add = addressList.get(0);
    String locality = add.getLocality();

    double lat = addressList.get(0).getLatitude();
    double lng = addressList.get(0).getLongitude();


    mMap.addMarker(new MarkerOptions().position(new LatLng(lat,lng)).title("Waitrose"));
}

1 ответ

Решение

Измените ваш метод следующим образом:

private void setUpMap() throws IOException {
    Geocoder geo = new Geocoder(getApplicationContext(), Locale.getDefault());
    List<Address> addressList= geo.getFromLocationName("Tesco",1);
    Address yourAddress = // get your location or the address to compare

    Address closest = findClosest(addressList, yourAddress);
    // do what you need
}

Чтобы создать findClosest Вы должны создать функцию, которая перебирает результаты и использовать формулу haversine, чтобы вычислить расстояние до вашего местоположения (или желаемого).

public double rad(double x) 
{
    return x*Math.PI/180.;
}

public Address findClosest( List<Address> addressList, Address yourAddress ) 
{
    double lat =  yourAddress.getLatitude(); // your (or desired) latitude
    double lng =  yourAddress.getLongitude(); // your (or desired) longitude

    double R = 6371.; // radius of earth in km
    double[] distances = new double[addressList.lenght];
    var closest = -1;
    for( i=0;i<addressList.lenght; i++ ) {
        double mlat = addressList.get(i).getLatitude();
        double mlng = addressList.get(i).getLongitude();
        double dLat  = rad(mlat - lat);
        double dLong = rad(mlng - lng);
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double d = R * c;
        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    return addressList.get(closest);
}
Другие вопросы по тегам