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

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

Для этих двух мест: От: 10715 Downsville Pike Ste 100 MD 21740 по: 444 East College Ave Ste 120 State College PA, 16801

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

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

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

Функции: 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))))

Запрос:

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)

person Mikecancook    schedule 21.10.2009    source источник
comment
Другой сайт, на который вы связались, относится к 1997 году, когда Земля была намного меньше, чем сегодня (из-за центробежной силы). Я бы пошел с Google по этому поводу. :)   -  person MusiGenesis    schedule 22.10.2009
comment
Да-да, до Google мир был намного меньше. Но это не помогает мне выбрать правильное расстояние.   -  person Mikecancook    schedule 22.10.2009
comment
Я нашел другой сайт для расчета результатов, и он такой же, как и я, 21 миля с некоторыми изменениями. movable-type.co.uk/scripts/latlong.html попробуйте эти местоположения: долгота / широта 40.799159, -77.856052 40.22018, -78.140205   -  person Mikecancook    schedule 22.10.2009
comment
Хорошо, ваши координаты определенно неверны. Взгляните на мое обновление ниже   -  person ChssPly76    schedule 22.10.2009


Ответы (1)


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

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

10715 Downsville Pike Ste 100, 21740 возвращает (39.607483, -77.753747)

444 E College Ave 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

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

person ChssPly76    schedule 22.10.2009
comment
Хороший вопрос! Мне пришлось посмотреть, откуда я его взял, а именно здесь: blogs.lessthandot.com/index.php/DataMgmt/DataDesign/ Было объяснено, что это допускает ошибку округления, если результат был больше 1 или меньше -1. - person Mikecancook; 22.10.2009
comment
Меня интересовала точность, необходимая для этого. Я полагаю, что где-то читал, что вам следует использовать только 6 десятичных знаков, но объяснение не имело смысла, и теперь я не могу найти, где я его читал. Я использую Google для геокодирования. Результаты кажутся немного противоречивыми. Я просто не уверен, насколько непоследовательно важно. - person Mikecancook; 22.10.2009
comment
Итак, после еще нескольких поисков я нашел этот сайт: daftlogic.com/ projects-google-maps-distance-calculator.htm - который использует Google API для расчета расстояния и предлагает .... барабанную дробь .... 82,530! Итак, похоже, мне нужно выяснить, как получить более точные геокоды. - person Mikecancook; 22.10.2009
comment
@Temp используется в функции ACOS. ACOS вернет ошибку домена для любого значения меньше -1 или больше 1. Небольшие ошибки округления могут вызвать эти значения (и ошибку). - person George Mastros; 15.12.2009