首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haversine公式-结果太高

Haversine公式-结果太高
EN

Stack Overflow用户
提问于 2014-08-20 16:41:04
回答 3查看 252关注 0票数 1

我用Haversine公式来计算地球上两点之间的距离。我有以下代码:

代码语言:javascript
复制
    var app = angular.module('app', []);
app.controller('firstCtrl', function($scope, $timeout) {
  var myLat, myLon, locLat, locLon;
  navigator.geolocation.watchPosition(GetLocation)

  $scope.ASiteLocs = [{
    "name": "IL5077 BRUSSELS",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.58543899999999,38.955472,0"
    }
  }, {
    "name": "IL5076 KAMPSVILLE",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.661923,39.29403,0"
    }
  }, {
    "name": "IL5146 CARROLLTON",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.39965700000001,39.309142,0"
    }
  }, {
    "name": "IL5153 GREENFIELD",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.208747,39.364077,0"
    }
  }];
  $scope.SSiteLocs = [];
  $scope.SiteLocs = $scope.SSiteLocs.concat($scope.ASiteLocs);
  repoSortOrder = "site.name";


  function GetLocation(location, myLat, myLon) {
    myLat = location.coords.latitude;
    myLon = location.coords.longitude;
    document.getElementById("lat").innerHTML = myLat;
     document.getElementById("lon").innerHTML = myLon;
    $timeout(function() {
      calculate();
    });

  }

  $scope.getCoordDistance = function(myLat, myLon, locLat, locLon) {
    var lat1 = locLat; //41.887055
    var lon1 = locLon; //-88.469233
    var lat2 = myLat; //41.888668
    var lon2 = myLon; //-87.640371

    var R = 3959;
    var x1 = lat2 - lat1;
    var dLat = x1 * Math.PI / 180;
    var x2 = lon2 - lon1;
    var dLon = x2 * Math.PI / 180;
    a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
      Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
      Math.sin(dLon / 2) * Math.sin(dLon / 2);
    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    return d;

  };


  angular.forEach($scope.SSiteLocs, function(object) {
    object.carrier = 'Sprint';
  });
  angular.forEach($scope.ASiteLocs, function(object) {
    object.carrier = 'AT&T';
  });
var i = 0;
locX = 1;
  var calculate = function() {
    angular.forEach($scope.SiteLocs, function(location) {
      var clength = location.Point.coordinates.length;
      if (location.Point.coordinates.substring(clength - 2, clength) === ",0") {
        location.Point.coordinates = location.Point.coordinates.substring(0, clength - 2).split(",");
        Lat = location.Point.coordinates[0];
        Lon = location.Point.coordinates[1];
        Com = ",";
        location.Point.coordinates = Lon.concat(Com, Lat);
      myLat = Number(document.getElementById("lat").innerHTML)
      myLon = Number(document.getElementById("lon").innerHTML)

      locLat = Lat;
      locLon = Lon;
      d = $scope.getCoordDistance(myLat, myLon, locLat, locLon);
      location.distance = d.toFixed(1);

    if(i < 15){
      console.log("********LOCATON " + locX + "***********")
      console.log("myCoords: " + myLat + "," + myLon);
      console.log("locCoords: " + locLat + "," + locLon);

      console.log("d: " + d);
      console.log("***************************")
      i++;
      locX++;

    }
    }

    });
  };


});

从公式得到的结果高达9-10,000,而它们不应该在那个高度附近的地方。如果我使用注释掉的坐标,它将正确返回(42.6英里),因为测试坐标工作,我知道这不是一个数学问题。有人知道是什么导致公式不能正确工作吗?

编辑

这里是整个过程的柱塞。如果有帮助的话。

EDIT2

我发现一些奇怪的东西,结果在不同的浏览器中是不同的,所以,chrome显示一组数字,IE显示另一组,等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-20 20:11:07

你的点坐标是经纬度。

