2010-02-09 174 views
1

我有一个表:城市和距离由latitute经度

城市 纬度经度

我需要一个SQL查询来了解所有城市都来自纽约100英里。

在我疯狂之前,有人能帮助我吗?

+0

顺便说一句,我强烈建议你接受回答您的问题。否则,人们不会帮你那么多。只要看看你的问题,并接受那些帮助你解决问题的答案。 – 2010-02-09 23:45:54

回答

2

这是我们的。您可能需要修改它的表结构。我们查找零售地点(和便利设施),而不是城市,但最难的部分是“在距离最近的地方”,这在本声明中起作用。

CREATE PROCEDURE [dbo].[GetNearbyLocations] @CenterLatitude FLOAT, @CenterLongitude FLOAT 
AS 

DECLARE @CntXAxis FLOAT 
DECLARE @CntYAxis FLOAT 
DECLARE @CntZAxis FLOAT 

SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 

SELECT LocationId, LocationName, Address, City, State, Zip, Phone, Latitude, Longitude, 
       hasATM, hasCarWash, hasDiesel, hasE85, is24hr, hasTrendar, hasWiFi, isTravelCenter, isMiniTravelCenter, isTruckerFriendly, hasScale, hasHotFood, 
       ProxDistance = 3961 * ACOS(dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) 
FROM Locations 
WHERE latitude IS NOT NULL 
ORDER BY ProxDistance ASC 
GO 

编辑 - 添加(对不起,我错过了这些原本)

-- USER-DEFINED FUNCTIONS 
-- XAxis ######################################### 
CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float) 
RETURNS float 
AS 
BEGIN 
    RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239))/180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239))/180 * @lon) 
END 

CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float) 
RETURNS float AS 
BEGIN 
RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239))/180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239))/180 * @lon) 
END 

CREATE FUNCTION [dbo].[ZAxis] (@lat float) 
RETURNS float AS 
BEGIN 
RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239))/180 * @lat) 
END 
+0

如果有很多潜在记录(这会影响查询效率),那么您会希望将结果修剪为参考点(NYC)的边界矩形内的结果,然后执行距离公式以查看候选城市是否在圆形距离。 – wallyk 2010-02-09 23:11:27

+0

什么是'dbo.XAxis(纬度,经度)'?你定义了一个'XAxis'函数吗? (类似于YAxis和ZAxis) – 2011-05-04 19:29:20

+0

@Ortwin Gentz - 更新了我的答案。谢谢你指出。我忘了包括那些。 – David 2011-05-04 19:36:59