|
Несколько вопросов по обработке NMEA |
|
|
|
Jul 17 2011, 04:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Добрый день. $GPRMC,181057.000,A,5545.2389,N,03745.6063,E,0.47,74.50,190311,,,A*51 1. Подскажите пожалуйста, какое максимальное кол-во символов в следующих параметрах NMEA полученных от GPS-применика: а) Широта в) Долгота с) Скорость 2. Как можно рассчитать расстояние между 2-мя полученными координатами широты/долготы? Спасибо.
Сообщение отредактировал Alt.F4 - Jul 17 2011, 04:32
|
|
|
|
|
Jul 17 2011, 05:56
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
1) зачем вам символы - вырезайте между запятыми. Я в своём парсере так и делал. 2) Когда для диплома "навигатор" делал , сделал так: Поиск расстояния между 2 координатами. // Константы, используемые для вычисления смещения и расстояния const double D2R=0.017453; // Константа для преобразования градусов в радианы const double R2D=57.295781; // Константа для преобразования радиан в градусы const double a=6378137.0; // Основные полуоси const double b=6356752.314245; // Неосновные полуоси const double e2=0.006739496742337; // Квадрат эксцентричности эллипсоида const double f=0.003352810664747; // Выравнивание эллипсоида Код double DIST(double StartLat, double StartLong, double EndLat, double EndLong) { double fPhimean, // Средняя широта fdLambda, // Разница между двумя значениями долготы fdPhi, // Разница между двумя значениями широты fAlpha, // Смещение fRho, // Меридианский радиус кривизны fNu, // Поперечный радиус кривизны fR, // Радиус сферы Земли fz, // Угловое расстояние от центра сфероида fTemp, // Временная переменная, использующаяся в вычислениях Distance; // Вычисленное расстояния в метрах
unsigned char S[20];
// Вычисляем разницу между двумя долготами и широтами и получаем среднюю широту fdLambda=(StartLong - EndLong)*D2R; fdPhi=(StartLat - EndLat)*D2R; fPhimean=((StartLat + EndLat)/2.0)*D2R;
// Вычисляем меридианные и поперечные радиусы кривизны средней широты fTemp=1-e2*(pow(sin(fPhimean),2)); fRho=(a*(1-e2))/pow(fTemp, 1.5); fNu=a/(sqrt(1-e2*(sin(fPhimean)*sin(fPhimean)))); // Вычисляем угловое расстояние fz=sqrt(pow(sin(fdPhi/2.0),2)+cos(EndLat*D2R)*cos(StartLat*D2R)*pow(sin(fdLambda/2.0),2)); fz=2*asin(fz); // Вычисляем смещение fAlpha=cos(EndLat*D2R)*sin(fdLambda)*1/sin(fz); fAlpha=asin(fAlpha); // Вычисляем радиус Земли fR=(fRho*fNu)/((fRho*pow(sin(fAlpha),2))+(fNu*pow(cos(fAlpha),2))); // Получаем расстояние Distance=(fz*fR); return Distance; }; Вот так вычислял азимут (незнаю насколько правильно), весь смысл в формировании местной системы координат . осями которой являются хорды паралельные параллелям и меридианам: Код double Azimut(double StartLat, double StartLong, double EndLat, double EndLong) { double AZ; double OX,OY; unsigned char S[20]; OX=DIST(StartLat, StartLong, StartLat, EndLong); OY=DIST(StartLat, StartLong, EndLat, StartLong); if (StartLat<=EndLat) { if (StartLong<=EndLong) { AZ=atan(OX/OY)*R2D; } else { AZ=360-atan(OX/OY)*R2D; }; } else { if (StartLong<=EndLong) { AZ=180-atan(OX/OY)*R2D; } else { AZ=180+atan(OX/OY)*R2D; }; }; return AZ; }; ЗЫ С гуглоземлёй сходилось, точность не замерял - не было смысла - диплом , не коммерческий прожект. Кое где код можно оптимизировать ( И я молодой был и компилятор тупил)
Сообщение отредактировал MKdemiurg - Jul 17 2011, 09:03
|
|
|
|
|
Jul 17 2011, 07:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Цитата 1. Подскажите пожалуйста, какое максимальное кол-во символов в следующих параметрах NMEA полученных от GPS-применика: а) Широта в) Долгота с) Скорость 1) зачем вам символы Чтобы знать, сколько байт выделить в СОЗУ под это дело. Цитата 2) Когда для диплома "навигатор" делал , сделал так: Попробую на след.выходных...
Сообщение отредактировал Alt.F4 - Jul 17 2011, 07:11
|
|
|
|
|
Jul 17 2011, 07:48
|

Знающий
   
Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552

|
Цитата(Alt.F4 @ Jul 17 2011, 11:30)  Добрый день. $GPRMC,181057.000,A,5545.2389,N,03745.6063,E,0.47,74.50,190311,,,A*51 1. Подскажите пожалуйста, какое максимальное кол-во символов в следующих параметрах NMEA полученных от GPS-применика: а) Широта в) Долгота с) Скорость Я понимаю так, что количество символов не изменно, оно определено стандартом, символы либо есть, либо нет.
|
|
|
|
|
Jul 17 2011, 09:13
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(Alt.F4 @ Jul 17 2011, 11:11)  Чтобы знать, сколько байт выделить в СОЗУ под это дело. Ну так выделите больше. Я брал массив вырезал от запятой до запятой. Отделял градусы вотдельный массив из 3х(или 4 для долготы) байт. В конце вставлял /0 (определитель конца строки - ноль). Использовал массивы градусов и минут как входные переменные функции преобразования в число. На выходе получал double - вполне удовлетворительная точность (теоретически). Складывал градусы и доли градусов от преобразования минут. Цитата(sobr @ Jul 17 2011, 11:48)  Я понимаю так, что количество символов не изменно, оно определено стандартом, символы либо есть, либо нет. Изменно - в разных приёмниках бывает разное кол-во символов после десятичной точки.
Сообщение отредактировал MKdemiurg - Jul 17 2011, 09:57
|
|
|
|
|
Jul 17 2011, 14:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Ну так выделите больше. Насколько больше? Интересует конкретные цифры: - широта (вроде как 9 символов с точкой максимум) - долгота (аналогично, только 10. Хотя первый ноль можно исключить, мне до туда не доехать =) - скорость (5 с точкой максимум) Спасибо.
Сообщение отредактировал Alt.F4 - Jul 17 2011, 14:50
|
|
|
|
|
Jul 17 2011, 14:52
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(Alt.F4 @ Jul 17 2011, 18:43)  Насколько больше? Интересует конкретные цифры: - широта (вроде как 9 символов с точкой максимум) - долгота (аналогично, только 10) - скорость (5 с точкой максимум) Спасибо. Я брал так как вы и написали 9 и 10 (для долготы). Для уверенности ( так сказать чтобы парсер не "завис") можно вырезать ровно по 4 цифры после точки-разделителя. А вообще можно посчитать для конкретной точности, остальное отбрасывать.
|
|
|
|
|
Jul 17 2011, 19:34
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Брр,чот не так , подожь. 1,852км/ч/3600=0,514(4) м/с 0,514*0.01=0.00514м/с=5.14мм/с - НЕ? Цитата (0,01/1,852)км/ч = 0.0054 км/ч (0,01/1,852)км/ч = 0,01852 км/ч. Кароче неважно, без реперных точек и поправок такая точность невозможна.
Сообщение отредактировал MKdemiurg - Jul 17 2011, 19:39
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|