Die Entfernung zwischen zwei Orten mit Breite und Länge Art und Weise vor, was Google sagt,
-
05-07-2019 - |
Frage
Ich habe ein paar Tage damit verbracht, diese ein, um herauszufinden, und kann nicht scheinen, um die Probleme zu lokalisieren. Ich habe eine SQL 2005-Datenbank Speicher geografische Breite und Länge als Dezimal (18,8), die ich alle durch Abfragen Google erhalten.
Für diese beiden Standorte: From: 10715 Downs Pike Ste 100 MD 21740 an: 444 East College Ave Ste 120 State College PA, 16801
Unter Berücksichtigung wird, dass der Abstand sein ‚in der Luftlinie‘, meine Ergebnisse sind aus noch Art und Weise. In diesem Beispiel sagt mein Ergebnis 21,32 Meilen, aber Google Maps sagt 144 Meilen.
Ich denke, das Topping, die es noch frustrierend macht, ist, habe ich diese Seite gefunden: http://jan.ucc.nau.edu/~cvm/latlongdist.html und kam mit fast genau die gleichen Ergebnisse wie mich.
Hier sind meine Funktionen und Abfrage:
Funktionen: CalculateDistance
DECLARE @Temp FLOAT
SET @Temp = SIN(@Latitude1/57.2957795130823) *
SIN(@Latitude2/57.2957795130823) +
COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) *
COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823)
IF @Temp > 1
SET @Temp = 1
ELSE IF @Temp < -1
SET @Temp = -1
RETURN (3958.75586574 * ACOS(@Temp) )
LatitudePlusDistance
RETURN (SELECT @StartLatitude + SQRT(@Distance * @Distance / 4766.8999155991))
LongitudePlusDistance
RETURN (SELECT @StartLongitude + SQRT(@Distance * @Distance /
(4784.39411916406 *
COS(2 * @StartLatitude / 114.591559026165) *
COS(2 * @StartLatitude / 114.591559026165))))
Abfrage:
DECLARE @Longitude DECIMAL(18,8),
@Latitude DECIMAL(18,8),
@MinLongitude DECIMAL(18,8),
@MaxLongitude DECIMAL(18,8),
@MinLatitude DECIMAL(18,8),
@MaxLatitude DECIMAL(18,8),
@WithinMiles DECIMAL(2)
Set @Latitude = -77.856052
Set @Longitude = 40.799159
Set @WithinMiles = 50
-- Calculate the Max Lat/Long
SELECT @MaxLongitude = dbo.LongitudePlusDistance(@Longitude, @Latitude,
@WithinMiles),
@MaxLatitude = dbo.LatitudePlusDistance(@Latitude, @WithinMiles)
-- Calculate the min lat/long
SELECT @MinLatitude = 2 * @Latitude - @MaxLatitude,
@MinLongitude = 2 * @Longitude - @MaxLongitude
SELECT Top 20 *, dbo.CalculateDistance(@Longitude, @Latitude,
LocationLongitude, LocationLatitude) as 'Distance'
FROM Location
WHERE LocationLongitude Between @MinLongitude And @MaxLongitude
And LocationLatitude Between @MinLatitude And @MaxLatitude
And dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude) <= @WithinMiles
ORDER BY dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude)
Lösung
Warum sind Sie @Temp auf 1 oder -1 in Ihrer CalculateDistance Funktion zurückzusetzen?
Aktualisieren . Ok, nie die oben etwas dagegen. Sind Sie sicher, dass Ihre Breite / Länge ist richtig? Ich habe die folgende Berechnung unter Verwendung von geocoder.us :
10715 Downs Pike Ste 100, 21740 Rückgabe (39.607483, -77,753747)
444 E College Ave Ste 120 16801, Erträge (39,607483, -77,753747)
Ihre Formeln (gerundet auf 6 Nachkommastellen als dass die Genauigkeit ist zurückgekehrt oben) erhalten Sie die folgende:
sin(39.607483/57.295779) * sin(40.798594/57.295779)
+ cos(39.607483/57.295779) * cos(40.798594/57.295779)
* cos(77.753747/57.295779 - 77.856110/57.295779) = 0.99978299
3958.75586574 * arccos(0.99978299) = 82.4748331
was sinnvoll erscheint.