计算当前坐标和坐标列表之间的距离

calculate distance between current coordinates and a list of coordinates

我正在尝试计算坐标之间的直线距离。我可以使用硬编码值成功地做到这一点,但是当我有一个坐标列表时,我的问题就来了。 S 基本上第一组坐标将始终是我可以成功获取的当前位置。第二组坐标来自 JSON 文件,如下所示。

[
    {
      "LocationID": 407,
      "LocationName": "Free State",
      "CustomerName": "Build It - Botshabelo ",
      "ContactNo": "051 - 534 4072",
      "Address": "75 Blue Street, Botshabelo",
      "Zipcode": null,
      "Longitude": "26,704671",
      "Latitude": "-29,199533",
      "Status": 1,
      "CreatedDate": "25:29,0",
      "CreatedBy": 1,
      "ModifiedDate": "25:29,0",
      "ModifiedBy": 1,
      "ShopType": "Retails",
      "Region": null,
      "FIELD16": "Closed "
    },
    {
      "LocationID": 408,
      "LocationName": "Free State",
      "CustomerName": "Cashbuild - Thabanchu",
      "ContactNo": "051 - 875 1590",
      "Address": "Brug St, Thaba Nchu",
      "Zipcode": null,
      "Longitude": "26,779109",
      "Latitude": "-29,196689",
      "Status": 1,
      "CreatedDate": "25:29,0",
      "CreatedBy": 1,
      "ModifiedDate": "25:29,0",
      "ModifiedBy": 1,
      "ShopType": "Retails",
      "Region": null,
      "FIELD16": "Closed "
    },
    {
      "LocationID": 409,
      "LocationName": "Free State",
      "CustomerName": "Ladybrand Mica",
      "ContactNo": "082 - 568 5387",
      "Address": "17 Joubert St, Ladybrand",
      "Zipcode": null,
      "Longitude": "27,458835",
      "Latitude": "-29,191979",
      "Status": 1,
      "CreatedDate": "25:29,0",
      "CreatedBy": 1,
      "ModifiedDate": "25:29,0",
      "ModifiedBy": 1,
      "ShopType": "Retails",
      "Region": null,
      "FIELD16": ""
    }
]

我正在遍历数组以获取纬度和经度

  this.http.get('assets/stores.json').subscribe(data => {
    this.places = data;

    for(var i = 0; i < this.places.length; i++){
      this.placePOS = this.places[i].Latitude, this.places[i].Longitude;
      var distance = this.distance(this.currentLat, this.currentLon, this.places[i].Latitude, this.places[i].Longitude, 'K');
    }

  }); 

这里创建距离函数

  distance(lat1, lon1, lat2, lon2, unit) {
    var radlat1 = Math.PI * lat1/180
    var radlat2 = Math.PI * lat2/180
    var radlon1 = Math.PI * lon1/180
    var radlon2 = Math.PI * lon2/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=="N") { dist = dist * 0.8684 }
    return dist
} 

当我 运行 代码时,我得到一个 NaN。请协助

当您尝试对不是数字的变量执行一些数学运算时,您会得到一个 NaN。 在您的问题中,您拥有的文档数组、纬度和经度是字符串格式,您没有在任何地方解析浮点数。首先将这些字符串转换为数字,然后根据需要进行数学运算。

PS:我可以给你代码,但你自己试试看会更好

据我所知,您阅读了 this.places[i].Latitude 的值,这不是数字,因此有必要将此字符串转换为在将其发送到函数之前或在函数内。

使用 Number()parseFloat()

正如@Keith 为 parseFloat() 指出的那样,这两个对话都无法处理原始 JSON 对象中的逗号。 Number() 将再次产生 NaN 并且 parseFloat() 将数字舍入到最接近的整数。因此有必要用点替换 JSON 对象中的逗号。

感谢@Keith

您的距离函数有问题。您需要对 lon(s) 和 lat(s) 使用 parseFloat 将它们转换为字符串中的数字。

我尝试稍微更改一下您的代码。 https://jshttps://jsfiddle.net/startsco/z5n7q2zn/10/fiddle.net/startsco/z5n7q2zn/10/

运行 它并检查您的控制台。

因为没有其他人发现它,..@eohdev 现在认为结果是正确的,只是因为他们现在没有给出 NaN,我会 post问题的主要原因。

parseFloat 是个好习惯,但这不是导致问题的原因。Javascript 通常可以自动计算出类型。例如。 "20" / 4 将等于 5,即使 20 是一个字符串。 "20" - "5" 等于 15,. JS不能自动算出的是"20" + "5",这个是205..这是因为你可以拼接字符串,加上数字所以不能自动选择,这就是为什么parseFloat等是个好东西想法。

但是回到这里的问题,这是源数据.. "Longitude": "27,458835" 该数字不是有效的浮点数,JS 中的浮点数没有逗号。

那么你问的为什么 parseFloat 看起来有效,..好吧 parseFloat("27,458835") 会导致 27..哦,亲爱的..除非你的距离计算是为了被截断到最近的学位,这可能不是你想要的。

所以问题不是缺少 parseFloat,而是源数据使用的是逗号,而不是小数点的句号。因此,如果您将逗号更改为句号,您当前的代码将起作用,但我也想说,为了更好的衡量,也保留 parseFloats。