1. 程式人生 > >提取Exif資訊中GPS經緯度,轉化為double方法

提取Exif資訊中GPS經緯度,轉化為double方法

首先大致說下exif資訊。感謝百度百科君~

Exif是一種圖象檔案格式,它的資料儲存與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、型號、色彩編碼、拍攝時錄製的聲音以及全球定位系統(GPS)、縮圖等。

對於JPG圖片處理, 我所用的,都包含在DealExif.cpp中(下載地址在後面給出,也可以在去google),從檔名就能看出,這個檔案的內容主要用於處理JPG圖片的Exif資訊。

完整過程如下:

1.建立EXIFINFO類,接受被讀取JPG圖片的EXIF資訊。然後呼叫EXIF_Read()方法讀取指定路徑下JPG圖片。

EXIFINFO exifInfo;//建立EXIFINFO類
EXIF_Read(csName, &exifInfo);//讀取檔案,該方法包含在DealExif中,有兩個引數,第一個是JPG檔名。

2.EXIFINFO類中Latitude屬性是緯度,Longitude屬性是經度。得到的是CString型別,用度分秒錶示,如 28 59‘ 17.300000(注意28後面是空格分隔開來)。這顯然不方便使用,如果要使用GOOGLE MAP API或者 百度地圖 API中的方法,需要的引數經緯度是double型。

3.使用transToDouble方法(是我寫的,下面會給出)將exif中讀取出來的經度或緯度(CString型 度分秒錶示),轉化為double型。引數是CString型別的經度或緯度值,返回型別是double型的經度或緯度,如18.52 (度)。

PS:transToDouble()方法不能讀到秒的小數點以後,如28 59‘ 17.300000,只能將28 59’ 17 轉化出來。,從精確度上說略有欠缺,但據我簡單分析,即使在地球上的赤道,每一秒經度值實際距離最大的地方,也只有約30米。總體來說,精確度一般不超過10米,可以滿足大部分民用需要。

DealExif檔案下載地址:點選開啟連結

