如何用更少的计算量来测量两个坐标之间的距离?
How to measure distance between two coordinates with less calc possible?
我正在尝试使用尽可能少的 CPU 进行测量,因此我使用常数乘法器来获得以米为单位的值,如下所示:
lat1,long1 = 坐标 1
lat2,long2 = 坐标 2
DistV := abs(lat1-lat2); // Get a positive vertical value
DistH := abs(lon1-long2); // Get a positive horizontal value
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value
DistMeters := DistGPS*(111120*0.946); // 111120*0.946 = Constant multiplicator to meters
但是,计算出的值将添加到之前的测量值中,因此必须准确。有谁知道更好的方法吗?
为了更准确地测量距离,可以使用Haversine公式,如评论中所述。 Here 你可以看到公式和 JavaScript 实现:
var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();
var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
如果您认为粗略近似对您的目的非常有用,您可以使其更精确,以考虑沿子午线的距离收缩(而不是两个坐标的公共常数):
DistV := abs(lat1-lat2); // Get a positive vertical value
DistH := abs(lon1-long2); // Get a positive horizontal value
DistH := DistH * Cos((lat1+lat2) / 2); // Use average latitude
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value
DistMeters := DistGPS*111120; //to meters
我正在尝试使用尽可能少的 CPU 进行测量,因此我使用常数乘法器来获得以米为单位的值,如下所示:
lat1,long1 = 坐标 1
lat2,long2 = 坐标 2
DistV := abs(lat1-lat2); // Get a positive vertical value
DistH := abs(lon1-long2); // Get a positive horizontal value
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value
DistMeters := DistGPS*(111120*0.946); // 111120*0.946 = Constant multiplicator to meters
但是,计算出的值将添加到之前的测量值中,因此必须准确。有谁知道更好的方法吗?
为了更准确地测量距离,可以使用Haversine公式,如评论中所述。 Here 你可以看到公式和 JavaScript 实现:
var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();
var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
如果您认为粗略近似对您的目的非常有用,您可以使其更精确,以考虑沿子午线的距离收缩(而不是两个坐标的公共常数):
DistV := abs(lat1-lat2); // Get a positive vertical value
DistH := abs(lon1-long2); // Get a positive horizontal value
DistH := DistH * Cos((lat1+lat2) / 2); // Use average latitude
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value
DistMeters := DistGPS*111120; //to meters