我有一个功能,需要2对纬度和经度,并以m为单位返回距离。
function distance(lat1, lon1, lat2, lon2){
var p = Math.PI/180;
var c = Math.cos;
var a = 0.5 - c((lat2 - lat1) * p)/2 +
c(lat1 * p) * c(lat2 * p) *
(1 - c((lon2 - lon1) * p))/2;
return 12742 * Math.asin(Math.sqrt(a)) * 1000; // 2 * R; R = 6371 km
}//Distance
(注意我没有创建这个功能但是从SO上的另一个问题得到了它)
我有多个纬度和经度来源,我想知道如何处理它们。我尝试使用||
这样的
var distanceFromTarget = distance(
target.latitude || target.lat || target.lat(),
target.longitude || target.lng || target.lng(),
current.latitude || current.lat || current.lat(),
current.longitude || current.lat || current.lng()
);
我想使用该函数处理来自三种不同格式的输入
navigator.geolocation.x
以
格式返回数据{latitude: 0000, longitude:0000}
返回
的插件{lat: 000, lng: 000}
和google maps api返回一个复杂的对象,其中包含lat和lng的getter的位置:
location = {lat(){return latitude}, lng(){return longitude}}
我怎样才能处理这三个?我以为我上面的东西在起作用,但现在我很清楚它不是。当位置的格式为target.lat()
时,距离返回NaN。如果有人可以解释||
一般如何工作也会很好,因为我认为如果前一个对象未定义,它将只使用下一个对象。
答案 0 :(得分:0)
问题实际上是代码如何处理错误,例如原始当前对象或目标对象是否未定义。同样在位置对象包含lat
和lng
lat()
或lng()的getter的情况下。然后定义target.lat,因此我使用了
function atPosition(current, target){
if (typeof current === "undefined" || typeof target == "undefined") {
console.log("current or target position undefined.")
return
}
//if target is function and defined set property to return value of function.
if (typeof target === "object" && typeof target.lat === "function") {
target.lat = target.lat();
target.lng = target.lng();
}
//console.log(target);
//if currentPosition is within 25m of target return true
var distanceFromTarget = distance(
target.latitude || target.lat,
target.longitude || target.lng,
current.latitude || current.lat,
current.longitude || current.lng
);
console.log("Distance from target", distanceFromTarget);
if (distanceFromTarget <= 25) {
return true
} else {
return false
}
}