zanyrain

zanyrain

github
twitter_id

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

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

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

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

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

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

  • 改代码

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

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

gsettings get org.gnome.shell.weather locations

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

[<(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

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

<(
    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

那么就可以得到

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

分别设置

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

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

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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。