为 Gnome Weather 添加自定义位置天气支持（平民版）

Gnome Weather 是 Gnome 自带的天气预报 APP，底层依赖 libgweather 库，它提供了多个数据源，但不知道是不是发行版不会全部启用这些源的原因，我们伟大的国际 Rock Home Town 搜不到，超超知道了肯定不开心。

为它添加位置信息支持的方式主要有两种：

官方推荐 为 location.xml 提交城市的位置信息

这里直接本地改是没用的，这个 xml 文件在编译时转换为 bin 文件程序才会读

说实话我有点搞不懂他的逻辑，明明是有好几个服务器端实现的，为啥非要配置这么个文件，而且文件内容多少与机场有关（物理机场）

改代码

可以给他自定义数据源实现，比如添加个 weather.cma.cn 的实现

那有没有适合我等自由的平民的办法呢？答案是有的

Copy
gsettings get org.gnome.shell.weather locations

我这里会返回这么一串，可能是之前查过的数据缓存

Copy
[<(uint32 2, <('Beijing', 'ZBAA', false, [(0.69696814214530467, 2.0295270260429752)], @a(dd) [])>)>, <(uint32 2, <('Beijing', 'ZBAA', true, [(0.69696814214530467, 2.0295270260429752)], [(0.69689057971334611, 2.0313596217575696)])>)>, <(uint32 2, <('Shanghai', 'ZSSS', true, [(0.54396095602266359, 2.1194114825206833)], [(0.54493057368860898, 2.1198429802716539)])>)>, <(uint32 2, <('Ashiya Air Base', 'RJFA', false, [(0.59137572239964786, 2.2802726677305918)], @a(dd) [])>)>]

首先外面肯定是个数组，通过翻代码我们不难找到

https://gitlab.gnome.org/GNOME/libgweather/-/blob/main/libgweather/gweather-location.c?ref_type=heads#L1423

如果把字符串美化下是这样的

Copy
<(
uint32 2,
<(
'Beijing',
'ZBAA',
false,
[
(0.69696814214530467, 2.0295270260429752)
],
@a(dd) []
)>
)>

对照上面的代码

uint32 2 表示版本，就是 2

Beijing 城市名

ZBAA 机场或航站楼编码

false 这条数据是城市 (true) 还是机场 (false)

下面这个数组表示 维度,经度，以弧度表示，公式 角度 * (pi /180)

第二个数组可选，表示父位置（有可能是备选用），如果没有就传 @a(dd) []

比如石家庄市 桥西区 经纬度为 38.04139, 114.47861

那么就可以得到

Copy
<(uint32 2, <('Shijiazhuang', '', true, [(0.663947508, 1.998028668)], @a(dd) [])>)>

分别设置

Copy
gsettings set org.gnome.shell.weather locations "[拼接后的内容]"
gsettings set org.gnome.Weather locations "[拼接后的内容]"

这样 Gnome Weather App 里 就好了，但是 Shell 的通知栏里显示的还是有问题。

Shell 里面集成的天气服务好像有些逻辑问题，它会匹配 location.xml 中最近的地方，我这里被定位到太原去了，关闭设置 -> 隐私中的定位服务后，也就显示石家庄了。