2013-04-08 7 views
5

Я ищу плавный способ вычисления расстояния между двумя точками GPS, поэтому я получаю результат, похожий на: «Вам нужно идти на x метров вверх и y метров влево - так что я могу работать с системой координат 2d, где у меня есть позиция (0,0), а другие позиции показывают расстояние в (x, y) в метрах от моего положения.Вычислить расстояние в (x, y) между двумя GPS-точками

Моя идея состояла в том, чтобы вычислить расстояние между точками, используя формулу гаверсинуса. (Это возвращает мою гипотенузу)

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

С этими двумя значениями я хотел использовать основные функции тригонометрии для решения моей проблемы.

Итак, я попытался вычислить: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse.

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

Итак, мой вопрос: как рассчитать расстояние в направлениях x и y между двумя точками GPS?

Я расчет альфа в следующем порядке:

public static double bearingTo(GPSBean point1, GPSBean point2) { 
    double lat1 = Math.toRadians(point1.latitude); 
    double lat2 = Math.toRadians(point2.latitude); 
    double lon1 = Math.toRadians(point1.longitude); 
    double lon2 = Math.toRadians(point2.longitude); 

    double deltaLong = lon2 - lon1; 

    double y = Math.sin(deltaLong) * Math.cos(lat2); 
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
      * Math.cos(lat2) * Math.cos(deltaLong); 
    double bearing = Math.atan2(y, x); 

    return (Math.toDegrees(bearing) + 360) % 360; 
} 
+0

как вы рассчитываете 'alpha'? – Barranka

+0

Я добавил метод для alpha;) – Frame91

+0

@Borian No. Это не дубликат, потому что мне не нужно прямое расстояние между этими двумя точками. Я знаю о формуле harversine, но мне нужно «ходить» в геометрии таксиса;) – Frame91

ответ

5

Я просто реализовать свой код, используя приблизительные координаты Нью-Йорка и Бостона в качестве ориентиров и применение формулы Haversine, как найти на http://www.movable-type.co.uk/scripts/latlong.html (который вам не показывать):

long1 = -71.02; lat1 = 42.33; 
long2 = -73.94; lat2 = 40.66; 

lat1 *=pi/180; 
lat2 *=pi/180; 
long1*=pi/180; 
long2*=pi/180; 

dlong = (long2 - long1); 
dlat = (lat2 - lat1); 

// Haversine formula: 
R = 6371; 
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2) 
c = 2 * atan2(sqrt(a), sqrt(1-a)); 
d = R * c; 

Когда я запускаю этот код, я получаю d = 306, что согласуется с ответом на указанном выше сайте.

Для подшипника я получаю 52 град - снова, рядом с тем, что дал сайт.

Не видя остальной части своего кода, трудно понять, почему ваш ответ отличается.

Примечание: если две точки близки друг к другу, вы можете сделать все виды приближений, но этот код должен работать - формула имеет хорошую численную стабильность, поскольку использует sin разницу между долготами, широтами (а не разница в грехе).

Добавление:

Использования кода для х, у (в вашем вопросе), я получаю разумные значения для расстояния - согласование с «правильным» ответом в пределах 120 м (что не плохо, так как один является приближением прямой, а другая - кривизной Земли). Поэтому я думаю, что ваш код в основном в порядке, теперь вы установили опечатку.

+0

Эй, спасибо. Я тоже сам тестировал это, после того как исправил опечатку и получил некоторые возможные значения. Возможно, это была только опечатка;) – Frame91

+0

@richard - спасибо за исправление ошибки! – Floris

+0

Добро пожаловать, @Floris :-) – Richard

2

Используйте гаверсинуса формулу для вычисления расстояния (в км) между двумя точками, определенных широты/долготы (в градусах) числовых

из: Haversine формулы - R. W.Синнотт, "добродетелей гаверсинуса"

Sky и телескоп, том 68, № 2, 1984

http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1

Пример использования от формы:

result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); 

JavaScript:

LatLon.distHaversine = function(lat1, lon1, lat2, lon2) { 
    var R = 6371; // earth's mean radius in km 
    var dLat = (lat2-lat1).toRad(); 
    var dLon = (lon2-lon1).toRad(); 
    lat1 = lat1.toRad(), lat2 = lat2.toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    return d; 
} 
Смежные вопросы