Вычисление расстояния между двумя точками с использованием теоремы Пифагора [закрыто]
Я хочу создать функцию, которая вычисляет расстояние между двумя парами широта/долгота, используя теорему pythag вместо гаверсинус большого круга формула. Поскольку это будет на относительных коротких расстояниях (3 км), я думаю, что эта версия, предполагающая плоскую Землю, должна быть в порядке. Как я могу это сделать? Я спросил в интернете и не придумал ничего полезного. :)
спасибо.
изменить:
вот что я придумал (кажется, работает):
def get_dist(lat0, lng0, lat1, lng1)
begin
d_ew = (lng1.to_f - lng0.to_f) * Math.cos(lat0.to_f)
d_ns = (lat1.to_f - lat0.to_f)
d_lu = Math.sqrt(d_ew.to_f * d_ew.to_f + d_ns.to_f * d_ns.to_f)
d_mi = ((2*Math::PI*3961.3)/360)*d_lu
return d_mi
rescue Exception => ex
logger.debug "[get_dist] An exception occurred: #{ex.message}"
return -1
end
end
3 ответов
вы можете использовать простой треугольник Пифагора, если вы ожидаете, что расстояния будут небольшими по сравнению с размером Земли.
Предположим, вы находитесь в (lat0, long0), и вы хотите знать расстояние до точки (lat1, long1) в "единицах широты".
горизонтальное (EW) расстояние примерно
d_ew = (long1 - long0) * cos(lat0)
это умножается на cos (lat0), чтобы учесть, что линии долготы становятся ближе друг к другу на высокой широте.
расстояние вертикали (НС) легче
d_ns = (lat1 - lat0)
таким образом, расстояние между двумя точками
d = sqrt(d_ew * d_ew + d_ns * d_ns)
вы можете уточнить этот метод для более сложных задач, но это должно быть достаточно хорошо для сравнения расстояний.
на самом деле, для сравнения расстояний, будет хорошо сравнить D в квадрате, что означает, что вы можете опустить операцию sqrt.
Ну, так как ваши точки находятся рядом друг с другом, поверхность сферы почти плоская, поэтому просто найдите координаты точек в 3D-пространстве, поэтому найдите (x,y,z) для каждой из точек, где
x = r*sin(lat)*cos(long)
y = r*sin(lat)*sin(long)
z = r*cos(lat)
здесь r
- радиус сферы.
или что-то в этом роде, в зависимости от того, как вы определяете lat/long. Как только у вас есть две координаты xyz, просто используйте sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)
. Вы действительно не можете просто использовать 2D-теоретик Пифагора, так как вам нужно будет получить разумные 2D-координаты, которые очень сложный.
вы обычно видите эту нотацию "dy, dx", которая означает разницу y и разницу x. Вы просто вычисляете различия на обеих осях, получая квадратный корень из обоих различий в квадрате согласно теоруму.(сумма шумихи равна квадрату двух других сторон).
var dx:Number = x1-x2;
var dy:Number = y1-y2;
var distance:Number = Math.sqrt(dx*dx + dy*dy);
надеюсь, это достаточно ясно