我们当前使用Geography
类型来计算当前位置和tsql表中的坐标之间的距离。我们的代码基于此sqlauthority.com示例。
是否有更快的方法来检索两点之间的距离?这些呼叫将由手机应用程序完成,因此理想情况下应非常快。
答案 0 :(得分:0)
经过一定距离的测试后,我知道每个批处理循环100次并运行该批处理15次,以确保10次运行SSMS中的客户端统计信息存储被循环到初始查询计划生成之后,因此不会歪曲结果。这是剩余的平均值。计算方法似乎是地理选项的两倍。
返回的距离差为0.0000000020044。
使用的计算脚本 (返回英里数: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。