代码语言:javascript
复制
BRUSSELS",
    "
    "Point": {
      "coordinates": "-90.58543899999999,38.955472

在你的代码中

代码语言:javascript
复制
Lat = location.Point.coordinates[0];
Lon = location.Point.coordinates[1];

要么在您的对象中更改它们(更好)参见Google 闩锁类

代码语言:javascript
复制
"Point": {
          "coordinates": "38.955472,-90.58543899999999

代码语言:javascript
复制
Lat = location.Point.coordinates[1];
Lon = location.Point.coordinates[0];

与您的设置距离是aprox 9000英里与坐标转换距离是aprox 200。

票数 0
EN

Stack Overflow用户

发布于 2014-08-20 16:50:56

在这里,我不完全确定,如果不进行测试,但是看起来GetLocation函数通过将变量myLat和myLon声明为函数参数来覆盖它们的闭包作用域,所以您要将location.coords.latitude的值赋值到函数作用域myLat变量中,而不是在代码块开始时声明的myLat。

将console.log(myLat,myLon);抛到getCoordDistance的开头,并检查它们的值。我敢打赌他们不是你期望的那样。

编辑:实际上可能是因为缺少分号之类的东西。下面是重新校准的代码片段,以便在像jsbin.com这样的孤立环境中运行。它看起来很好用。您缺少了4个分号,所以除非此赋值失败,否则它应该可以工作: myLon =myLon

有人抱怨变量"i“和"locX”没有被定义

代码语言:javascript
复制
var myLat, myLon;

var ASiteLocs = [{
    "name": "IL5077 BRUSSELS",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.58543899999999,38.955472,0"
    }
  }, {
    "name": "IL5076 KAMPSVILLE",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.661923,39.29403,0"
    }
  }, {
    "name": "IL5146 CARROLLTON",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.39965700000001,39.309142,0"
    }
  }, {
    "name": "IL5153 GREENFIELD",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.208747,39.364077,0"
    }
  }];

var SSiteLocs = [];
var SiteLocs = SSiteLocs.concat(ASiteLocs);

function GetLocation(location, myLat, myLon) {
    myLat = location.coords.latitude;
    myLon = location.coords.longitude;
    document.getElementById("lat").innerHTML = myLat;
     document.getElementById("lon").innerHTML = myLon;

  }

function getCoordDistance(myLat, myLon, locLat, locLon) {
    var lat1 = locLat; //41.887055
    var lon1 = locLon; //-88.469233
    var lat2 = myLat; //41.888668
    var lon2 = myLon; //-87.640371

    var R = 3959;
    var x1 = lat2 - lat1;
    var dLat = x1 * Math.PI / 180;
    var x2 = lon2 - lon1;
    var dLon = x2 * Math.PI / 180;
    a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
      Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
      Math.sin(dLon / 2) * Math.sin(dLon / 2);
    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    return d;

  };


function calculate() {
    SiteLocs.forEach(function(location) {
      var clength = location.Point.coordinates.length;
      if (location.Point.coordinates.substring(clength - 2, clength) === ",0") {
        location.Point.coordinates = location.Point.coordinates.substring(0, clength - 2).split(",");
        Lat = location.Point.coordinates[0];
        Lon = location.Point.coordinates[1];
        Com = ",";
        location.Point.coordinates = Lon.concat(Com, Lat);
      myLat = -90.208747;
      myLon = 39.364077;

      locLat = Lat;
      locLon = Lon;
      d = getCoordDistance(myLat, myLon, locLat, locLon);
      location.distance = d.toFixed(1);

    //console.log("********LOCATON " + locX + "***********");
      console.log("myCoords: " + myLat + "," + myLon);
      console.log("locCoords: " + locLat + "," + locLon);

      console.log("d: " + d);
      console.log("***************************");

    }

    });
  };
票数 0
EN

Stack Overflow用户

发布于 2014-08-20 16:56:17

除了kirinthos在他的回复中说的话外,您还可以通过将您的结果与Google进行比较来轻松地测试它。我的应用程序中有一个函数可以实现这个功能。point1和point2参数是简单的Latlng对象,我希望结果以公里为单位,所以我除以1000。

代码语言:javascript
复制
function calculateDistanceBetweenTwoPoints(point1, point2) {
    return (google.maps.geometry.spherical.computeDistanceBetween(point1, point2) / 1000).toFixed(2);
}

您需要HTML页面中的以下内容:

代码语言:javascript
复制
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,places"></script>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25410111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档