计算两个坐标之间距离的最快方法?

时间:2019-03-14 22:40:00

标签: sql-server tsql

我们当前使用Geography类型来计算当前位置和tsql表中的坐标之间的距离。我们的代码基于此sqlauthority.com示例。

是否有更快的方法来检索两点之间的距离?这些呼叫将由手机应用程序完成,因此理想情况下应非常快。

1 个答案:

答案 0 :(得分:0)

经过一定距离的测试后,我知道每个批处理循环100次并运行该批处理15次,以确保10次运行SSMS中的客户端统计信息存储被循环到初始查询计划生成之后,因此不会歪曲结果。这是剩余的平均值。计算方法似乎是地理选项的两倍。

返回的距离差为0.0000000020044。

results

使用的计算脚本 (返回英里数:41.9013152732833)

set nocount on;
declare 
     @lat1 float = 45.489614
    ,@lon1 float = -122.650021
    ,@lat2 float = 44.94404
    ,@lon2 float = -123.025739
select 3959.1825574 * acos(sin(@lat1/57.295779513082323) * sin(@lat2/57.295779513082323) + cos(@lat1/57.295779513082323) * cos(@lat2/57.295779513082323) * cos((@lon2-@lon1)/57.295779513082323)) distance_in_miles
GO 100

使用的地理脚本 (返回英里数:41.9013152752877)

set nocount on;
declare
     @g geography = geography::Point(45.489614, -122.650021, 4326)
    ,@h geography = geography::Point(44.94404, -123.025739, 4326)
select @h.STDistance(@g) / 1609.344 distance_in_miles -- 1609.344 is meters in mile. STDistance = meters.
GO 100

公平警告,在非系统功能中执行此操作仍将具有不可预测的性能。我建议内联进行计算。

这是一个原始的calculation示例。

英里的内联语法的工作示例。这是我能找到的最简单,最准确,最短的语法。

已针对准确性进行调整

if object_id('tempdb..#LatLongInfo','U') is not null
    begin
        drop table #LatLongInfo;
    end;
create table #LatLongInfo (
    lat1 float,
    lon1 float,
    lat2 float,
    lon2 float
);
insert into #LatLongInfo
values (21, -76, 23, -72);

select 
    3959.1825574 * acos(sin(lat1/57.295779513082323) * sin(lat2/57.295779513082323) + cos(lat1/57.295779513082323) * cos(lat2/57.295779513082323) * cos((lon2-lon1)/57.295779513082323)) distance_in_miles
from #LatLongInfo;

希望这会有所帮助。我使用类似的方法在sql2000发布时就在给定范围内为患者找医生,这已经有一段时间了。 Google是一个新生事物,没有地图,只有一个搜索框和一个按钮。你们现在都怀旧了……我记得我第一次编码时读过this