如何根据经纬度获取两个位置之间的距离?
How to get the distance between two locations based on their latitude and longitude?
我正在尝试根据用户到每个位置的距离显示一个列表。这些位置作为 JSON 从 Firebase 接收。
要获取用户位置,我正在使用:
navigator.geolocation.getCurrentPosition(function(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
您知道一种按距离对 JSON 进行排序并列出它(具有多个子节点)的方法吗?
谢谢。
您有两种方法可以获取 latitude/longitude 与其他 latitude/longitude 之间的距离:
- 使用 Google API
function getDistanceOneToOne(lat1, lng1, lat2, lng2)
{
const Location1Str = lat1 + "," + lng1;
const Location2Str = lat2 + "," + lng2;
let ApiURL = "https://maps.googleapis.com/maps/api/distancematrix/json?";
let params = `origins=${Location1Str}&destinations=${Location2Str}&key=${GOOGLE_API_KEY}`; // you need to get a key
let finalApiURL = `${ApiURL}${encodeURI(params)}`;
let fetchResult = await fetch(finalApiURL); // call API
let Result = await fetchResult.json(); // extract json
return Result.rows[0].elements[0].distance;
}
这需要在手机上连接网络,但它提供了行驶距离(与驾驶导航器完全一样)加上更多信息(例如,到达时间),与第二个不同提供直线距离的方法。
对于以上你需要get a Google Api Key. More info here: Google Maps Api
- 使用纯数学
这发生在设备本地,它提供了两个 latitudes/longitudes 之间的直线距离。
function distance(lat1, lon1, lat2, lon2, unit) {
var radlat1 = Math.PI * lat1/180
var radlat2 = Math.PI * lat2/180
var theta = lon1-lon2
var radtheta = Math.PI * theta/180
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist)
dist = dist * 180/Math.PI
dist = dist * 60 * 1.1515
if (unit=="K") { dist = dist * 1.609344 }
if (unit=="M") { dist = dist * 0.8684 }
return dist
}
运行 每个项目的上述之一,您将获得每个项目的距离。希望对您有所帮助。
我正在尝试根据用户到每个位置的距离显示一个列表。这些位置作为 JSON 从 Firebase 接收。
要获取用户位置,我正在使用:
navigator.geolocation.getCurrentPosition(function(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
您知道一种按距离对 JSON 进行排序并列出它(具有多个子节点)的方法吗?
谢谢。
您有两种方法可以获取 latitude/longitude 与其他 latitude/longitude 之间的距离:
- 使用 Google API
function getDistanceOneToOne(lat1, lng1, lat2, lng2)
{
const Location1Str = lat1 + "," + lng1;
const Location2Str = lat2 + "," + lng2;
let ApiURL = "https://maps.googleapis.com/maps/api/distancematrix/json?";
let params = `origins=${Location1Str}&destinations=${Location2Str}&key=${GOOGLE_API_KEY}`; // you need to get a key
let finalApiURL = `${ApiURL}${encodeURI(params)}`;
let fetchResult = await fetch(finalApiURL); // call API
let Result = await fetchResult.json(); // extract json
return Result.rows[0].elements[0].distance;
}
这需要在手机上连接网络,但它提供了行驶距离(与驾驶导航器完全一样)加上更多信息(例如,到达时间),与第二个不同提供直线距离的方法。
对于以上你需要get a Google Api Key. More info here: Google Maps Api
- 使用纯数学
这发生在设备本地,它提供了两个 latitudes/longitudes 之间的直线距离。
function distance(lat1, lon1, lat2, lon2, unit) {
var radlat1 = Math.PI * lat1/180
var radlat2 = Math.PI * lat2/180
var theta = lon1-lon2
var radtheta = Math.PI * theta/180
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist)
dist = dist * 180/Math.PI
dist = dist * 60 * 1.1515
if (unit=="K") { dist = dist * 1.609344 }
if (unit=="M") { dist = dist * 0.8684 }
return dist
}
运行 每个项目的上述之一,您将获得每个项目的距离。希望对您有所帮助。