Расстояние между двумя местоположениями с использованием широты и Долготы значительно отличается от того, что говорит Google

StackOverflow https://stackoverflow.com/questions/1604298

Вопрос

Я потратил несколько дней, пытаясь разобраться в этом, и, похоже, не могу точно определить проблемы.У меня есть база данных SQL 2005, хранящая широту и долготу в десятичном виде (18,8), все из которых я получил, запросив Google.

Для этих двух местоположений: От:10715 Даунсвилл Пайк Ste 100 MD 21740 до:444 East College Ave Ste 120 Государственный колледж штата Пенсильвания, 16801

Принимая во внимание, что дистанция будет "как улетит ворона", мои результаты все еще далеки от идеала.В этом примере мой результат составляет 21,32 мили, но Google Maps показывает 144 мили.

Я думаю, что довершение, которое делает это еще более неприятным, - это то, что я нашел этот сайт: http://jan.ucc.nau.edu /~cvm/latlongdist.html и пришел к почти точно таким же результатам, как и я.

Вот мои функции и запрос:

Функции:Вычисленное расстояние

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

Широтноплюсовое расстояние

RETURN (SELECT @StartLatitude + SQRT(@Distance * @Distance / 4766.8999155991))

Продольное расстояние

RETURN (SELECT @StartLongitude + SQRT(@Distance * @Distance / 
    (4784.39411916406 * 
    COS(2 * @StartLatitude / 114.591559026165) * 
    COS(2 * @StartLatitude / 114.591559026165))))

Запрос:

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)
Это было полезно?

Решение

Почему вы сбрасываете @Temp на 1 или -1 в вашей функции CalculateDistance?

Обновить.Ладно, не обращайте внимания на вышесказанное.Вы уверены, что указываете правильную широту / долготу?Я вычислил следующее, используя geocoder.us:

10715 Даунсвилл-Пайк-Стрит, 100, 21740 возвращает (39.607483, -77.753747)

444 E Колледж-авеню Ste 120, 16801 возвращает (39.607483, -77.753747)

Используя ваши формулы (округленные до 6 цифр после запятой, поскольку это точность, возвращенная выше), вы получаете следующее:

  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

что кажется разумным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top