MySQL 函数 ST_Distance_Sphere 没有使用 Haversine 公式?
MySQL function ST_Distance_Sphere isn't using Haversine formula?
我正在尝试使用 MySQL 计算两个地理点之间的距离,但我认为 ST_Distance_Sphere
函数不正确或未使用 Haversine 公式。
为了描述这个问题,我将使用这两个点和这个地球半径:
Point A: 41.8902142, 12.4900422
Point B: 48.8583736, 2.2922926
Earth radius: 6378000
我在 JavaScript 中使用 Haversine 公式制作了这个脚本:
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
const sin2 = (x) => {
return Math.pow( Math.sin(x), 2 );
}
function computeDistanceBetween(x1, y1, x2, y2, rad = 6378000) {
const x_diff = x2 - x1;
const y_diff = y2 - y1;
let a = sin2(x_diff.toRad() / 2) + Math.cos(x1.toRad()) * Math.cos(x2.toRad()) * sin2(y_diff.toRad() / 2);
a = 2 * rad * Math.asin(Math.sqrt(a))
return a;
}
console.log(
computeDistanceBetween(
41.8902142, 12.4900422,
48.8583736, 2.2922926
) / 1000 // Convert to Km
);
这个脚本给了我这个结果:1110.6415064d524447
,如果我在 Google 地图中检查这个,结果大致相同 (1,109.43 km
)
现在,MySQL 是问题所在,我试图对这两点做同样的事情,但结果却大不相同:
SELECT
ST_Distance_Sphere(
POINT(41.8902142, 12.4900422), POINT(48.8583736, 2.2922926), 6378000
) / 1000 as distances
它给了我 1370.65792958018
作为结果,有 260 公里的差异,所以结果是非常错误的,请注意,我在两种情况下使用完全相同的点和相同的半径,所以 MySQL 是错的还是怎么的?如何获得与 JavaScript 相同的结果,但使用 MySQL 中的空间函数?非常感谢您的帮助
好吧,这很棘手,函数 POINT
首先接收 longitude
参数,然后接收 latitude
参数,因此,正确的查询应该是这样的:
SELECT ST_Distance_Sphere(POINT(12.4900422, 41.8902142),
POINT( 2.2922926, 48.8583736),
6378000 ) /1000 as distances
所以这个 returns 我 1110.641506452445
这是正确的结果。
我正在尝试使用 MySQL 计算两个地理点之间的距离,但我认为 ST_Distance_Sphere
函数不正确或未使用 Haversine 公式。
为了描述这个问题,我将使用这两个点和这个地球半径:
Point A: 41.8902142, 12.4900422
Point B: 48.8583736, 2.2922926
Earth radius: 6378000
我在 JavaScript 中使用 Haversine 公式制作了这个脚本:
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
const sin2 = (x) => {
return Math.pow( Math.sin(x), 2 );
}
function computeDistanceBetween(x1, y1, x2, y2, rad = 6378000) {
const x_diff = x2 - x1;
const y_diff = y2 - y1;
let a = sin2(x_diff.toRad() / 2) + Math.cos(x1.toRad()) * Math.cos(x2.toRad()) * sin2(y_diff.toRad() / 2);
a = 2 * rad * Math.asin(Math.sqrt(a))
return a;
}
console.log(
computeDistanceBetween(
41.8902142, 12.4900422,
48.8583736, 2.2922926
) / 1000 // Convert to Km
);
这个脚本给了我这个结果:1110.6415064d524447
,如果我在 Google 地图中检查这个,结果大致相同 (1,109.43 km
)
现在,MySQL 是问题所在,我试图对这两点做同样的事情,但结果却大不相同:
SELECT
ST_Distance_Sphere(
POINT(41.8902142, 12.4900422), POINT(48.8583736, 2.2922926), 6378000
) / 1000 as distances
它给了我 1370.65792958018
作为结果,有 260 公里的差异,所以结果是非常错误的,请注意,我在两种情况下使用完全相同的点和相同的半径,所以 MySQL 是错的还是怎么的?如何获得与 JavaScript 相同的结果,但使用 MySQL 中的空间函数?非常感谢您的帮助
好吧,这很棘手,函数 POINT
首先接收 longitude
参数,然后接收 latitude
参数,因此,正确的查询应该是这样的:
SELECT ST_Distance_Sphere(POINT(12.4900422, 41.8902142),
POINT( 2.2922926, 48.8583736),
6378000 ) /1000 as distances
所以这个 returns 我 1110.641506452445
这是正确的结果。