3

Я счетных расстояние в метрах между двумя значениями Lat Long - 40,1844441 -77.2252771 и
40,319166 -76,7880552SQL функции сервера ГЕОГРАФИЯ STDistance возвращается большая разница по сравнению с другими результатами испытаний

Я проверил расстояние между этими двумя пункты ниже двух веб-сайтов - http://www.nhc.noaa.gov/gccalc.shtml и http://www.movable-type.co.uk/scripts/latlong.html
Оба этих веб-сайта возвращают приблизительно 40014 метров.

Итак, я использую тип данных GEOGRAPHY для SQL-сервера, чтобы вычислить расстояние между этими двумя точками снова и он возвращает 48927 метров. Для меня это огромная разница.
Ниже приведен мой код, и любое предложение приветствуется.

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 
DECLARE @distance float 

set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)', 4326) 
set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)', 4326) 

SET @distance = @latlong1.STDistance(@latlong2) 
SELECT @distance -- this returns 48927 meters 

ответ

1

я тоже заметил, что некоторые странные результаты, поэтому я предпочитаю использовать географии :: Точка(), который, кажется, генерировать чистые результаты. Даже тогда опция 2 находится на расстоянии 80 метров от UDF, который, кажется, находится на месте.

Пример

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 

Set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)',4326) 
Set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)',4326) 

Select VeryOdd = @latlong1.STDistance(@latlong2) 
     ,SQLGeo = geography::Point(40.1844441, -77.2252771, 4326).STDistance(geography::Point(40.319166,-76.7880552, 4326)) 
     ,UDFGeo = [dbo].[udf-Geo-Meters](40.1844441,-77.2252771,40.319166,-76.7880552) 

Возвращает

VeryOdd    SQLGeo    UDFGeo 
48927.1485292471 40093.8055001913 40014.8833526855 

ОДС, если интересует

CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT) 
Returns Float as 
Begin 
    Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8 
    -- 6.371 mean radius of earth in meters 
End 
+0

John C: Я могу подтвердить свой UDFGE Результат соответствует 12 значащим цифрам, исходя из того, что земля представляет собой сферу радиуса 6371008,8 метра. –

+0

@JohnMachin Спасибо за дополнительные усилия и подтверждение –

+0

@JohnCappelletti - спасибо. Я также подтвердил использование «Сферического закона косинусов», которое именно вы рассчитали, и оно возвращает 40014.8833526855 метров. Да. Я использовал радиус земного шара как 6371008.8. – Shwe

0

Попытка числа оборотов используя лат и lon в случае «VeryOdd», то есть используйте POINT(-77.2252771 40.1844441) и POINT(-76.7880552 40.319166).

Мой автономный «сферический закон косинусов» составляет 48733 метра, что составляет всего лишь 0,4% от оригинального VeryOdd 48927 метров.

Предлагаю попробовать еще несколько тестов с разными латами и интервалами, а также проверить документы для соответствующих функций/методов.

Late новости: STGeomFromText ('POINT (долгота широта)' и т.д. - по сравнению с более частым протоколом: широта первая затем долгота

См выбранный ответ на этот вопрос: Create Geometry/Geography Field from Latitude & Longitude fields (SQL Server)

чтобы прояснить остающиеся разногласия, кому-то нужно искать какой радиус/радиусов/вызываются с помощью 4326 магии ...

Смежные вопросы