【问题标题】:Phonegap geolocation distance between coordinates坐标之间的Phonegap地理定位距离
【发布时间】:2016-05-30 12:29:58
【问题描述】:

我试图在 javascript 中计算两个坐标之间的距离。
更具体地说,一组静态坐标与我从 geolocation cordova 插件获取的当前位置之间的距离。

这是我的代码:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var lla = position.coords.latitude;
    var llo = position.coords.longitude;

    document.getElementById("content").innerHTML =
'GPS Position: ' + calcTheDistance(lla, llo).d + 'Metres';


};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

function calcTheDistance(lati1, long1) {
    var r = 6371000; //Meters
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var la1 = lati1;
    var la2 = joschLat;
    var lat1 = lati1.toRadians();
    var lat2 = joschLat.toRadians();
    var lo1 = long1;
    var lo2 = joschLon;
    var la2minla1 = (la2-la1).toRadians();
    var lo2minlo1 = (lo2-lo1).toRadians();

    var cal = Math.sin(la2minla1 / 2) * Math.sin(la2minla1 / 2) +
            Math.cos(lat1) * Math.cos(lat2) *
            Math.sin(lo2minlo1/2) * Math.sin(lo2minlo1/2);
    var c = 2* Math.atan2(Math.sqrt(cal), Math.sqrt(1-cal));

    d = r * c;
};

我尝试重写了好几次都没有成功。

计算我参考了这个:http://www.movable-type.co.uk/scripts/latlong.html

【问题讨论】:

  • 问题是什么?这是行不通的?给出错误的结果?
  • @Koshinae 是的,不起作用,它会将 innerHTML 更改为“成功,尝试计算...”,但没有进一步,它只是停留在那里。
  • 我在calcTheDistance 中没有看到return 声明

标签: javascript android cordova gps geolocation


【解决方案1】:

您引用的页面包含library of functions already implemented in Javascript。如果你在你的应用中包含这些,计算就变得微不足道了:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var sourceLl = new LatLon(position.coords.latitude, position.coords.longitude);

    document.getElementById("content").innerHTML =
'GPS Position: ' + calcTheDistance(sourceLl) + 'Metres';
};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

function calcTheDistance(sourceLl) {
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var joschLl = new LatLon(joschLat, joschLon);
    return joschLl.distanceTo(sourceLl);
};

【讨论】:

  • 我没有使用该库,但您的回答认为我的代码有什么问题,非常感谢!
【解决方案2】:

所以我在阅读@DaveAlden 的答案后想通了,顺便谢谢!

toRadians();不是一个标准的 Javascript 函数,所以在我添加了这个并稍微重写了我的代码之后,它工作得很好。

这是工作代码 document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {


navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var lla = position.coords.latitude;
    var llo = position.coords.longitude;
    var dst = 'Distance: ' + calcTheDistance(lla, llo) + ' Metres';
    document.getElementById("content").innerHTML = dst;


};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

    function toRadians(num) {
        return num * Math.PI / 180; 
};

function calcTheDistance(lati1, long1) {
    var r = 6371000; //metres
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var la1 = lati1;
    var la2 = joschLat;
    var lat1 = toRadians(lati1);
    var lat2 = toRadians(joschLat);
    var lo1 = long1;
    var lo2 = joschLon;
    var la2minla1 = toRadians(la2-la1);
    var lo2minlo1 = toRadians(lo2-lo1);

    var cal = Math.sin(la2minla1 / 2) * Math.sin(la2minla1 / 2) +
            Math.cos(lat1) * Math.cos(lat2) *
            Math.sin(lo2minlo1/2) * Math.sin(lo2minlo1/2);
    var c = 2* Math.atan2(Math.sqrt(cal), Math.sqrt(1-cal));

    var d = r * c;
    return Math.round(d);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2017-05-05
    • 2016-02-22
    • 2021-10-11
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多