2010-02-09 173 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