Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Код для геодезии 
:(
    Опции темы
gpepsi
Дата 3.7.2012, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



У меня есть координаты GPS-приемника в decimal-формате.
Есть направление и расстояние. Необходимо решить прямую геодезическую задачу (найти новую точку).

В геодезии ничего не понимаю, поэтому буду благодарен за объяснение либо код на C++.
PM MAIL   Вверх
EvilsInterrupt
Дата 3.7.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



>>В геодезии ничего не понимаю
Наверное я плохо в институте учился и нас программистов наверное с первого курса учат основам геодезии... Говорил мне папа "учись лучше в институте" не слушался ведь, пиво пил. )
PM MAIL WWW ICQ Jabber   Вверх
Zerstroer
Дата 3.7.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Цитата(gpepsi @  3.7.2012,  09:26 Найти цитируемый пост)
В геодезии ничего не понимаю
, мне кажется, задача сводится просто к нахождению новых координат, в таком случае, не стоит заморачиваться на геодезии, используйте декартовы координаты на плоскости. Аналитическая геометрия вроде как.


--------------------
In silico
PM MAIL ICQ   Вверх
gpepsi
Дата 3.7.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(Zerstroer @  3.7.2012,  13:02 Найти цитируемый пост)
 мне кажется, задача сводится просто к нахождению новых координат, в таком случае, не стоит заморачиваться на геодезии, используйте декартовы координаты на плоскости. Аналитическая геометрия вроде как. 

гл тогда нужно как-то перевести географические координаты в прямоугольные, а потом назад. 
А вот как перевести - не совсем понятно. 

Вроде с GPS идет WGS84, а переводить нужно в UTM (на сколько я понял читая статью в настоящее время smile)
PM MAIL   Вверх
Zerstroer
Дата 3.7.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Цитата(gpepsi @  3.7.2012,  11:04 Найти цитируемый пост)
Вроде с GPS идет WGS84, а переводить нужно в UTM (на сколько я понял читая статью в настоящее время ) 
  smile кто все эти люди?
Что именно вам возвращает GPS приёмник? Приведите значения, для примера.



--------------------
In silico
PM MAIL ICQ   Вверх
gpepsi
Дата 3.7.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(Zerstroer @  3.7.2012,  13:23 Найти цитируемый пост)
Что именно вам возвращает GPS приёмник? Приведите значения, для примера.

у меня координаты в decimal формате

например: 55.75224, 37.610106
PM MAIL   Вверх
Zerstroer
Дата 3.7.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



В каком виде получаете направление и расстояние? Приведите примеры, для наглядности.


--------------------
In silico
PM MAIL ICQ   Вверх
gpepsi
Дата 3.7.2012, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(Zerstroer @  3.7.2012,  13:30 Найти цитируемый пост)
В каком виде получаете направление и расстояние? Приведите примеры, для наглядности. 


расстояние я получаю из другого места - просто в метрах. Направление в градусах.

кстати - вроде что-то нашел
http://www.m0sand.com/netcode/GeoUTMConverter.cs
PM MAIL   Вверх
Zerstroer
Дата 3.7.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Цитата(gpepsi @  3.7.2012,  13:04 Найти цитируемый пост)
кстати - вроде что-то нашел

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


--------------------
In silico
PM MAIL ICQ   Вверх
borisbn
Дата 3.7.2012, 16:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Лови (давно писал, но за то проверено временем))) - 

Код
const double Pi = acos( -1.0 );
const double degree_2_rad = Pi / 180.0;
const double earthRadius = 6371210;
const double earthCircuit = 2 * Pi * earthRadius;

void coords_2_metres( double latitude, double longitude, double & x, double & y )
{
    x = longitude / 360.0 * earthCircuit * cos ( latitude / 180.0 * Pi );
    y = latitude  / 360.0 * earthCircuit;
}

void metres_2_coords( double x, double y, double & latitude, double & longitude )
{
    latitude = y * 360.0 / earthCircuit;
    longitude = x * 360.0 / earthCircuit / cos( latitude / 180.0 * Pi );
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
gpepsi
Дата 4.7.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



что-то ни один ни другой способ не дает правильных результатов.
Пусть у меня есть координаты: 55.756704, 37.6159, есть дирекционный угол = 45 и расстояние = 500м.

пересчитываю
x1=413138.17090900062
y1=6179869.1323119169

нахожу новые координаты
Код

double dx = distance * qSin (bearing);
double dy = distance * qCos(bearing);

double x2 = x + dx;
double y2 = x + dy;


x2=413563.62267126766
y2=6180131.7933063256

перевожу в географические: 55.759136, 37.622593. Отрисовываю на google-map.

Вроде расстояние похоже на правду, а вот угол не 45 градусов, а где-то 60. То есть есть либо погрешность вычислений, либо какая-то поправка.

PM MAIL   Вверх
borisbn
Дата 4.7.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Чего-то не сходится. X должен быть равен
413138.17090900062 + 500 * sin( 45 ) = 413138.17090900062 + 500 * 0.707 = 413138.17090900062 + 353.55 = 413491.72090900062
а у тебя
Цитата(gpepsi @  4.7.2012,  10:20 Найти цитируемый пост)
x2=413563.62267126766




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
gpepsi
Дата 4.7.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



я пробовал первым способом, который нашел.

Твоим способом так: 55.756704, 37.6159

x1=2353715.6242599613
y1=6200066.7948664576

x2=2354141.0760222282
y2=6200329.4558608662

и обратно: 55.75906, 37.62498

в результате расттояние не 500м, а 1км, а угол где-то 60-65

Добавлено @ 12:20
Причем проверил расстояние
Код

double DegToRad (double degrees)
{
    return (degrees / 180.0 * M_PI);
}

double AngularDistance (double lat1, double lon1, double lat2, double lon2)
{
    double latitude1  = DegToRad(lat1);
    double latitude2  = DegToRad(lat2);
    double longitude1 = DegToRad(lon1);
    double longitude2 = DegToRad(lon2);

    double dy = qAbs(longitude2 - longitude1);

    double temp1 = qCos(latitude2) * qSin(dy);
    double temp2 = qCos(latitude1) * qSin(latitude2) -
        qSin(latitude1) * qCos(latitude2) * qCos(dy);
    double numerator    = qSqrt(qPow(temp1, 2) + qPow(temp2, 2));
    double denominator    = qSin(latitude1) * qSin(latitude2) + 
        qCos(latitude1) * qCos(latitude2) * qCos(dy);
    return qAtan (numerator / denominator);
}

uint Distance(double lat1, double lon1, double lat2, double lon2)
{
    static const double radian = 6367444.6571225;
    double corner = AngularDistance(lat1, lon1, lat2, lon2);
    return uint(corner * radian);
}



получилось
498 м - для первого варианта
625 м - для второго варианта (большая погрешность)

З.Ы. А вот с углом проблема и в первом и во втором случае. У меня напрвление - истенное на север от 0 до 360.
Может как-то сетку карты нужно учитывать ?

Это сообщение отредактировал(а) gpepsi - 4.7.2012, 12:22
PM MAIL   Вверх
math64
Дата 4.7.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



код borisbn не учитывает что Земля сплюснута на полюсах - вместо cos() нужно немного другую функцию, а вместо earthCircuit использовать отдельные константы для длины экватора и меридиана. Растояние должно быть небольшое, при котором кривизну поверхности можно не учитывать.
PM   Вверх
math64
Дата 4.7.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



ксати, без учёта приплюстости растояние между двумя точками будет
acos(sin(y1)*sin(y2)+cos(y1)*cos(y2)*cos(x1-x2));
 (y - широта, x - долгота в радианах).

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.