NMEAコードで読み書きするファイルだけでなく、GPS情報を抽出します

まず、NMEAコードであるかを理解するために、良い説明を直接処理していない、そこにあります

http://www.gpsbaby.com/wz/nmea.html

まず、GPS情報が含まれているテキストの行を見つけるために、すべての、それはどこ行の文字列であるGPGGA

$ GPGGA、052551.00,3409.341502、N、10853.663318、E、1,05,1.2,459.4、M、-28.0、M ,, * 4E

実用的な工学的用途では、(屋内GPSで情報を得ることができなくなり、このようなデバイスのような)様々な理由であることができる、リアルタイムでGPS情報が正確で完全な値を得ることができない、GPS.logファイルに、いくつかあるだろう不完全なGPS情報。

GPGGA ,,,,,, ,,,,,,,, * 0 $ 66  //これは屋内で私のGPSの位置情報であります

そうするために、完全なテキスト行の有無を判断することは情報がGPGGA、N / S、W /確認しなければならないGPS E 3つの文字列が存在しています次いで、緯度の位置特定、値を抽出することができます。

次のようにコードがあります

#includeは<sys / types.h>に
する#include <SYS / stat.h> 
の#include <ERRNO.H> 
する#include <unistd.h> 
の#include <fcntl.h> 
する#include <stdio.hに> 
する#include <メモリ.H> 
の#include <STDLIB.H> 
の#include <string.hの> 

