Я использую API Google Maps v3 в своем проекте java. Мне нужно найти евклидову расстояние между двумя точками. Но когда я использую обычную формулу для вычисления евклидова расстояния, результат как-то ошибочен:
Например:
Скажем, у меня есть два очка Нью-Йорк (43.2994285, -74.2179326) и Стокгольм (59.3293235, 18.0685808), и я хочу рассчитать евклидово расстояние для этих двух точек:
двойное расстояние = Math.sqrt(Math.pow(43.2994285 - 59.3293235, 2) + Math.pow(-74.2179326 - 18.0685808, 2)); расстояние = 93.66834091217483
результат явно ошибочен.
Тогда я понял, что начальная координата не является (0,0), как в декартовой системе координат. На самом деле, это было 51 ° 28 '38 "N, 0 ° 00' 00" з.д. (WGS 84). Референтной точкой является Greenwich (51.4825766, -0.0076589).
Таким образом, процедура вычисления новых координат такова:
Нью-Йорк (51.4825766 - 43.2994285 |, | -0. 0076589- (-74.2179326) |) = Нью-Йорк (8.1831481, 74.2102737)
Стокгольм (| 51.4825766 - 59.3293235 |, | -0.0076589 - 18.0685808 |) = Стокгольм (7.8467469, 18.0762397)
А затем примените формулу для евклидова расстояния. Мой вопрос - это правильный подход, и есть ли другой способ сделать это?
Вам нужно использовать формулу Хаверсина, чтобы вычислить расстояние между большими точками между двумя точками - то есть самое короткое расстояние над земной поверхностью - см. Описание http://www.movable-type.co.uk/scripts/latlong.html
Альтернативно (цитата отсюда), если вам нужно использовать евклидову дистанцию
Если две точки находятся рядом друг с другом, например, в одном городе, оценка большого круга с прямой в пространстве широты долготы приведет к минимальной ошибке и будет намного быстрее вычисляться. Незначительным осложнением является тот факт, что длина градуса долготы зависит от широты: градус долготы охватывает экватора на 111 км, но половина - на 60 ° северной широты. Регулировка для этого проста: умножьте долготу на косинус широты. Тогда вы можете просто взять евклидово расстояние между двумя точками и умножить на длину градуса:
distance(lat, lng, lat0, lng0):
deglen := 110.25
x := lat - lat0
y := (lng - lng0)*cos(lat0)
return deglen*sqrt(x*x + y*y)
и, чтобы ускорить это, вы можете аппроксимировать вычисление cos, используя полиномиальное приближение.