2010-02-09 3 views
1

J'ai une table avec:villes et la distance par latitute-longitude

ville latitude longitude

Et je besoin d'une requête SQL pour connaître toutes les villes sont à 100 miles de New York.

Quelqu'un pourrait-il m'aider avant que je devienne fou?

+0

BTW, je vous le conseil fortement d'accepter des réponses à vos questions. Sinon, les gens ne vous aideront pas beaucoup. Jetez un oeil à vos questions et acceptez les réponses qui vous ont aidé à résoudre votre problème. –

Répondre

2

Voici la nôtre. Vous devrez peut-être le modifier pour votre structure de table. Le nôtre regarde vers le haut des emplacements de vente au détail (et des agréments), pas des villes, mais la partie dure est la "plus proche par la distance" qui fonctionne dans cette déclaration.

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 

Edit - ajoutée (désolé d'avoir manqué ces à l'origine)

-- 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

S'il existe plusieurs enregistrements potentiels (ce qui affecterait l'efficacité de la requête), vous devez élaguer les résultats dans le rectangle de délimitation du point de référence (NYC), puis effectuez la formule de distance pour voir si une ville candidate se trouve dans la distance circulaire. – wallyk

+0

Qu'est-ce que 'dbo.XAxis (latitude, longitude)'? Avez-vous défini une fonction 'XAxis'? (De même pour YAxis et ZAxis) –

+0

@Ortwin Gentz ​​- mis à jour ma réponse. Merci d'avoir fait remarquer cela. J'ai oublié d'inclure ceux. – David

Questions connexes