J'essaye de calculer la distance entre deux positions sur une carte. J'ai stocké dans mes données: Longitude, Latitude, X POS, Y POS.
J'ai déjà utilisé l'extrait ci-dessous.
DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
3956 * 2 * ASIN(
SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2)
+ COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)
* POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) ))
AS distance
--INTO #includeDistances
FROM #orig dest
Cependant, je ne fais pas confiance aux données qui en découlent, cela semble donner des résultats légèrement inexacts.
Quelques exemples de données au cas où vous en auriez besoin
Latitude Longitude Distance
53.429108 -2.500953 85.2981833133896
Quelqu'un pourrait-il m'aider avec mon code, cela ne me dérange pas si vous voulez réparer ce que j'ai déjà si vous avez une nouvelle façon d'y parvenir, ce serait génial.
Veuillez indiquer dans quelle unité de mesure se trouvent vos résultats.
sql
sql-server
tsql
math
sql-server-2008-r2
Waller
la source
la source
Réponses:
Puisque vous utilisez SQL Server 2008, vous disposez du
geography
type de données disponible, qui est conçu pour exactement ce type de données:Donne
En nous disant qu'il est à environ 538 km de (près de) Londres à (près) d'Édimbourg.
Naturellement, il y aura beaucoup d'apprentissage à faire en premier, mais une fois que vous le savez, c'est beaucoup plus facile que d'implémenter votre propre calcul Haversine; de plus, vous obtenez BEAUCOUP de fonctionnalités.
Si vous souhaitez conserver votre structure de données existante, vous pouvez toujours utiliser
STDistance
, en construisant desgeography
instances appropriées à l'aide de laPoint
méthode:la source
La fonction ci-dessous donne la distance entre deux géocoordonnées en miles
La fonction ci-dessous donne la distance entre deux géocoordonnées en kilomètres
La fonction ci-dessous donne la distance entre deux géocoordonnées en kilomètres à l' aide du type de données Géographie qui a été introduit dans SQL Server 2008
Usage:
Référence: Ref1 , Ref2
la source
On dirait que Microsoft a envahi le cerveau de tous les autres répondants et leur a fait écrire des solutions aussi compliquées que possible. Voici le moyen le plus simple sans fonctions / déclarations supplémentaires:
Il suffit de remplacer vos données au lieu de
LATITUDE_1
,LONGITUDE_1
,LATITUDE_2
,LONGITUDE_2
par exemple:la source
Comme vous utilisez SQL 2008 ou version ultérieure, je vous recommande de vérifier le type de données GEOGRAPHY . SQL a intégré la prise en charge des requêtes géospatiales.
par exemple, vous auriez une colonne dans votre table de type GEOGRAPHY qui serait remplie avec une représentation géospatiale des coordonnées (consultez la référence MSDN liée ci-dessus pour des exemples). Ce type de données expose ensuite des méthodes vous permettant d'effectuer toute une série de requêtes géospatiales (par exemple, trouver la distance entre 2 points)
la source
Usage:
sélectionnez dbo.DistanceKM (37.848832506474, 37.848732506474, 27.83935546875, 27.83905546875)
Les sorties:
0,02849639
Vous pouvez modifier le paramètre @R avec des flottants commentés.
la source
En plus des réponses précédentes, voici un moyen de calculer la distance à l'intérieur d'un SELECT:
Usage:
Les fonctions scalaires fonctionnent également, mais elles sont très inefficaces lors du calcul d'une grande quantité de données.
J'espère que cela pourrait aider quelqu'un.
la source