Вычисление расстояния между двумя точками по теореме Пифагора [закрыто]

Я хотел бы создать функцию, которая вычисляет расстояние между двумя парами широты / долготы, используя теорему Пифаг вместо формулы большого круга хаверсин. Поскольку это будет на относительно коротких расстояниях (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
 Michael Haren03 нояб. 2009 г., 03:07
Лучшая цитата: "Я спросил в интернете и непридумать что-нибудь полезное. "
 user03 нояб. 2009 г., 03:08
Определенно использую это для моего генератора цитат для моего сайта.
 uadrive04 нояб. 2011 г., 01:11
Отличная цитата действительно. Я нашел отличную связь со всеми различными уравнениямиРассчитать расстояние
 Michael Haren03 нояб. 2009 г., 03:08
Я предлагаю вам сделать свой лучший выстрел, и мыоттуда пойду (опубликуйте что у вас так далеко!)

Ответы на вопрос(3)

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

x = r*sin(lat)*cos(long)
y = r*sin(lat)*sin(long)
z = r*cos(lat)

гдеr это радиус сферы. или что-то подобное в зависимости от того, как вы определяете широту / долготу. Если у вас есть две координаты XYZ, просто используйтеsqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2), Вы действительно можетепросто используйте двумерную теорему Пифагора, поскольку вам необходимо получить разумные двухмерные координаты, что сложно.

 Ewan Todd03 нояб. 2009 г., 03:40
Конечно, стоило бы сравнить результат этого подхода с моими двумерными пифагорами с cos (lat). Вы можете получить более приемлемые результаты, как это.
 ToolmakerSteve24 нояб. 2018 г., 19:02
@EwanTodd - Я думаю, что для сферы ваш подход (два расстояния вдоль поверхности, рассматриваемый как прямоугольный треугольник) приводит кверхний оценка правильного ответа (расчетное расстояние слишком велико, если значительнои то и другое широта и долгота), тогда как прямой трехмерный расчет здесь, представляющий собой прямую линию внутри сферы, приводит книже связаны. Не сразу видно, что ближе или при каких обстоятельствах.

 которая обозначает разницу у и разницу х. Вы просто вычисляете различия по обеим осям, получая квадратный корень обеих разностей, возведенный в квадрат согласно теореме (сумма обмана равна квадрату двух других сторон).

var dx:Number = x1-x2;
var dy:Number = y1-y2;
var distance:Number = Math.sqrt(dx*dx + dy*dy);

Надеюсь, это достаточно ясно

Решение Вопроса

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

Предположим, вы находитесь в точке (lat0, long0) и хотите узнать расстояние до точки (lat1, long1) в "единицы широты ".

Горизонтальное (EW) расстояние примерно

d_ew = (long1 - long0) * cos(lat0)

Это умножается на cos (lat0) для учета линий долготы, сближающихся на высокой широте.

Вертикальное (NS) расстояние легче

d_ns = (lat1 - lat0)

Таким образом, расстояние между двумя точками

d = sqrt(d_ew * d_ew + d_ns * d_ns)

Вы можете уточнить этот метод для более сложных задач, но этого должно быть достаточно для сравнения расстояний.

Фактически, для сравнения расстояний будет хорошо сравнить d в квадрате, что означает, что вы можете опустить операцию sqrt.

 ToolmakerSteve24 нояб. 2018 г., 18:50
Незначительная корректировка: заменить* cos(lat0) с* cos(average(lat0, lat1)), Дает немного лучшее приближение к расстоянию.
 Ewan Todd03 нояб. 2009 г., 04:39
ХОРОШО. Позволять'Попробуйте это в Google:2 * pi * 3959 / 360  Похоже на то'с 69,0975851 миль. Сохраняйте как можно больше значимых цифр до самого последнего шага. И ты выигралнайти термин "единицы широты " где-то еще я придумал термин. Итак, если ваши lat и long указаны в градусах, умножьте d сверху на это число, чтобыприближенный расстояние в милях. 0,0023 * 69,0975851 миль = 0,158924445 миль. Округлите его с точностью до 0,0023, ис 0,16 миль. Дон»судитесь со мной, если он немного отличается от того, что вы ожидали.
 Ewan Todd03 нояб. 2009 г., 03:30
cakeforcerberus, вы суровый мастер заданий. Есть несколько причин, почему это не так просто. Во-первых, Земля не сфера. Вы можете получить приблизительную оценку, делая вид, что это сфера. Вы можете понять, что "единица широты " это расстояние, которое соответствует одному градусу широты. Тот's 2 * pi * R / 360.0, где R - радиус Земли. Чтобы получить более точную оценку, модель быстро усложняется.
 cakeforcerberus03 нояб. 2009 г., 03:50
чертовски сжатые сфероиды! : D Можете ли вы объяснить это для меня, пожалуйста? Если я возьму идеальную сферу и получу расстояние 0,0023 в широтных единицах, я смогу получить мили, делая что?
 cakeforcerberus03 нояб. 2009 г., 03:19
из любопытства, если я получу горизонтальное расстояние, есть ли способ преобразовать это в км?с или мили?
 James Black03 нояб. 2009 г., 03:16
++ 1 - твой проще, чем мой, поэтому я удалил свой.
 cakeforcerberus03 нояб. 2009 г., 03:17
отлично, спасибо: D

Ваш ответ на вопрос