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