の#define FILE_PATH "/home/mr_han/code/exp/GPS.log" 
の#define READ_MAX 150 
の#define GPS_DATA 15 
の#define GPS_KEY "GPGGA" 
の#define BOOLチャー
の#define真1つ
の#define偽0 
ボイドgps_cal(ダブルP、文字Q、INT *角度、フロート*分)//将原始GPS信息转换为度分形式
{ 
	*角= P / 100。		
	*分=(P- *角* 100)/ 60。

} 
INT Search_comma(チャー* pを、 
	} 
	戻りL; 
} 
/ *は、ファイルCからの完全なGPS情報を見つけ、パラメータは、ファイルパスであった(名)、緯度、経度、緯度、経度* / 
BOOLのget_gps_data(CONSTのchar * file_nameに、ダブル* P、二重* Q、CHAR *経度、チャー*緯度)
{ 
	CHAR * RW = NULL; 
	= 0のint LOCATION、I = 0、N = 0、S = 0、E = 0、W = 0である; 
	[READ_MAX] read_line_buffをCHAR、 GPS [GPS_DATA]; 
	のmemset(GPS、0、GPS_DATA); 
	FILE * FD =のfopen(FILE_PATH、 "R&LT")、
	IF(FD == NULL)
	{ 
		のprintf( "ファイルを開くエラー\ N-!"); 
		偽に戻ります。
	} 
	一方(FEOF(FD)!)
	{ 
		memsetの(read_line_buff、0、READ_MAX); 
		RW =関数fgets(read_line_buff、READ_MAX、FD); //各列の読み出し、ファイルから
		IF(RW == NULL)
			偽に戻ります。
		(!STRSTR(read_line_buff、GPS_KEY)= NULL)IF 
		{ 

			N =(?strchr(read_line_buff、 'N')== NULL 0 :. 1); 
			S =(strchr(read_line_buff、 'S')== NULL 0:? 2); 
			E =(strchr(read_line_buff、 'E')== NULL 0 :. 4);? 
			Wは== NULL 0 =(strchr(read_line_buff、 'Wは')である:7); / 
			I = N + S + ; Wは+ Eである
			の種類を決定するために、異なる重みの4つの組み合わせに、/ *完全なGPS情報のみ可能緯度経度のNEで、それぞれNW経度緯度、SEの経度緯度、経度緯度SW、 * / 
			//関数を呼び出すスイッチ(I)の代わりにケースGOTO文を使用することができる
			{ 
				ケース5:
					*経度= 'E'; 
					*緯度= 'N'、
					I = 0; 
					FCLOSE(FD)、
					後藤NE; 
				場合。6:
					*経度= 'E'; 
					*緯度= 'S'; 
					I = 0。
					FCLOSE(FD)。
					GOTO SE; 
	、一方(read_line_buff [位置+ 1] = 'N'!)
				。ケース8:
					*経度= 'Wは'; 
					*緯度= 'N'、
					I = 0; 
					FCLOSE(FD)、
					GOTO NW; 
				ケース9:
					*経度= W 'は'; 
					*緯度= 'S'; 
					I = 0。
					fcloseを(FD); 
					GOTO SW; 
				デフォルトは:続行; 
			} 
		} 
	} 
NE:
	RW = strchr(read_line_buff、 'N'); //最初の引数でstrchr二番目のパラメータファンクション文字列を探し、見つけリターンリターン空見つからないアドレス
	read_line_buff - -位置= RW 1; // アドレスは、デジタルを得るために減算、この工程は、主にフロントコンマ緯度、$ GPGGA、052551.00,3409.341502、N N LOCATION即ち前カンマに標的化されます
	位置= Search_comma(read_line_buff、場所) ; // その後、コンマ見つけるためにGPS情報に前方に位置する 
	* P = atof(GPS)を、
		GPS [I ++] = read_line_buff [LOCATION ++]; 
	のmemset(GPS、0、GPS_DATA); 
	I = 0; 
	。LOCATION = LOCATIONの+ 3; // 3409.341502、N、10853.663318、E、緯度の割り当てが完了し、Nフロントコンマのうち位置単純に立ち直ると経度情報が3で見つけることができます
	しばらく(read_line_buff = 'E' [LOCATIONの+ 1]!)
		GPS [I ++] = read_line_buff [LOCATION ++]; 
	* Q = atof(GPS); 
	trueに戻ります。

SE:
	; RWはstrchr(read_line_buff、 'S')を= 
	1 - read_line_buff - LOCATION = RW; 
	LOCATION = Search_comma(read_line_buff、LOCATION);	 
	一方(read_line_buff [LOCATIONの+ 1] = 'S'!)
		GPS [I ++] = read_line_buff [LOCATION ++ ]; 
	* P = atof(GPS)
	のmemset(GPS、0、GPS_DATA); 
	I = 0; 
	場所所在地+ = 3。
	一方、(read_line_buff [位置+ 1] = 'E'!) 
	RW = strchr(read_line_buff、 'S')。
		GPS [I ++] = read_line_buff [位置++]。
	* Q = atof(GPS)。
	trueを返します。
NW:
	RW = strchr(read_line_buff、 'N')。
	場所= RW - read_line_buff - 1。
	位置= Search_comma(read_line_buff、位置)	
	一方、(read_line_buff [位置+ 1] = 'N'!)
		GPS [I ++] = read_line_buff [位置++]。
	* P = atof(GPS)。
	memset(GPS、0、GPS_DATA)。
	I = 0; 
	位置=場所+ 3。
	一方、(read_line_buff [位置+ 1] = 'W'が!)
		gpsの[I ++] = read_line_buff [位置++]。
	* Q = atof(GPS)。
	trueを返します。
SW:
	場所= RW - read_line_buff - 1。		
	位置= Search_comma(read_line_buff、位置)
	しばらく(read_line_buff [LOCATIONの+ 1] = 'S'!)
		GPS [I ++] = read_line_buff [LOCATION ++]; 
	* P = atof(GPS); // atof文字列の後に二重の機能が戻る、それ以外の戻り0変換すべき
	memsetの(GPS、0、GPS_DATA); 
	I = 0; 
	LOCATION = LOCATIONの+ 3;。
	しばらく(read_line_buff [ロケーションの+ 1] = 'Wは'!)
		GPS [I ++] = read_line_buff [LOCATION ++]; 
	* Q = atof(GPS) ; 
	trueに戻る; 

} 
のchar *印刷(Pチャー)
{ 
	スイッチ(P)
	{ 
		ケース'S':リターン"南緯"; 
		ケース'S':リターン"南緯"; 
		ケース'N':リターン"緯度"。
		ケース「N」:リターン「緯度」、
		ケースW「が」:リターン「経度」、
		ケース「W」:リターン「経度」。 
		デフォルト:リターン「エラーマトリックス」; 
	} 
		ケース「E」:リターン「西」;
		ケース「E」:リターン「西经」。
} 
int型のmain()
{ 
	int型の角= 0。
	= 0分フロート。
	= 0チャー経度、緯度= 0。
	二重gps_g = 0、gps_i = 0; // gps_g经度gps_i纬度
	get_gps_data(FILE_PATH、&gps_i、&gps_g、&経度、及び緯度)。
	printf( "GPS:%LF%C、%LF%C \ n"は、gps_i、緯度、gps_g、経度)。

	/ * gps_cal(gps_g、経度、および角度、&分)。
	printf( "%sの%D%度F分"、プリント(経度)、角度、分)。
	gps_cal(gps_i、緯度、&角度、&分)。
	printf( "%sの%D%度F分\ n"は、プリント(緯度)、角度、分); * / 
	gps_cal(gps_i、緯度、&角度、&分)。
	printf( "%sの%D%度F分"、プリント(緯度)、角度、分)。
	printf( "%sの%D%度F分\ n"は、プリント(経度)、角度、分)。
	0を返します。
}

  結果は以下のとおりであります

 

