自 2023 年 11 月 21 日起,以下記錄的地圖修復不再有效
有關當前狀態,請參閱問題#41。
自 2018 年 12 月 1 日起,Lightroom 非訂閱版本中的地圖功能停止運作。 Adobe 建議購買 Lightroom CC 訂閱(120 美元/年)或將 GPS 座標複製並貼上到您最喜歡的搜尋引擎(哈哈!)。
該項目恢復了遺失的功能,無需訂閱 Lightroom CC。
為了實現這一目標,我們將修改 Lightroom 以使用我們自己的 Google 地圖 API 金鑰而不是 Adobe 的。雖然我們需要向 Google 訂閱,但訂閱包含每月 200 美元的免費使用積分,這對於 Lightroom 地圖模組的臨時用戶來說應該足夠了。
此過程需要中高階 IT 技能。錯誤可能會破壞 Lightroom 的安裝!如果您不知道自己在做什麼,請向指定的 IT 支援人員尋求協助。我們不是您的 IT 支援人員!
保密您的 Google 地圖 API 金鑰
未能保護您的 Google 地圖 API 金鑰可能會導致您的 Google Cloud 帳戶產生意外費用。
保固無效!我們不對損壞您的 Lightroom 安裝負責。我們不對您的 Google Cloud 帳戶產生的任何費用負責。
此過程是在 Windows 10 上使用 Lightroom 6.14 開發和測試的。
用戶報告說,這也適用於:
目前,該補丁不適用於 Lightroom 5.x(問題 #8)或 Lightroom 7.x(問題 #10)。如果您在這些版本上取得任何進展,請透過在未決問題中發表評論來告知我們。
非常感謝!感謝所有為研究和回饋做出貢獻的人!
您需要建立您的個人 Google 地圖 API 金鑰來取代 Adobe 的。
本指南的第一部分將引導您完成整個過程。如果您還沒有 Google Cloud 帳戶,這還包括建立帳戶並輸入結算詳細資訊。
前往 API 和服務 > 庫並按類別 > 地圖進行篩選。
選擇以下API並點選啟用:
由於 Lightroom 僅呼叫兩個 API,因此請將 Google Maps API 金鑰限制為所需的服務,以限制濫用風險。
Google Cloud 每個月的免費使用積分應該足以滿足 Lightroom 地圖模組的隨意使用。為了避免意外,您應該設定預算或配額。當超出配置的金額時,預算將發送電子郵件警報,而配額將關閉 API。
我們建議配置 1 美元的預算和 10% 的首次警報。透過這種配置,如果您花費的自有資金超過 10 美分,Google 就會向您發送電子郵件。
如果 Lightroom 仍在運行,請立即關閉它。
找到 Lightroom 的應用程式文件,然後尋找名為Location.lrmodule
的檔案。這是 Lightroom 地圖模組。製作該文件的備份副本並將其保存在安全的地方。
位置和檔案名稱可能會因作業系統和 Lightroom 版本而異。
C:Program FilesAdobeLightroomLocation.lrmodule
/Applications/Adobe Lightroom/Adobe Lightroom.app
,請右鍵點選並選擇「顯示包內容」 。地圖模組是/Contents/PlugIns/Location.agmodule
。重要:如果將備份副本保留在原始資料夾中,則必須變更檔案副檔名(例如,從 Location.lrmodule 變更為 Location.lrmodule_bak)。否則,Lightroom 仍可能會擷取該檔案而不是修補後的檔案。
在Windows上,使用Resource Hacker提取我們需要修補的Lua資源:
Location.lrmodule
LUA
部分LOCATIONMAPVIEW.LUA
上,右鍵點選並選擇儲存 bin 資源AGREVERSEGEOCODESERVICE.LUA
上,右鍵並選擇儲存 bin 資源LOCATIONDEBUGPANEL.LUA
上,右鍵點選並選擇儲存 bin 資源在 Mac 上,可以在Location.agmodule
中直接存取 Lua 檔案:
Location.agmodel
並選擇顯示包內容/Contents/Resources/
LocationMapView.lua
、 AgReverseGeocodeService.lua
和LocationDebugPanel.lua
複製到所需的位置進行修補如果尚未安裝 Python 3,請安裝。
該專案提供的 Python 腳本 patchluastr.py 使您能夠替換 Lua 檔案中的某些字串。
對於 LocationMapView 和 AgReverseGeocodeService,請使用 Python 腳本 patchluastr.py 將 Adobe 的金鑰替換為您的個人 Google Maps API 金鑰:
.bin
結尾,否則 Resource Hacker 在下一步中將找不到它。如下執行patchluastr.py
,將{your-api-key}
替換為您的 Google API 金鑰(不含大括號): patchluastr.py LOCATIONMAPVIEW.LUA "client=gme-adobesystems" "key={your-api-key}" -o LOCATIONMAPVIEW.tmp
patchluastr.py LOCATIONMAPVIEW.tmp "3.12" "3.51" -o LOCATIONMAPVIEW.bin
patchluastr.py AGREVERSEGEOCODESERVICE.LUA "client=gme-adobesystems" "key={your-api-key}" -o AGREVERSEGEOCODESERVICE.bin
orignal-name.lua.bak
。然後執行patchluastr.py
,如下所示,將{your-api-key}
替換為您的 Google API 金鑰(不含大括號): patchluastr.py LocationMapView.lua.bak "client=gme-adobesystems" "key={your-api-key}" -o LocationMapView.lua.tmp
patchluastr.py LocationMapView.lua.tmp "3.12" "3.51" -o LocationMapView.lua
patchluastr.py AgReverseGeocodeService.lua.bak "client=gme-adobesystems" "key={your-api-key}" -o AgReverseGeocodeService.lua
透過檔案 LocationDebugPanel,使用 Python 腳本 patchluastr.py 停用簽章檢查:
patchluastr.py LOCATIONDEBUGPANEL.LUA "nature" "street" -o LOCATIONDEBUGPANEL.bin
patchluastr.py LocationDebugPanel.lua.bak "nature" "street" -o LocationDebugPanel.lua
如果執行 patchluastr.py 失敗並出現類似TypeError: unsupported operand type(s)
錯誤,請確保您已安裝 Python 3。如果安裝了多個版本的 Python,則可以透過在命令前加上python3
前綴來明確使用 Python 3 運行腳本:
python3 patchluastr.py {original-file} "client=gme-adobesystems" "key={your-api-key}" -o {patched-file}.lua
實驗性:對於不想安裝Python的Windows用戶,我在這裡提供了patchluastr
的可執行版本,它不需要安裝Python。命令列是:
patchluastr.exe {original-file} "client=gme-adobesystems" "key={your-api-key}" -o {patched-file}.bin
注意:有些用戶報告需要額外的補丁。如果您無法使地圖工作或地圖停止工作,請查看問題 #12 和問題 #19。我們在美國沒有看到這個問題,所以這可能取決於您所在的國家。
在 Windows 上,使用 Resource Hacker 將 Lua 資源替換為其修補版本。
Location.lrmodule
LUA
部分LOCATIONMAPVIEW.LUA
上,右鍵單擊並選擇Replace Resource ,然後按一下Select File並導覽至該資源的修補版本。然後點擊替換AGREVERSEGEOCODESERVICE.LUA
上右鍵單擊並選擇Replace Resource ,然後按一下Select File並導覽至該資源的修補版本。然後點選“替換” 。LOCATIONDEBUGPANEL.LUA
上右鍵並選擇Replace Resource ,然後按一下Select File並導覽至該資源的修補版本。然後點擊替換Location.lrmodule
。根據權限,您可能必須使用「另存為」 ,然後將修改後的檔案複製回C:Program FilesAdobeLightroom
在 Mac 上,將修補後的 Lua 檔案複製回/Applications/Adobe Lightroom/Adobe Lightroom.app/Contents/PlugIns/Location.agmodule/Contents/Resources/
,覆蓋原始檔案。
Lightroom 安裝中的地圖模組現在可以再次運作。
如果您沒有啟用地理編碼 API,您將短暫看到錯誤訊息。但是,基本的地圖和地理標記功能仍然有效。
在使用這些之前,請再次確保您有 Locations.lrmodule 的備份!
下面的範例使用補丁文件,這些文件可以在hacks
資料夾中找到。如果您還沒有,我們建議您從 Github 複製或下載完整項目,例如點擊本頁面右上角的綠色按鈕。
注意:大多數駭客攻擊都是基於 Google 地圖 API 建構的,因此仍然需要先修復 Google 地圖 API 金鑰。
此補丁將“Light”地圖樣式替換為 OpenStreeMap。
修補 API 金鑰後,執行:
patchluastr.py LOCATIONMAPVIEW.bin -p hacks/osm.patch -o LOCATIONMAPVIEW-osm.bin
現在將LOCATIONMAPVIEW-osm.bin
與 Resource Hacker 一起使用,而不是LOCATIONMAPVIEW.bin
,之後 OpenStreetMap 可用作「Light」地圖樣式。
黑客功勞:@pbb72
這是相當激進的;如果我們啟用 StreetView,那麼我們就可以看到 3D 地圖圖釘!它不是很精確,但非常酷。
Lightroom 檔案中已經存在用於啟用 StreetView 的程式碼,因此顯然 Adobe 一直在研究它,但可能會因為它不夠好而將其關閉。
若要啟用此隱藏功能,請執行:
patchluastr.py LOCATIONMAPVIEW.bin -p hacks/streetview.patch -o LOCATIONMAPVIEW-sv.bin
破解和螢幕截圖歸功於:@pbb72
地球上的一些地方提供對角透視的航空照片(而不是自上而下的視圖)。注意:這些照片不是很精確。
若要啟用此控件,請執行:
patchluastr.py LOCATIONMAPVIEW.bin -p hacks/tiltmap.patch -o LOCATIONMAPVIEW-tilt.bin
透過此補丁,如果目前位置的資料可用,新的控制項將出現在右下角。您可能需要放大才能顯示控制項。
黑客功勞:@pbb72
我們無法為 Lightroom 的地圖樣式選擇器新增更多地圖(我們認為)。但幸運的是,Google地圖提供了自己的地圖樣式選擇器,我們只需啟用它即可。
啟用後,我們可以將自己的條目新增到下拉式選單中。有關更多信息,請參閱補丁文件內的註釋。
patchluastr.py LOCATIONMAPVIEW.bin -p hacks/mapselector.patch -o LOCATIONMAPVIEW-sel.bin
黑客功勞:@pbb72
該補丁在地圖下方的視窗中顯示 JavaScript 錯誤和偵錯訊息,這在開發更多 hack 時非常有幫助。您可能不希望永久啟用此功能,因此在應用此技巧之前請備份位置模組。
執行 hacks/jsconsole.patch 腳本:
patchluastr.py LOCATIONMAPVIEW.bin -p hacks/jsconsole.patch -o LOCATIONMAPVIEW-con.bin
該腳本執行以下操作:
現在就享受真正可讀的錯誤訊息!
破解和螢幕截圖歸功於:@pbb72
2018 年初,Google修改了將Google地圖嵌入第三方應用程式的定價模式,從免費存取或固定費用改為基於交易的定價。對 Google 地圖 API 的請求數量會被統計,並且在達到門檻後,每個請求都會收取少量費用。
Google 的新定價與永久授權的產品不相容。對於經典的 Lightroom,Adobe 只獲得一次資金,但每次使用地圖模組時都必須向 Google 付費。對於 Adobe 來說,這不是一個可持續的商業模式。
舊版 Adobe Lightroom 中嵌入的 Google 地圖 API 金鑰已於 2018 年 11 月 30 日過期。
Google 地圖 JavaScript API 允許將 Google 地圖嵌入到網站和應用程式中。
截至 2018 年 12 月,Google Maps JavaScript API 每次地圖載入費用為 0.007 美元(7 美元/1000)。載入地圖後,使用者與地圖的互動(例如平移、縮放或切換地圖圖層)不會產生額外的地圖載入。
此外,截至 2023 年 3 月,Lightroom 請求的 API 版本已被棄用,這導致 Lightroom 載入不相容的版本,從而破壞了地圖功能。
Lightroom 地圖模組呼叫 Maps JavaScript API 以在 Lightroom 中顯示地圖。地圖模組需要存取此 API 才能運作。
對該 API 的存取是在 Lua 資源 LOCATIONMAPVIEW.LUA 中實現的。
Google Geocoding API 允許應用程式根據 GPS 座標搜尋位置並尋找地名。
截至 2018 年 12 月,Google Geocoding API 每個請求的費用為 0.005 美元(5 美元/1000)。
Lightroom 地圖模組在搜尋位置時會呼叫地理編碼 API 來顯示目前所選影像的地名。地圖模組無需訪問此 API 即可工作,但在進入地圖模組以及在圖像之間切換時會短暫閃爍錯誤訊息。
當進入地圖模組時,我們觀察到對地理編碼 API 的多次呼叫。我們也不知道還有哪些操作會建立對此 API 的呼叫。我們建議密切注意 Google Cloud Platform 上提供的使用報告。如果有疑問或成本太高,請透過從 API 和服務 > 憑證下的 API 限制中刪除該服務來停用對地理編碼 API 的存取。
對此 API 的存取是在 Lua 資源 AGREVERSEGEOCODESERVICE.LUA 中實現的。
對於反向地理編碼(根據已知座標將位置名稱新增至映像元資料),Lightroom 使用查詢參數signature
存取Google API,該簽章似乎是根據AdAdobe 的(過期)API 金鑰和您的Lightroom 許可證金鑰計算的。有問題的 API 呼叫如下所示:
http://maps.google.com/maps/api/geocode/json?key=[api-key]&language=EN&channel=lightroom-6.14&latlng=[coordinates-of-my-photo]&signature=[string-of-characters]
對我們來說幸運的是,雖然 Google API 拒絕使用過期簽名的訪問,但如果從 URL 中刪除signature=[string-of-characters]
,或者當signature
被替換為未知參數名稱時,API 確實可以工作。不幸的是,任何 Lua 檔案中都不存在該字串signature
。
事實證明,該功能是透過分解字串來隱藏的。簽章是在LocationDebugPanel.lua
中計算出來的,該檔案中的字串nature
是參數名稱signature
的一部分。將nature
替換為street
會將 API 呼叫更改為:
http://maps.google.com/maps/api/geocode/json?key=[api-key]&language=EN&channel=lightroom-6.14&latlng=[coordinates-of-my-photo]&sigstreet=[string-of-characters]
谷歌很高興地接受了。
從 2018 年開始,Google 要求 Google Cloud Platform 上的帳號能夠進行結算。所有 Google Maps API 交易均透過該帳戶收取。幸運的是,Google 為每個帳戶提供每月 200 美元的信用額度。只有超過該限額的交易才會從您的信用卡中扣除。
費用和服務條款可能因國家而異。請仔細查看 Google 網站上的詳細資訊。
200 美元足以加載超過 28000 次地圖或調用 Geo Coding API 40000 次,這對於 Lightroom 地圖模組的隨意使用來說應該足夠了。為了避免意外,您可以設定預算或配額。當超出配置的金額時,預算將發送電子郵件警報,而配額將關閉 API。
我們建議配置 1 美元的預算和 10% 的首次警報。透過這種配置,如果您花費的自有資金超過 10 美分,Google 就會向您發送電子郵件。