【发布时间】:2017-05-26 00:30:03
【问题描述】:
我想使用用户的纬度和经度来获取位置名称,例如任何剧院、餐厅、著名公园、度假胜地、购物商店。我正在使用谷歌地图 api,但它们只显示区域名称而不是任何商店名称。如何获取位置名称?
【问题讨论】:
标签: api dictionary location
我想使用用户的纬度和经度来获取位置名称,例如任何剧院、餐厅、著名公园、度假胜地、购物商店。我正在使用谷歌地图 api,但它们只显示区域名称而不是任何商店名称。如何获取位置名称?
【问题讨论】:
标签: api dictionary location
您可以使用 Google Places API 来获取此信息。 Google 地图不会返回基于纬度和经度参数的商店或地点数据。
我会让您的 API 密钥与 Google Places API 一起使用,然后调用 getNearbyPlaces 端点。端点需要纬度、经度和半径(必须在其中找到结果的距离,以米为单位)参数。请记住,这仍然是一个查询,因此您的响应将包含多个结果,默认情况下,结果按受欢迎程度排序。我还喜欢指定一个“type=establishment”作为可选参数,这样我就不会得到像“route”这样的抽象结果。
您可以在RapidAPI here. 中对此进行测试,我已将您直接链接到 getNearbyPlaces 端点。只需填写您的 apiKey、纬度、经度、半径(为了具体起见,我喜欢将其保持在 20 米左右)和任何其他可选参数。单击“测试函数”以查看详细的 JSON 响应。我会给你看一个截图。
在此示例中,我查找了 Bob's Doughnuts 的纬度和经度。繁荣!事实上,我的第一个结果是旧金山的 Bob's Donuts。 RapidAPI 还允许您生成代码 sn-p,您可以将其复制并直接粘贴到您自己的代码中。您只需单击响应上方的“代码”按钮,登录并选择您使用的语言。上述调用提供的代码 sn-p 如下所示:
希望这会有所帮助!还有一件事.. 由于结果是按受欢迎程度排序的,所以第一个结果可能并不总是理想的结果。 API 提供了一个“rankBy”参数,但我认为 Google 仍在解决一些错误。同时,我将构建一个循环,按距离查找最近的结果项。您需要做的就是使用 Haversine 公式创建一个距离函数。我会为你建立一个快速的功能!我使用了this post.的haversine公式函数,代码如下。
// Still using my Bob's Doughnuts example
const startLatitude = "37.7918904"; // your original query latitude
const startLongitude = "-122.4209966"; // your original query longitude
function closestResult(results) {
let closestResult = null;
let shortestDistance = null;
for (let i = 0; i < results.length; i++) {
let location = results[i].geometry.location;
let currentDistance =
getDistanceFromLatLonInKm(startLatitude, startLongitude, location.lat, location.lng);
if (shortestDistance === null) {
closestResult = results[i];
shortestDistance = currentDistance;
} else if (currentDistance < shortestDistance) {
closestResult = results[i];
shortestDistance = currentDistance;
}
}
return closestResult;
}
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI/180);
}
现在您的成功回调可能如下所示:
编码愉快!
【讨论】: