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

Posted

技术标签:

【中文标题】计算当前坐标和坐标列表之间的距离【英文标题】:calculate distance between current coordinates and a list of coordinates 【发布时间】:2018-03-20 09:52:37 【问题描述】:

我正在尝试计算坐标之间的直线距离。我可以使用硬编码值成功地做到这一点,但是当我有一个坐标列表时我的问题就出现了。 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。请帮忙

【问题讨论】:

I get a NaN. 哪里,哪一行? NaN 在这一行的 for 循环中 var distance = .... 好的,等等,如果我查看 JSON 文件,lat 和 lon 包含在 "" 中,并且距离函数需要一个不带 "" 的值。这可能会导致问题 【参考方案1】:

因为没有其他人发现它,.. 而 @eohdev 现在已经离开,认为结果是正确的,只是因为他们现在没有给出 NaN,我将发布问题的主要原因。

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 以备不时之需。

【讨论】:

感谢基思,我刚刚将“,”替换为“。”以便 ParseFloat 不排除完整值 所以当前接受的答案是错误的。即使您删除 parseFloat 并仅更改逗号,您当前的代码也会起作用。无论如何,我至少可以投票吗.. :)【参考方案2】:

据我所知,您读取了 this.places[i].Latitude 的值,这不是数字,因此有必要将此字符串转换为数字,然后再将其发送到功能或功能内。

使用 Number()parseFloat()

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

感谢@Keith

【讨论】:

parseFloat() 是个好主意,但这不是他得到 NaN 的原因,因为 JS 会在这里自动转换。 parseFloat 修复它,将 JSON lat 和 lon 转换为数字 @eohdev 不,不会,请检查您的号码。当您发现错误时,我会让您知道您还有什么其他问题。 parseFloat 刚刚隐藏了这个问题.. :)【参考方案3】:

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

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

【讨论】:

【参考方案4】:

您遇到了距离功能问题。您需要对 lon(s) 和 lat(s) 使用 parseFloat 将它们从字符串转换为数字。

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

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

【讨论】:

我注释掉了this.,因为我没有在任何对象内部工作。如果你想让它在某个对象中工作,使用需要使用this. parseFloat 是个好主意,但它不能解决这里的问题。不幸的是,@eohdev 现在已经离开了获取距离的数字,但数字会是错误的.. :( 它不再是 NaN,但它不会是他得到的正确数字.. 呃,为什么?我的意思是,它按预期工作。我没有看距离功能。但是当我使用 parseFloat 时,它可以工作并在控制台中给出结果。 你会得到结果,但它们会是错误的...... :(这个问题比只使用 parseFloat.. 更微妙一点.. :(

以上是关于计算当前坐标和坐标列表之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何连续计算位置更新之间的距离以获得总距离

“我当前的地理位置”和其他坐标之间的计算

数百个坐标之间的Nodejs距离计算阻塞了我的服务器

如何使用带有 Google Maps Roads API 的坐标列表计算距离

MySQL计算坐标之间距离

计算两个纬度和经度坐标之间的距离