精準地理定位)
現(xiàn)在的人們需要知道怎么用Java去讀取照片的地址、GPS的位置數(shù)據(jù), 還有做精確的定位, 這件事是數(shù)字圖像處理和地理信息系統(tǒng)這兩個領(lǐng)域交叉到一起的時候, 一個很重要的實際課題。它的最核心的部分, 是讓程序能夠解析數(shù)碼相機拍出來的那些照片里面, 所嵌進去的EXIFImage File這種元數(shù)據(jù)信息。EXIF這個標準, 是由JEITA也就是日本電子信息技術(shù)產(chǎn)業(yè)協(xié)會來制定的。它現(xiàn)在用得特別廣。主要在JPEG、TIFF這些主流的圖像格式里面都能見到。主要是用來存一些信息。比如拍攝設(shè)備是什么。還有拍攝的時間是什么時候?;蛘呤钱?dāng)時的環(huán)境參數(shù)有哪些。甚至還包括地理坐標這樣的豐富信息。這個項目選擇用Java語言做實現(xiàn)載體, 完整地覆蓋了從圖像文件加載, 到EXIF結(jié)構(gòu)解析, 再到GPS坐標提取的各個步驟, 接著是經(jīng)緯度格式轉(zhuǎn)換, 以及海拔高度解碼和拍攝時間標準化, 然后還有設(shè)備型號識別, 像素尺寸與比例計算, 直到最后實現(xiàn)地理定位可視化或者坐標反查的全流程, 該項目具有極強的工程實用性, 同時也擁有非常好的教學(xué)示范價值。從技術(shù)實現(xiàn)的角度來看, 這個項目是依靠一個成熟的開源元數(shù)據(jù)解析庫來實現(xiàn)的。這個庫能夠支持提取超過100種圖像格式、音頻格式和文檔格式的元數(shù)據(jù)信息。對于EXIF標準里的2.2版本和2.3版本來說, 它的兼容性表現(xiàn)得非常優(yōu)秀。這個機制的核心在于一層又一層地去解析JPEG文件里面的APP1標記段, 也就是第 1所說的內(nèi)容。這一段就是存放EXIF數(shù)據(jù)的地方, 它里面的內(nèi)容是用TIFF格式來組織的。這里面包含了IFD0, 也就是主圖像目錄,還包含擴展EXIF目錄和GPS信息目錄等等多個邏輯上的目錄。Java程序是借助.read()這個方法去加載數(shù)據(jù)的, 它僅僅是用于圖像的顯示, 或者是進行基礎(chǔ)性的校驗工作, 而真正關(guān)鍵的、核心的數(shù)據(jù)提取任務(wù)是完全通過那個.()方法完成的, 這樣做就直接避免了因為手動解析二進制結(jié)構(gòu)所導(dǎo)致的復(fù)雜性以及產(chǎn)生錯誤的風(fēng)險, 關(guān)于GPS信息的提取這一塊內(nèi)容則是尤為關(guān)鍵, 并且也是特別容易造成出錯的地方。在EXIF標準里面, GPS那些標簽, 比如說前面提到的空字符串和后面那個空字符串, 它們并不是直接把十進制的度數(shù)存進去的, 而是把度分秒這樣的三個數(shù)值組成一個叫做有理數(shù)的東西保存起來的, 像例子當(dāng)中顯示的緯度是39/1,51/1,2867/100, 這個數(shù)據(jù)實際上代表的含義就是39度51分28.67秒。項目必須實現(xiàn)高精度的DMS→ 轉(zhuǎn)換, 先要把各個分量都轉(zhuǎn)為浮點數(shù), 然后再按照DD D M/60 S/3600這樣的公式來算出結(jié)果, 還要根據(jù)N或者是S以及E或者是W來修正正號還是負號, 海拔高度同樣也需要結(jié)合判斷看這是否是為海平面以下的數(shù)值, Ref等于1的意思就是表示負值。此外, 在處理GPS測地基準的時候, 需要去注意那個默認值是“WGS-84”的這個隱式假設(shè), 從而確保后續(xù)的坐標是可以直接用于百度地圖、高德地圖或者是 Maps的API調(diào)用的。拍攝時間的提取是涉及時區(qū)以及標準化問題的, 因為EXIF 原始字段的格式是YYYY:MM:DD HH:MM:SS, 但是這里沒有攜帶時區(qū)信息, 不過它和組合在一起的話就可以提供更精確的UTC時間戳了。項目需要優(yōu)先把以秒為單位的當(dāng)日UTC時間和YYYY:MM:DD格式這個信息結(jié)合起來, 去還原出毫秒級別的UTC時間。然后再根據(jù)本地系統(tǒng)的時間, 或者用戶自己指定的時區(qū), 把時間轉(zhuǎn)換成本地時間。這么做就是為了避免出現(xiàn)因為相機時鐘有誤差, 或者是跨時區(qū)拍攝而導(dǎo)致的時間亂掉的情況。像設(shè)備信息里面的做這個廠商的這個Make, 還有型號的這個Model, 再一個就是固件版本, 還有旋轉(zhuǎn)方向這些東西的話, 它們就直接被映射到了對應(yīng)的那種類型的Tag上去。這一套東西是可以用來做設(shè)備的指紋分析, 或者是質(zhì)量溯源的。像素比例和圖像屬性解析這些事情, 雖然它不是地理定位的那個核心內(nèi)容, 但是它卻是完整性驗證的最關(guān)鍵的環(huán)節(jié)。這個項目需要提取包括每個圖像的像素寬高、DPI、單位以及壓縮類型、色彩空間在內(nèi)的這些相關(guān)信息, 并且這樣做不僅可以輔助判斷圖像的真實性怎樣, 比如說那些被偽造的照片通常會缺少合理的EXIF數(shù)據(jù)信息, 同時還能夠為后面的那些操作提供必要的參數(shù)依據(jù), 諸如圖像需要進行增強處理、生成縮略圖或者適配打印任務(wù)等等。特別是, 由那個相機所生成出來的EXIF信息, 常常會包含著一些屬于私有性質(zhì)的部分, 也就是我們所說的廠商注釋段, 這里面涵蓋了像快門速度、光圈值、ISO感光度還有白平衡模式等等這些非常專業(yè)的參數(shù)內(nèi)容, 這樣就支持通過相應(yīng)的機制來進行擴展解析的動作了, 從而在極大程度上提升了移動端設(shè)備在對影像進行分析時候的深度表現(xiàn)。本項目所附加的測試照片文件, 即那個名為-pic-gps.jpg的文件, 實際上是來自真實場景下的典型樣本材料。該照片數(shù)據(jù)當(dāng)中包含了經(jīng)度與緯度字段、海拔高度字段、方位角字段、衛(wèi)星數(shù)量字段以及DOP精度因子等字段的完整信息內(nèi)容。這些數(shù)據(jù)內(nèi)容與相關(guān)標準保持一致。在設(shè)備制造商字段里, 其值為空字符串形式。在手機型號字段里, 明確顯示為Mi 12 Pro字樣。以上情況充分證明了高端型號的設(shè)備產(chǎn)品對EXIF標準信息具有高保真度的支持狀態(tài)。當(dāng)開發(fā)者運行項目代碼之后, 他們可以非常直觀地去觀察到控制臺里輸出的那種有結(jié)構(gòu)的JSON數(shù)據(jù)或者表格化的元數(shù)據(jù)內(nèi)容。這些內(nèi)容包括經(jīng)度是116點零E, 緯度是39點零N, 海拔高度是48米2, 拍攝時間是2023年5月22日早晨8點14分33秒, 對應(yīng)的時區(qū)信息是東八區(qū)的08:00, 所使用的設(shè)備型號是Mi 12 Pro, 圖像的分辨率達到了4000乘以3000, 還有DPI的數(shù)值是72。在拿到這些信息以后, 開發(fā)者還可以進一步去調(diào)用高德地理編碼的API接口。通過這個接口可以把那些坐標進行逆向解析的操作, 最后能夠得到的結(jié)果是類似北京市朝陽區(qū)酒仙橋路10號這樣的具有實際意義的語義地址信息。這樣做的最終效果就是真的實現(xiàn)了從一個二進制字節(jié)開始到物理世界的一個全鏈路的貫通。這個本事在智慧安防里頭特別管用, 能讓監(jiān)控圖像的時空來源被追蹤清楚在數(shù)字取證領(lǐng)域也很重要, 能給證據(jù)鏈加上時間和地理的固定錨點在旅游社交方面也不小。它能讓那些打了卡的照片自動標記出具體位置還有無人機巡檢的時候也得靠它, 讓航拍圖像能夠進行空間配準。在這些各種各樣的場景里, 這東西都有著別的技能沒法替代的重要價值。所以說, 對于Java開發(fā)者來說, 這是他們?nèi)?gòu)建空間智能應(yīng)用的一個基礎(chǔ)性的、根本性的技能。