SQL Server-查询附近的酒店

问题描述

根据手机上已知的客户经纬度坐标,查询5公里范围内的酒店。

在《酒店信息表》中有经度和纬度两个字段存储酒店坐标,计算客户坐标与酒店坐标之间的距离,返回5公里内的所有酒店信息。

 

代码实现

create function fnGetDistance (@LatBegin real, @LngBegin real, @LatEnd real, @LngEnd real)
returns float
as
begin
declare @del_lat float, @del_lng float, @factor float, @distance float
select @factor = pi()/180  -- 将角度转换为弧度,不清楚数据的格式,或许不需要转换
select @del_lat = @LatEnd - @LatBegin  -- 两点间纬度差
select @del_lng = @LngEnd - @LngBegin  -- 两点间经度差
select @distance = 6378.137*2*asin(sqrt(square(sin(@del_lat*@factor/2))+cos(@LatBegin*@factor)*cos(@LatEnd*@factor)*square(sin(@del_lng*@factor/2))))
  -- 半正矢公式,单位为km
return(@distance)
end
go

declare @Lat0 real, @Lng0 real, @Lat1 real, @Lng1 real, @distance float, @i float
select @Lat0 = 30
select @Lng0 = 114  --起点经纬度
select @i = 0
declare Cursor_hotel cursor
  for select Latitude, Longitude from Hotel
open Cursor_hotel
fetch next from Cursor_hotel
  into @Lat1, @Lng1
while @@fetch_status = 0
  begin
  exec @distance = fnGetDistance @Lat0, @Lng0, @Lat1, @Lng1
  if @distance <= 5
    begin
    @i = @i +1
    print '找到第'+ltrim(str(@i))+'个5公里内酒店的纬度和经度为:'+str(@Lat1)+' , '+str(@Lng1)
    end
  fetch next from Cursor_hotel
    into @Lat1, @Lng1
  end
if @i = 0
  print '很抱歉,没有找到5公里内的酒店!'
close Cursor_hotel
deallocate Cursor_hotel
go

  

posted @ 2022-05-29 16:33  Khru  阅读(163)  评论(0编辑  收藏  举报