【问题标题】:How to sort results by distance with google places api using Nearby Search Requests如何使用 Google Places api 使用附近搜索请求按距离对结果进行排序
【发布时间】:2013-03-25 00:53:24
【问题描述】:
【问题讨论】:
标签:
api
google-maps
google-places-api
google-places
【解决方案1】:
是的,您不能在同一请求中使用 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)
}
这样计算距离的地方(Haversine 公式):
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;
}
【解决方案2】:
你不能同时使用radius 和rankby 这是问题所在