使用纬度/经度函数查询数据集以获得距离

时间:2011-05-06 14:57:52

标签: sql tsql sql-server-2008

早上好,

我正在开展一个工作项目,我陷入了一些僵局。我要做的是获取一份记录清单(记录包含商店的邮政编码,纬度和经度)并将它们放入最近的市场。

我有一个功能,可以比较2个zipcodes及其相关的纬度和经度,并获得距离。当一次输入1个记录时,该功能正常工作。

我想要做的是找出一种方法让这个功能一次完成给定的记录,并给我一些距离。

我目前拥有的是:

宣布@i int
从#unmatched2中选择@i = min(RowID) 声明@max int
从#unmatched2中选择@max = max(RowID),而@i< = @max 开始
从#unmatched2中选择Zipcode,Longitude,Latitude,其中RowID = @i

DECLARE @Lat1 float
DECLARE @Long1 float
DECLARE @Lat2 float
DECLARE @Long2 float

SELECT  @Lat1 = max(Latitude) from #unmatched2 
where   RowID = @i
SELECT  @Long1 = max(Longitude) from #unmatched2 
where   RowID = @i
SELECT  @Lat2 = max(Latitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
SELECT  @Long2 = max(Longitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
select ProgramManagement.dbo.CoordinateDistanceMiles(@Lat1, @Long1, @Lat2, @Long2)
set @i = @i + 1  end

@database是我用来获取rowcount的临时表。例如,在这种情况下,我使用#unmatched。

样本记录是:

 Zipcode, latitude , longitude 
 92101 , 32.7152778, -117.1563889 

输出只是一个距离的单个数字:

140.01 

因此临时表将有~1300条记录,输出将是每行的单个数字。

目前上面的工作正在进行,它正在通过整个表格,但我的输出结果是分开的。第一是:

Zipcode Longitude   Latitude
93510   -118.1824020000 34.4679410000

第二是:

Distance
134.035921098023

我需要做的只是结果列表1到最后而不是我目前得到的结果。有什么建议?或者结果如何:

Zipcode     Longitude       Latitude        Distance
93510       118.1824020000  34.4679410000   134.035921..

1 个答案:

答案 0 :(得分:0)

我认为您只是想找到#unmatched2表中每条记录到zipcode_lookup表中单条记录的距离。设置逻辑是一个简单的连接,然后只需在选择中执行距离计算。

SELECT u.RowID, u.Zipcode, u.Longitude, u.latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(u.Latitude, u.Longitude, z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z

这假设RowID是一个唯一标识符,如果没有,就是它上面的简单组...(这实际上更接近你的循环)

SELECT u.RowID, u.Zipcode,
    max(u.Longitude) Longitude, max(u.latitude) Latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(max(u.Latitude), max(u.Longitude), z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z
GROUP BY u.RowID, u.Zipcode