Как найти расстояние от широты и долготы двух мест?

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

Не это лучше для программиста, использующего Ваш API для получения сообщения открытым текстом, что его код является поддельным путем катастрофического отказа его вместо того, чтобы скрыть его?

21
задан ArK 27 November 2012 в 05:13
поделиться

7 ответов

Формула Хаверсина предполагает, что Земля сферическая. Однако форма уха более сложная. Модель сплющенного сфероида даст лучшие результаты.

Если такая точность необходима, вам лучше использовать обратную формулу Винсенти . Подробнее см. http://en.wikipedia.org/wiki/Vincenty's_formulae . Используя его, вы можете получить точность 0,5 мм для модели сфероида.

Не существует идеальной формулы , поскольку реальная форма Земли слишком сложна, чтобы ее можно было выразить формулой. Более того, форма Земли изменяется из-за климатических явлений (см. http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html ), а также изменяется со временем из-за вращения

Вы также должны отметить, что описанный выше метод не принимает во внимание высоту и предполагает сплюснутый сфероид на уровне моря.

Редактировать 10 июля 2010 г .: Я обнаружил, что есть редкие ситуации, для которых обратная формула Винсенти не сходится с заявленной точностью. Лучше использовать GeographicLib (см. http: // sourceforge.

32
ответ дан 29 November 2019 в 06:51
поделиться

Эта ссылка содержит всю необходимую информацию, либо на ней, либо по ссылке.

1
ответ дан 16 October 2019 в 04:15
поделиться

Вот один: http://www.movable-type.co.uk/scripts/latlong.html

Использование формулы Хаверсина:

R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c 
9
ответ дан 29 November 2019 в 06:51
поделиться

Вы ищете

формулу гаверсина

Формула гаверсинуса - это уравнение важно в навигации, давая расстояние по дуге между двумя точки на сфере из их долготы и широты. Это частный случай более общей формулы в сферической тригонометрии закон haversines, связывая стороны и углы сферических «треугольников».

4
ответ дан 29 November 2019 в 06:51
поделиться

Взгляните на это ... также есть пример javascript.

Найти расстояние

3
ответ дан 29 November 2019 в 06:51
поделиться
2
ответ дан 29 November 2019 в 06:51
поделиться

Примените формулу Гаверсина для нахождения расстояния. Смотрите приведенный ниже код C# для нахождения расстояния между двумя координатами. Еще лучше, если вы хотите, скажем, найти список магазинов в определенном радиусе, вы можете применить WHERE предложение в SQL или фильтр LINQ в C#.

Формула здесь в километрах, вам придется изменить соответствующие числа, и она будет работать для миль.

Например: Преобразовать 6371.392896 в мили.

    DECLARE @radiusInKm AS FLOAT
    DECLARE @lat2Compare AS FLOAT
    DECLARE @long2Compare AS FLOAT
    SET @radiusInKm = 5.000
    SET @lat2Compare = insert_your_lat_to_compare_here
    SET @long2Compare = insert_you_long_to_compare_here

    SELECT * FROM insert_your_table_here WITH(NOLOCK)
    WHERE (6371.392896*2*ATN2(SQRT((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
    , SQRT(1-((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
    ))) <= @radiusInKm

Если вы хотите выполнить формулу Гаверсина в C#,

    double resultDistance = 0.0;
    double avgRadiusOfEarth = 6371.392896; //Radius of the earth differ, I'm taking the average.

    //Haversine formula
    //distance = R * 2 * aTan2 ( square root of A, square root of 1 - A )
    //                   where A = sinus squared (difference in latitude / 2) + (cosine of latitude 1 * cosine of latitude 2 * sinus squared (difference in longitude / 2))
    //                   and R = the circumference of the earth

    double differenceInLat = DegreeToRadian(currentLatitude - latitudeToCompare);
    double differenceInLong = DegreeToRadian(currentLongitude - longtitudeToCompare);
    double aInnerFormula = Math.Cos(DegreeToRadian(currentLatitude)) * Math.Cos(DegreeToRadian(latitudeToCompare)) * Math.Sin(differenceInLong / 2) * Math.Sin(differenceInLong / 2);
    double aFormula = (Math.Sin((differenceInLat) / 2) * Math.Sin((differenceInLat) / 2)) + (aInnerFormula);
    resultDistance = avgRadiusOfEarth * 2 * Math.Atan2(Math.Sqrt(aFormula), Math.Sqrt(1 - aFormula));

DegreesToRadian - это функция, которую я создал на заказ, она представляет собой простую 1 подкладку из "Math.PI * угол / 180.0

Моя запись в блоге - SQL Haversine

5
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: