提取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; }