為照片添加地理信息
背景
作者患強迫症。電腦上的照片須按照時間、設備分門別類存放,並且需要添加必要的標籤,例如地理位置標籤(以下簡稱GeoTag)。手機拍到的照片,已經通過iCloud同步到了電腦里,而且帶有GeoTag;沒有GPS模塊的相機拍到的照片,通過SD卡導入電腦之後,要手動添加GeoTag. macOS自帶的Photos添加GeoTag的過程按說是很人性化的,基本流程是:
- 點選需要添加GeoTag的照片
- 右鍵或雙鍵呼出上下文菜單,Get Info
- Add location文本框里用地址名稱描述地理位置,例如「某大街幾號」等等
其中,第3步需要系統調用LBS(基於地理位置的服務,Location-based service),將描述性語言,轉換為坐標。提供這一服務的,國內有高德,國外有谷歌。macOS的Maps應用提供了與這些LBS提供者的介面,並且根據當前的位置(猜測應該是根據IP地址推斷),來確定使用哪個介面。這樣一來,問題就來了。在境外,使用谷歌提供的服務,寫「北京市海淀區某大街幾號」,可以準確定位到;在北京,使用高德提供的服務,寫境外地址,大概率定位到境內某些名字很洋氣的花園、購物村、小區……
所以,以前我添加境外地址時,先改個IP,騙過系統,讓系統用谷歌服務介面,就萬事大吉了。強迫症患者的內心十分熨帖。
需求
由於動輒改全局路由的NAT IP地址太麻煩,作者前段時間更換了上網策略,只在某些特定的路由表裡用NAT. 另外,作者也覺得改IP騙過系統只為了用某個不在本地的LBS實在是很不自然,很不和諧。於是,作者希望手動解析出需要添加的GeoTag的坐標(經度、緯度、海拔),然後添加到照片中。這樣,就與系統使用什麼LBS無關。
觸發
作者剛隨團從荷蘭代爾夫特回北京(此處略去蹭@太空精釀啤酒的過程不表),在荷蘭一路匆匆,沒來得及整理影音及文字資料,回北京才得閑整理資料並豐富出訪總結,驟然發現借團長單反拍的照片都沒有GeoTag,這還得了?系統自帶的Photos不好用,也堅決不想僅僅為了一個小功能,增加不必要的軟體,網上搜了一圈,也沒有適合的小命令行工具,只好自己寫了一個。
方案
寫了兩個小腳本,地址:pigsboss/toolbox
- SetGeoTags.py:將緯度(必要)、經度(必要)、海拔高度(可選)信息插入指定照片文件;
- GetGeoTags.py:檢查指定照片文件的上述信息。
使用方法:
- 用谷歌地圖或者其他工具,解析給定地址的地理位置坐標,例如4.000000E, 50.000000N(東經4度,北緯50度);
- 按照SetGeoTags.py的命令格式"python SetGeoTags.py lat long alt filename"將上述信息添加到文件里。
如果有批量文件,用bash的for循環即可。
推薦閱讀:
※Python有哪些黑魔法?
※巧用抓包 ― 爬遍SCU玻璃杯事件所有神回復
※如何用100行Python代碼做出魔性聲控遊戲「八分音符醬」
※發現了新大陸,忍不住現在就要告訴你!
※10分鐘python圖表繪製 | seaborn入門(四):回歸模型lmplot