Это не так просто.Вы не можете вообще использовать евклидово расстояние.Вот как я думаю, вы могли бы сделать это:
Правильный путь
Правильный способ сделать это - вычислить расстояние по большому кругу (кратчайшее расстояние пешком по поверхности), котороеЯ никогда не понимал, но это довольно легко гуглить (и Адамк уже дал вам ссылку на него).
Ленивый путь
Предположим, что ваши очки не слишком близко к полюсам ичто они рядом друг с другом.Тогда вы можете использовать широту и долготу, как если бы они были евклидовыми координатами.(это в основном какая-то цилиндрическая проекция ).Тогда 1 градус широты будет (earth_circumference / 360) длинным, а 1 градус долготы будет (cos (lat) * earth_circumference / 360) длинным.
полный код будет выглядеть примерно так:
double distance_lazy(double lat1, double lon1, double lat2, double lon2){
double xDist = (lat2 - lat1) * EARTH_CIRCUMFERENCE / 360.0;
double yDist = cos(lat1) * (lon2 - lon1) * EARTH_CIRCUMFERENCE / 360.0;
return sqrt(xDist^2 + yDist^2);
}
Если ваши расстояния будут всего в нескольких километрах друг от друга, это должно работать довольно хорошо для всей Европы ... что-то в этом роде.
Способ "странного определения"
Еще одна вещь, которую вы можете сказать, это то, что «расстояние» - это прямая линия длины между точками, даже если она проходит сквозь землю.Тогда это станет вычислением трехмерных координат точки, а затем их евклидова расстояния
double distance_straight_line(double lat1, double lon1, double lat2, double lon2){
double x1 = cos(lat1) * cos(lon1) * EARTH_RADIUS;
double y1 = sin(lat1) * cos(lon1) * EARTH_RADIUS;
double z1 = sin(lon1) * EARTH_RADIUS;
double x2 = cos(lat2) * cos(lon2) * EARTH_RADIUS;
double y2 = sin(lat2) * cos(lon2) * EARTH_RADIUS;
double z2 = sin(lon2) * EARTH_RADIUS;
return sqrt((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2);
}
И снова это будет работать, как и ожидалось, для точек, близких друг к другу, на этот раз они могут быть где угодно в мире.Если вы дадите ему очки далеко друг от друга, результат будет правильным, но бесполезным, если вы не очень хорошо копаете).
Надеюсь, это поможет.