我看了几个其他似乎有些相关的SO问题,但不是我需要的东西(或者我只是不够聪明地连接点)。
为客户处理应用程序。他们的数据库保存着旅行的人的出发地和目的地,有限(我相信)只在美国和加拿大的地方,以及旅行的日期。记录定期更新。称这些为“旅行”。
用户来到该网站,输入一个出发地和目的地城市,以及每个城市的半径,表示他们愿意前往所需的出发地/目的地城市的距离,以便他们旅行。
该应用程序的工作是找到数据库中已经存在的最接近用户需要旅行的始发地和目的地的任何/所有旅行。
我最初的想法是找到数据库中所有原始城市,这些城市位于用户所需原点的半径范围内,然后使用该记录集在数据库中的目标城市中搜索用户所需半径范围内的任何/所有城市目的地。
我还需要一个体面的(最好是免费的......低预算项目)API,它可以帮助查找城市的地理位置并执行实际的半径计算......我想。
即使接近最佳选择,我还想做什么?看起来最困难的部分是找到数据库中所有现有的城市,这些城市位于用户所需城市的半径范围内 - 这对于更简单的查询只是“查找半径为X的所有城市”有点麻烦市”。
所以,KINDA就像Uber一样,除了Uber司机正在决定旅行参数是什么,用户只需要知道哪些优步司机来自/离用户最近的地方(在指定日期,开机)。
目前,用户只是在州一级查找事件 - 从BC到纽约,并阅读一系列数据查看游乐设施以找到最接近他们需要的数据。
提前致谢,对于聪明人可能有的任何聪明见解!
答案 0 :(得分:1)
Declare @DriverLat float = 41.744068
Declare @DriverLng float = -71.315024
Declare @Within int = 20
Select *
From (
Select Distinct
A.ZipCode
,A.CityName
,A.StateCode
,Miles = [dbo].[udf-Geo-Calc-Miles] (@DriverLat,@DriverLng,A.Lat,A.Lng)
From [dbo].[ZipCodes] A
Where CityType = 'D'
and ZipType = 'S'
) A
Where Miles <= @Within
Order By Miles
返回
UDF
CREATE Function [dbo].[udf-geo-Calc-Miles] (@Lat1 float,@Lng1 float,@Lat2 Float,@Lng2 float)
Returns Float as
Begin
Declare @Miles Float = (Sin(Radians(@Lat1)) * Sin(Radians(@Lat2))) + (Cos(Radians(@Lat1)) * Cos(Radians(@Lat2)) * Cos(Radians(@Lng2) - Radians(@Lng1)))
Return Case When @Miles is null then 0 else abs((3958.75 * Atan(Sqrt(1 - power(@Miles, 2)) / @Miles))) end
End