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?
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?
Peut-être que cela vous aide: http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
C'est une bonne introduction. Ou juste google pour mysql distance queries
, vous trouverez quelques tutoriels.
Si vous avez la possibilité et que vous voulez l'avoir plus facilement, passez à PostgreSQL qui prend en charge les requêtes de distance hors de la boîte.
merci beaucoup – xRobot
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
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
Qu'est-ce que 'dbo.XAxis (latitude, longitude)'? Avez-vous défini une fonction 'XAxis'? (De même pour YAxis et ZAxis) –
@Ortwin Gentz - mis à jour ma réponse. Merci d'avoir fait remarquer cela. J'ai oublié d'inclure ceux. – David
Vous avez besoin du lat long de NYC, ou de la ville que vous voulez analyser. puis mesurez simplement des miles entre les deux ensembles de coordonnées en utilisant les maths. Dans Excel, la formule est
getDistance(latitude1, longitude1, latitude2, longitude2)
https://gis.stackexchange.com/questions/88484/excel-distance-calculation
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. –