我希望使用像任何剧院,餐厅,着名公园,度假胜地,购物商店一样的用户的经纬度来获取位置名称。我使用谷歌地图api,但他们只显示区域名称而不是任何商店名称。我如何获得位置名称?
答案 0 :(得分:1)
您可以使用Google Places API获取此信息。 Google地图不会根据纬度和经度参数返回商店或数据。
我会启用您的API密钥以使用Google Places API,然后调用getNearbyPlaces端点。端点需要纬度,经度和半径(必须在其中找到结果的距离)参数。请记住,这仍然是一个查询,因此您的响应将包含多个结果,默认情况下,结果按受欢迎程度排序。我还想指定一个“type = establishment”作为可选参数,所以我不会得到像“route”这样的抽象结果。
您可以在RapidAPI here.中对此进行测试。我已将您直接链接到getNearbyPlaces端点。只需填写你的apiKey,纬度,经度,半径(我喜欢将它保持在20米左右以获得特异性),以及任何其他可选参数。单击“TEST功能”以查看详细的JSON响应。我将向您展示这个样子的截图。
在这个例子中,我查看了Bob's Donuts的纬度和经度。繁荣!事实上,我的第一个结果是旧金山的Bob's Donuts。 RapidAPI还允许您生成一个代码段,您可以将其直接复制并粘贴到您自己的代码中。您只需单击响应上方的“代码”按钮,登录并选择您正在使用的语言。上述调用提供的代码段如下所示:
希望这有帮助!还有一件事......由于结果按人气排序,第一个结果可能并不总是理想的结果。 API提供了“rankBy”参数,但我认为谷歌仍然在研究它的一些错误。在此期间,我将构建一个循环,通过距离找到最接近的结果项。您需要做的就是使用Haversine公式创建距离函数。我会为你建立一个快速的功能!我使用了来自this post.的hasrsine公式函数。这是代码。
// 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);
}
现在您的成功回调可能如下所示:
快乐的编码!