Извиняюсь если не в тот раздел добавил тему... Пробовал загуглить данный вопрос, но ничего на форуме не нашел... Собсно есть задача посчитать расстояние между 2-мя точками. Известны GPS координаты (wgs-84) обеих точек - широта, долгота, высота. Получены от навигатора Garmin. Перевожу в плоские координаты по формуле из (ГОСТ Р 51794-2008): Код: double alpha_wgs = 1 / 298.257223563; double a_wgs = 6378137; double B = data.getLat() * Math.PI / 180; double L = data.getLon() * Math.PI / 180; double N, e_kv; e_kv = 2 * alpha_wgs - alpha_wgs * alpha_wgs; N = a_wgs / Math.sqrt(1 - e_kv * Math.sin(B) * Math.sin(B) ); x = (N + data.getHeight()) * Math.cos(B) * Math.cos(L); y = (N - data.getHeight()) * Math.cos(B) * Math.sin(L); z = ( (1 - e_kv) * N + data.getHeight()) * Math.sin(B); Я правильно понимаю, что расстояние я могу считать как в декартовых координатах? Т.е. dist2 = (x1 - x2)2 + (y1 -y2)2 + (z1 - z2)2 Или так нельзя считать? Пробовал также формулу Винсенте для расчетов, разница получилась 0.1 метра. Т.е. вроде верить можно...
Если то, в принципе, можно и не переводить на плоскость. Всё равно точность может оказаться в десятки метров. А зачем Вам это надо? Может есть другие более точные способы определения расстояний.
Возможно, но измерений много, так что точность плавает, это не проблема. помимо неточных есть достаточно точных данных. Гуглил долго, все что нашел по измерению расстояний непосредственно по географическим координатам - формула Винсенте. Способы возможно и есть, но я о них не знаю :) По крайней мере когда есть обычный gps навигатор. Буду рад любым советам ;)
Ну, если цель работы - государственная тайна, тогда Вы правильно понимаете. Но чем больше расстояние, тем данная линия будет больше отличаться от прямой.
расстояния до 150км, т.е. в пределах одной зоны... тогда как правильно считать расстояние в плоской проекции гаусса-крюгера с wgs84 сферой? или как наиболее точно посчитать расстояние, зная широту, долготу, высоту?
А причём здесь одна зона? Сейчас такие расчёты вручную делают только студенты, остальные давно пользуются геодезическими калькуляторами. Расчёт с их помощью не хуже первых сантиметров и самая большая проблема - определение координат. Если нужна большая точность, надо использовать геодезические методы определения.
Если сообщите для каких собственно целей нужно это измерить расстояние, то сразу станет ясно что для этого вам поможет. Может просто обойтись измерением расстояния между точками в MapSource от Garmin. --- Сообщения объединены, 24 ноя 2014, Оригинальное время сообщения: 24 ноя 2014 --- Но эта точность 0,1 м. не имеет отношения к точности определения исходных координат точек навигатором Garmin.
vulko Расстояния в прямоуголке и на эллипсоиде немного разные т.к. а) в географических координатах расстояние обычно считается по дуге большого круга (кратчайшее расстояние на "глобусе"); б) метр в прямоуголке и метр на дуге большого круга отличаются, есть такое понятие как масштаб проекции (который ещё и изменяется, собака, при удалении от центрального меридиана) При расстоянии 120км и точности Гармина - считайте любым методом какой Вам проще.
Плохо гуглили. Вам сюда - http://www.iogp.org/pubs/373-07-2.pdf P.S. Маленький вопрос - а зачем Вам нужно отображать WGS в проекции Гаусса-Крюгера?
На самом деле интересует не расстояние которое можно проехать на машине или пройти пешком по земной поверхности, т.е. не дуга, а интересует прямое расстояние. Ну например приделал человек к своему радиоуправляемому вертолету gps приемник и хочет узнать расстояние между его глазом и вертолетиком. Если я правильно понимаю, то считая по гостовским формулам, которые приводил в первом сообщении, я получаю расстояние по дуге, что не совсем то что нужно... --- Сообщения объединены, 25 ноя 2014, Оригинальное время сообщения: 25 ноя 2014 --- Мне нужно посчитать расстояние по прямой между 2-мя точками в пространстве, причем известны только их GPS координаты. Расстояние именно по прямой, а не по прямой в плоской проекции. Я бы может и рад не пользоваться Гаусс Крюгером, но т.к. я совсем не геодезист, то не знаю что делать :)
С такой постановкой задачи всё стало понятнее - как раз по приведенным формулам вы посчитаете геометрическую прямую (slope distance), то что вам надо. Ещё важное замечание, из-за которого все мы были сбиты с толку - у вас приведены не формулы плоской проекции Гаусса-Крюгера, а перевод в пространственные координаты XYZ. Т.е. формулы вы нашли правильные, но тему назвали неправильно.
Понятно, спасибо. Сейчас вот заметил какой момент. Начинаю обсчитывать расстояния между 2-мя точками. Если у одной точки высота 0 метров или 200 метров, а удаление от второй точки 11 000 метров, получаю разницу расстояний (для высоты 0 и 200 метров) 58 метров. Что-то не то получается...
Написано на жабе Код: public void getDiff() { double lat = 56.3311999384; double lon = 43.9033720549; double alt = 2000; GaussCoords point = convertGps2Gauss(lat, lon, alt, 0); double b = 56.0 + 13.0 / 60 + 53.67 / 3600; double l = 43.0 + 56.0 / 60 + 15.33 / 3600; GaussCoords eyeCoords1 = convertGps2Gauss(b, l, 200, 0); GaussCoords eyeCoords2 = convertGps2Gauss(b, l, 0, 0); double dist1 = getDistance(eyeCoords1, point); double dist2 = getDistance(eyeCoords2, point); double diff = Math.abs(dist1 - dist2); System.out.println(diff); } public GaussCoords convertGps2Gauss(double lat, double lon, double h, int nzone) { double alpha_wgs = 1 / 298.257223563; double a_wgs = 6378137; double B = lat * Math.PI / 180; double L = lon * Math.PI / 180; double N, e_kv; double x, y, z; e_kv = 2 * alpha_wgs - alpha_wgs * alpha_wgs; N = a_wgs / Math.sqrt( 1 - e_kv * Math.sin(B) * Math.sin(B) ); x = (N + h) * Math.cos(B) * Math.cos(L); y = (N - h) * Math.cos(B) * Math.sin(L); z = ( (1 - e_kv) * N + h) * Math.sin(B); return new GaussCoords(x, y, z); } private double getDistance(GaussCoords point1, GaussCoords point2) { double dist = (point2.getX() - point1.getX()) * (point2.getX() - point1.getX()) + (point2.getY() - point1.getY()) * (point2.getY() - point1.getY()) + (point2.getZ() - point1.getZ()) * (point2.getZ() - point1.getZ()); return Math.sqrt(dist); } public class GaussCoords { private double x; private double y; private double z; public GaussCoords() { x = 0; y = 0; z = 0; } public GaussCoords(double _x, double _y, double _z) { x = _x; y = _y; z = _z; } public double getX() { return x; } public double getY() { return y; } public double getZ() { return z; } };
Для начала Вам необходимо четко определиться, какое расстояние между двумя точками Вы планируете получить: 1. Расстояние на физической поверхности Земли. 2. Расстояние приведенное на поверхность еллипсоида. 3. Расстояние в какой либо проекции. Как говорили коллеги выше, это будут разные расстояния. P.S. Обычно WGS принято отображать в проекции UTM, а не в Гаусса-Крюгера.
У меня получилось точно 33.00 метра (11471.07-11438.07 = 33.00) Вычисления легко проконтролировать вручную по теореме Пифагора. А если учесть, что сумма внутренних углов A и B чуть больше 180° (на 11295.37/6378000 радиан) то зелёненькую цифирь можно ещё и уточнить. И аккурат получится 11437.90 + ½×(11295.37/6378000)×200 м = 11438.08 м.
Мне без разницы что и как делать. Для меня важно получить наиболее точное расстояние между 2-мя точками по прямой. Не по поверхности земли, эллипсойда или ещё чего-то. Просто расстояние по прямой между 2-мя объектами, для которых известны gps координаты. --- Сообщения объединены, 25 ноя 2014, Оригинальное время сообщения: 25 ноя 2014 --- Все классно, но на этой картинке AB я не знаю. Знаю только расстояние в плоской проекции, а там AB превратиться в дугу. Учитывая что расстояния достаточно большие, пренебречь этим и сделать вид что это прямая будет неверно...
vulko Нет у вас плоской проекции Гаусса-Крюгера, во всех функциях замените в названиях вместо "Gauss" напишите "XYZ" и забудьте название Гаусс-Крюгер, UTM и т.д., они в ваших расчетах вообще не участвуют. Например convertGps2Gauss превратится в convertGps2XYZ Соответственно дуги в ваших расчетах тоже нет. [x1,y1,z1]->[x2,y2,z2] - абсолютно прямая линия. stout уже привел табличку с пересчетом из географических Lat-Lon-Height в картезианские XYZ, оттрассируйте свою функцию и проверьте правильно ли она переводит координаты. Засада может оказаться где угодно, например из-за микса в выражениях целочисленных констант и double величин.
Да в общем-то, и я это расстояние не знал, пока не вычислил по теореме Пифагора. А гипотенузу взял из точных вычислений координатного калькулятора. Это просто пример, как "на пальцах" можно проконтролировать точные вычисления. Ну и чему оно равно? Неверное утверждение. Если речь идёт о горизонтальных расстояниях, то с относительной точностью 1:1 000 000 участок Земли диаметром 22 км можно считать плоским. Чёрт! Я пренебрёг этим, показал что школьная геометрия вполне работает и результат совпадает с точными вычислениями до сантиметра, а вы не верите числам? Во-во… chnav вам дело говорит. Хотя, на первый взгляд, описок не увидел.
Вот смотрите. Перевожу координаты точек A и B и C. Значения x, y, z точно такие же как и в калькуляторе вашем. А вот когда считаю расстояние как AB2 = (xa - xb)2 + (ya - yb)2 + (za - zb)2 получается 11293,6 Какие формулы используют для расчета AB?