Расстояние между двумя местоположениями с использованием широты и Долготы значительно отличается от того, что говорит Google
-
05-07-2019 - |
Вопрос
Я потратил несколько дней, пытаясь разобраться в этом, и, похоже, не могу точно определить проблемы.У меня есть база данных 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
что кажется разумным.