最近在 Zorin OS 18.1 上遇到一个小问题:GNOME 自带的「天气」应用无法正确获取中国大陆部分城市的天气。
我的位置在江西南昌,但 GNOME Weather 无法定位到南昌,最开始只会回退到 Beijing。后来主天气应用修好了,但 GNOME Shell 顶部日历/通知中心里的天气又跑到了代理/VPN 出口 IP 所在的 Los Angeles。
如果只是看天气,当然可以换成其他天气应用或网页天气。但 GNOME 自带天气有一个很重要的优点:它会和 GNOME Shell 的桌面日历/通知中心集成。也就是点击顶部日期时间时,下拉面板里可以直接显示天气。
所以这里记录一种临时解决方案:不更换天气应用,而是手动把 GNOME Weather 和 GNOME Shell 天气组件的位置都写成南昌,并关闭 GNOME Shell 天气自己的自动定位。
问题现象
表现大概是这样:
- GNOME Weather 搜不到或无法正确使用
Nanchang/南昌; - 自动定位无法定位到真实城市;
- 天气应用本身可能回退到
Beijing; - GNOME Shell 日历下拉里的天气可能继续走 IP 定位;
- 如果正在使用代理/VPN,日历天气可能显示成代理出口所在地,例如
Los Angeles。
这通常不是天气数据本身不存在,而是 GNOME Weather 的地点搜索、地点数据库或自动定位链路没有正确识别当前城市。
临时解决思路
GNOME Weather 主应用和 GNOME Shell 日历天气块都有自己的 GSettings/dconf 配置。
也就是说:
- 只修 GNOME Weather 主应用,不一定能修好日历天气;
- 只关系统定位,也不是一个很优雅的办法;
- 更合适的做法是:先让 GNOME Weather 主应用拿到正确地点,再把这个地点同步给 GNOME Shell 天气块,并关闭 Shell 天气自己的自动定位。
南昌的大致坐标是:
纬度:28.6831600
经度:115.8580890
GNOME 配置里使用的是弧度值,不是普通经纬度。转换后约为:
纬度弧度:0.5006155818763367
经度弧度:2.022105118118625
操作步骤
1. 写入 GNOME Weather 主应用的位置
先把南昌写入 GNOME Weather 应用的位置配置:
dconf write /org/gnome/Weather/locations "[<(uint32 2, <('Nanchang, Jiangxi, China', '', false, [(0.5006155818763367, 2.022105118118625)], @a(dd) [])>)>]"
这一步主要修的是 GNOME Weather 主应用。
2. 关闭 GNOME Shell 天气的自动定位
这一步很关键。
GNOME Shell 顶部日历里的天气块也有自己的自动定位设置。如果它还开着,在使用代理/VPN 时,它可能会根据出口 IP 把位置识别成代理所在地。
gsettings set org.gnome.shell.weather automatic-location false
3. 把 GNOME Weather 主应用的位置同步给 GNOME Shell 天气块
如果 GNOME Weather 是系统包安装的,使用下面这组命令:
LOC="$(gsettings get org.gnome.Weather locations)"
gsettings set org.gnome.shell.weather locations "$LOC"
这样可以避免手写两遍很长的 GSettings 结构。
如果 GNOME Weather 是 Flatpak 安装的,才需要使用 Flatpak 版本的命令:
LOC="$(flatpak run --command=gsettings org.gnome.Weather get org.gnome.Weather locations)"
gsettings set org.gnome.shell.weather locations "$LOC"
如果执行 Flatpak 命令时报类似下面的错误:
错误: app/org.gnome.Weather/x86_64/master 未安装
expected value:
(empty input)
^
说明你的 GNOME Weather 不是 Flatpak 版本,改用普通 gsettings get org.gnome.Weather locations 那组命令即可。
4. 注销并重新登录
完成后建议注销并重新登录一次。
GNOME Shell 的日历天气属于 Shell 本体,单纯重启天气应用不一定会立刻刷新。
检查是否写入成功
可以用下面几条命令检查:
gsettings get org.gnome.shell.weather automatic-location
gsettings get org.gnome.system.location enabled
gsettings get org.gnome.shell.weather locations
gsettings get org.gnome.Weather locations
我的最终结果是:
false
true
[<(uint32 2, <('Nanchang, Jiangxi, China', '', false, [(0.5006155818763367, 2.0221051181186249)], @a(dd) [])>)>]
[<(uint32 2, <('Nanchang, Jiangxi, China', '', false, [(0.5006155818763367, 2.0221051181186249)], @a(dd) [])>)>]
这里比较重要的是:
org.gnome.shell.weather automatic-location是false;org.gnome.shell.weather locations和org.gnome.Weather locations都是Nanchang, Jiangxi, China;org.gnome.system.location enabled可以保持true,不需要为了天气强行禁用系统定位。
关于系统定位
我一开始考虑过关闭系统定位:
gsettings set org.gnome.system.location enabled false
但实际验证下来,不需要禁用系统定位也可以解决日历天气位置错误的问题。
更推荐的做法是只关闭 GNOME Shell 天气自己的自动定位:
gsettings set org.gnome.shell.weather automatic-location false
这样不会影响 GNOME Maps、浏览器、其他需要定位权限的应用。
只有在日历天气仍然被自动定位强行覆盖时,才建议把系统定位作为最后的排障选项。
恢复默认设置
如果之后想撤销这个临时方案,可以运行:
dconf reset /org/gnome/Weather/locations
dconf reset /org/gnome/shell/weather/locations
gsettings reset org.gnome.shell.weather automatic-location
如果你之前额外禁用了系统定位,也可以恢复:
gsettings reset org.gnome.system.location enabled
然后注销并重新登录。
给其他城市使用
这个方法也可以用于其他 GNOME Weather 搜不到的城市。核心是把经纬度转换成弧度:
弧度 = 角度 × π ÷ 180
例如:
纬度弧度 = 纬度 × π ÷ 180
经度弧度 = 经度 × π ÷ 180
然后把命令里的城市名称、纬度弧度和经度弧度替换掉即可。
总结
这不是一个真正的上游修复,而是一个本机临时 workaround。更理想的解决方式,是让 GNOME 的地点数据库正确收录对应城市,或者让 GNOME Weather 的在线地点搜索更稳定。
不过对我这个需求来说,这个方法已经够用了:
- 继续使用 GNOME 原生天气应用;
- 保留桌面日历下拉菜单里的天气集成;
- 不需要安装额外天气软件;
- 不需要禁用系统定位;
- 可以绕过南昌无法被正确搜索/定位,以及 VPN 出口 IP 导致日历天气跑偏的问题。