検査情報ファイル部分を取り付けるGPS.log

$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,3,1,10,10,49,322,50,12,15,119,40,20,78,352,49,25,09,151,39*7F
$GPGSV,3,2,10,32,28,272,48,14,13,260,,15,25,063,,21,41,203,*7B
$GPGSV,3,3,10,24,51,053,,27,,,*49
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,20,78,352,49,25,09,151,38*7E
$GPGSV,3,2,11,32,28,272,47,14,13,260,,15,25,063,,21,41,203,*75
$GPGSV,3,3,11,24,51,053,,27,,,,40,,,36*49
$GPGGA,052550.00,3409.338831,N,10853.658643,E,1,04,1.4,467.2,M,-28.0,M,,*43
$GPVTG,1.5,T,4.6,M,0.3,N,0.6,K,A*20
$GPRMC,052550.00,A,3409.338831,N,10853.658643,E,0.3,1.5,121218,3.1,W,A*25
$GPGSA,A,2,10,12,20,32,,,,,,,,,1.6,1.4,0.9*39
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,29,15,25,063,30*77
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,33,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052551.00,3409.341502,N,10853.663318,E,1,05,1.2,459.4,M,-28.0,M,,*4E
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052551.00,A,3409.341502,N,10853.663318,E,0.0,1.5,121218,3.1,W,A*27
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,30*7F
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,33,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052552.00,3409.340891,N,10853.662052,E,1,05,1.2,462.9,M,-28.0,M,,*42
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052552.00,A,3409.340891,N,10853.662052,E,0.0,1.5,121218,3.1,W,A*2E
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,27*79
$GPGSV,3,2,11,20,78,352,49,21,41,203,20,24,51,053,31,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052553.00,3409.340173,N,10853.661041,E,1,05,1.2,465.3,M,-28.0,M,,*4A
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052553.00,A,3409.340173,N,10853.661041,E,0.0,1.5,121218,3.1,W,A*2B
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,50,12,15,119,41,14,13,260,30,15,25,063,27*79
$GPGSV,3,2,11,20,78,352,49,21,41,203,20,24,51,053,32,25,09,151,39*7D
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052554.00,3409.339925,N,10853.660214,E,1,05,1.2,466.6,M,-28.0,M,,*4D
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052554.00,A,3409.339925,N,10853.660214,E,0.0,1.5,121218,3.1,W,A*2A
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,31,15,25,063,28*77
$GPGSV,3,2,11,20,78,352,49,21,41,203,21,24,51,053,32,25,09,151,39*7C
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052555.00,3409.340026,N,10853.659458,E,1,05,1.2,466.2,M,-28.0,M,,*48
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052555.00,A,3409.340026,N,10853.659458,E,0.0,1.5,121218,3.1,W,A*2B
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,28*76
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,32,25,09,151,39*7F
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052556.00,3409.339490,N,10853.658951,E,1,05,1.2,465.8,M,-28.0,M,,*40
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25

 

おすすめ

転載: www.cnblogs.com/area-h-p/p/10940854.html