自 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,您将短暂看到错误消息。但是,基本的地图和地理标记功能仍然有效。(注意:一些用户报告说,除非激活地理编码 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 的地图样式选择器添加更多地图(我们认为)。但幸运的是,谷歌地图提供了自己的地图样式选择器,我们只需启用它即可。
启用后,我们可以将自己的条目添加到下拉菜单中。有关更多信息,请参阅补丁文件内的注释。
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 地图 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,该签名似乎是根据 Adobe 的(过期)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 就会向您发送一封电子邮件。