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)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top