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