double CNewInsertDlg::transToDouble(CString exif)
{
	int length = exif.GetLength();
	int i = 0;	//用於迴圈字串的長度
	double result;	//儲存最後結果
	CString nTemp[100];	
	int degeree = 0; //度數位數
	int min = 0;	//分數位數
	int sec = 0;	//秒數位數
	while (i < length)
	{
		nTemp[i] = exif.Mid(i,1);	//提取字元
		
		if (nTemp[i] == " " && 1 == i)	//如果度數為一位數
		{
			degeree = 1;	//度數的位數
			switch(atoi(nTemp[i-1]))
			{
			case 1: 
				result = 1;
				break;
			case 2: 
				result = 2;
				break;
			case 3: 
				result = 3;
				break;
			case 4: 
				result = 4;
				break;
			case 5: 
				result = 5;
				break;
			case 6: 
				result = 6;
				break;
			case 7: 
				result = 7;
				break;
			case 8: 
				result = 8;
				break;
			case 9: 
				result = 9;
				break;
			case 0: 
				result = 0;
				break;
			}
		}
		else if(nTemp[i] == " " && 2 == i)//如果度數為兩位數
		{
			degeree = 2;
			switch(atoi(nTemp[i-1]))
			{
				case 1: 
				result = (atoi(nTemp[0]))*10 + 1;
				break;
			case 2: 
				result = (atoi(nTemp[0]))*10 + 2;
				break;
			case 3: 
				result = (atoi(nTemp[0]))*10 + 3;
				break;
			case 4: 
				result = (atoi(nTemp[0]))*10 + 4;
				break;
			case 5: 
				result = (atoi(nTemp[0]))*10 + 5;
				break;
			case 6: 
				result = (atoi(nTemp[0]))*10 + 6;
				break;
			case 7: 
				result = (atoi(nTemp[0]))*10 + 7;
				break;
			case 8: 
				result = (atoi(nTemp[0]))*10 + 8;
				break;
			case 9: 
				result = (atoi(nTemp[0]))*10 + 9;
				break;
			case 0: 
				result = (atoi(nTemp[0]))*10 + 0;
				break;
			}
		}
		else 
		{
			if(nTemp[i] == " " && 3 == i) //如果度數為三位數
			{
			degeree = 3;
			switch(atoi(nTemp[i-1]))
			{
				case 1: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 1;
				break;
			case 2: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 2;
				break;
			case 3: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 3;
				break;
			case 4: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 4;
				break;
			case 5: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 5;
				break;
			case 6: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 6;
				break;
			case 7: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 7;
				break;
			case 8: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 8;
				break;
			case 9: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 9;
				break;
			case 0: 
				result = (atoi(nTemp[0]))*100 +(atoi(nTemp[1])) * 10+ 0;
				break;
			}
			}	
		}

//分數轉化
		if (nTemp[i] == "'" && (degeree + 2) == i)	//如果分數數為一位數
		{
			min = 1;	//分數的位數
			switch(atoi(nTemp[i-1]))
			{
			case 1: 
				result = result + (1.0/60);
				break;
			case 2: 
				result = result + (2.0/60);
				break; 
			case 3: 
				result = result + (3.0/60);
				break;
			case 4: 
				result = result + (4.0/60);
				break;
			case 5: 
				result = result + (5.0/60);
				break;
			case 6: 
				result = result + (6.0/60);
				break;
			case 7: 
				result = result + (7.0/60);
				break;
			case 8: 
				result = result + (8.0/60);
				break;
			case 9: 
				result = result + (9.0/60);
				break;
			case 0: 
				result = result;
				break;
			}
		}
		else 
		{
			if(nTemp[i] == "'" && (degeree + 3) == i)//如果分數為兩位數
			{
			min = 2;
			switch(atoi(nTemp[i-1]))
			{
				case 1: 
				result = result + ((atoi(nTemp[i-2]))*10 + 1.0)/60;
				break;
			case 2: 
				result = result + ((atoi(nTemp[i-2]))*10 + 2.0)/60;
				break;
			case 3: 
				result = result + ((atoi(nTemp[i-2]))*10 + 3.0)/60;
				break;
			case 4: 
				result = result + ((atoi(nTemp[i-2]))*10 + 4.0)/60;
				break;
			case 5: 
				result = result + ((atoi(nTemp[i-2]))*10 + 5.0)/60;
				break;
			case 6: 
				result = result + ((atoi(nTemp[i-2]))*10 + 6.0)/60;
				break;
			case 7: 
				result = result + ((atoi(nTemp[i-2]))*10 + 7.0)/60;
				break;
			case 8: 
				result = result + ((atoi(nTemp[i-2]))*10 + 8.0)/60;
				break;
			case 9: 
				result = result + ((atoi(nTemp[i-2]))*10 + 9.0)/60;
				//result = 12;// + (5*10+ 9.0)/60;
				break;
			case 0: 
				result = result + ((atoi(nTemp[i-2]))*10+ 0.0)/60;
				break;
			}
			}
		}

		if (nTemp[i] == "." && (degeree + 1 + min + 2 + 1) == i)	//如果秒數為一位數
		{
			sec = 1;	//秒數的位數
			switch(atoi(nTemp[i-1]))
			{
			case 1: 
				result = result + 1.0/3600;
				break;
			case 2: 
				result = result + 2.0/3600;
				break;
			case 3: 
				result = result + 3.0/3600;
				break;
			case 4: 
				result = result + 4.0/3600;
				break;
			case 5: 
				result = result + 5.0/3600;
				break;
			case 6: 
				result = result + 6.0/3600;
				break;
			case 7: 
				result = result + 7.0/3600;
				break;
			case 8: 
				result = result + 8.0/3600;
				break;
			case 9: 
				result = result + 9.0/3600;
				break;
			case 0: 
				break;
			}
		}
		else
		{
			if(nTemp[i] == "." && (degeree + 1 + min + 2 + 2) == i)//如果秒數為兩位數
			{
			min = 2;
			switch(atoi(nTemp[i-1]))
			{
			case 1: 
				result = result + ((atoi(nTemp[i-2]))*10 + 1.0)/3600;
				break;
			case 2: 
				result = result + ((atoi(nTemp[i-2]))*10 + 2.0)/3600;
				break;
			case 3: 
				result = result + ((atoi(nTemp[i-2]))*10 + 3.0)/3600;
				break;
			case 4: 
				result = result + ((atoi(nTemp[i-2]))*10 + 4.0)/3600;
				break;
			case 5: 
				result = result + ((atoi(nTemp[i-2]))*10 + 5.0)/3600;
				break;
			case 6: 
				result = result + ((atoi(nTemp[i-2]))*10 + 6.0)/3600;
				break;
			case 7: 
				result = result + ((atoi(nTemp[i-2]))*10 + 7.0)/3600;
				break;
			case 8: 
				result = result + ((atoi(nTemp[i-2]))*10 + 8.0)/3600;
				break;
			case 9: 
				result = result + ((atoi(nTemp[i-2]))*10 + 9.0)/3600;
				break;
			case 0: 
				result = result + ((atoi(nTemp[i-2]))*10 + 0.0)/3600;
				break;
			}
			}
		}

		
		i++;
		
	}
	return result;
}