我想按距离获取我位置附近的所有机场。我正在使用附近的搜索请求和谷歌地方 api 使用这个网址: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”,则不得包含半径。
问问题
5352 次
3 回答
2
是的,您不能在同一个请求中使用radius和rankBy 。但是您可以使用rankBy=distance
然后根据geometry.location.lat
and自己计算距离geometry.location.lng
。例如在 groovy 中我已经这样做了:
GeoPosition
和Place
类是由我实现的,所以不要指望在核心库中找到它们:)
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;
}
于 2014-12-27T21:05:57.427 回答
0
你不能radius
和rankby
一起使用这就是问题所在
于 2014-02-01T05:29:18.233 回答
0
根据 2018 年 10 月,Google 已将初始位置添加为附近搜索的一部分,如下所示:
service.nearbySearch({
location: place.geometry.location, //Add initial lat/lon here
rankBy: google.maps.places.RankBy.DISTANCE,
type: ['museum']
}, callback);
上述代码将返回靠近按距离 asc 排序的指定位置的博物馆。在此处查找更多信息:https ://developers.google.com/maps/documentation/javascript/examples/place-search
于 2018-10-31T16:05:02.263 回答