0

我不太喜欢数据库和 GIS,我对在 MySql 数据库上使用这个函数来计算 2 点之间的距离有以下疑问。

我从本教程开始,其中有这个函数用于计算 2场之间的距离:

CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double
    DETERMINISTIC
begin
  declare lon1, lon2 double;
  declare lat1, lat2 double;
  declare td double;
  declare d_lat double;
  declare d_lon double;
  declare a, c, R double;

  set lon1 = X(GeomFromText(AsText(point1)));
  set lon2 = X(GeomFromText(AsText(point2)));
  set lat1 = Y(GeomFromText(AsText(point1)));
  set lat2 = Y(GeomFromText(AsText(point2)));

  set d_lat = radians(lat2 - lat1);
  set d_lon = radians(lon2 - lon1);

  set lat1 = radians(lat1);
  set lat2 = radians(lat2);

  set R = 6372.8; -- in kilometers

  set a = sin(d_lat / 2.0) * sin(d_lat / 2.0) + sin(d_lon / 2.0) * sin(d_lon / 2.0) * cos(lat1) * cos(lat2);
  set c = 2 * asin(sqrt(a));

  return R * c;
end

我认为它应该返回一个以公里为单位的值作为单位测量。

然后我用它来计算空间中 2 点之间的距离(取自谷歌地图,例如意大利的罗马米兰城市)。

我正在获得合理的价值。我的疑问是,然后我使用谷歌地球中的标尺工具检查了距离,我得到了不同的值。

考虑到附近的 2 个点(距离为 2 公里)的敌人示例,我在 Google 地球计算的差异与我之前的函数之间获得了大约 300 米的差异。

考虑到非常遥远的 2 个点(例如罗马和米兰),我在 Google 地球计算的值与前一个函数计算的值之间获得了 100 公里的差异。

前一个函数总是给出更大的值。

所以我必须用它来计算小距离(最大 30 公里),所以误差应该很小,对于我的 pourpose 来说可能没问题。

但是为什么我会在我的功能和使用谷歌地球计算的距离之间获得这些差异?

4

1 回答 1

0

SQL Server 使用以下代码返回 534.728893656916km: declare @g geography = geography::Point(9.191884,45.464090,4326) -- Latitude, Longitude, SRID declare @h geography = geography::Point(12.492359,41.890365,4326) select @g.STDistance(@h)/1000.00

于 2016-12-22T11:47:20.347 回答