Как отсортировать результаты по расстоянию с помощью API Google Places с помощью запросов поиска поблизости

Я хочу, чтобы все аэропорты поблизости от моего местоположения были упорядочены по расстоянию. Я использую запросы поиска поблизости с api мест Google, используя этот URL: https://maps.googleapis.com/maps/api/place/nearbysearch/xml?location=51.9143924,-0.1640153&sensor=true&key=api_key&radius=50000&types=airport Результаты, которые я получаю, скудны и не упорядочены. Я попробовал rankby = distance, но результата не было. и согласно https://developers.google.com/places/documentation/search#PlaceSearchRequests документация "радиус не должен быть включен, если rankby = distance".


person user991554    schedule 03.04.2013    source источник


Ответы (3)


Да, вы не можете использовать radius и rankBy в одном запросе. Но вы можете использовать rankBy=distance, а затем самостоятельно рассчитывать расстояние на основе geometry.location.lat и geometry.location.lng. Например, в Groovy я сделал вот так:

GeoPosition и Placeclasses реализованы мной, поэтому не ожидайте найти их в основных библиотеках :)

TreeMap<Double, Place> nearbyPlaces = new TreeMap<Double, Place>()

 if(isStatusOk(nearbySearchResponse))
                    nearbySearchResponse.results.each {

                def location = it.geometry.location
                String placeid = it.place_id
                GeoPosition position = new GeoPosition(latitude: location.lat,
                        longitude: location.lng)

                Place place =  new Place(position)

                double distance = distanceTo(place)
//If the place is actually in your radius (because Places API oftenly returns places far beyond your radius) then you add it to the TreeMap with distance to it as a key, and it will automatically sort it for you.

                if((distance <= placeSearcher.Radius()))
                    nearbyPlaces.put(distance, place)

            }

где расстояние считается таким образом (формула Хаверсина):

public double distanceTo(GeoPosition anotherPos){

    int EARTH_RADIUS_KM = 6371;
    double lat1Rad = Math.toRadians(this.latitude);
    double lat2Rad = Math.toRadians(anotherPos.latitude);
    double deltaLonRad = Math.toRadians(anotherPos.longitude - this.longitude);

    return 1000*Math.acos(
                        Math.sin(lat1Rad) * Math.sin(lat2Rad) +
                        Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)
                    ) * EARTH_RADIUS_KM;
}
person Mike    schedule 27.12.2014

Вы не можете использовать radius и rankby вместе, в этом проблема

person Nithin Dev    schedule 01.02.2014

По состоянию на октябрь 2018 года Google добавил начальное местоположение в рамках функции поиска по окрестностям, а именно:

service.nearbySearch({
  location: place.geometry.location, //Add initial lat/lon here
  rankBy: google.maps.places.RankBy.DISTANCE,
  type: ['museum']
}, callback);

Вышеупомянутый код вернет музеи, близкие к указанному местоположению, в порядке возрастания расстояния. Дополнительную информацию можно найти здесь: https://developers.google.com/maps/documentation/javascript/examples/place-search

person Rega    schedule 31.10.2018