关于修复teslamate 地址空的问题

由于某些原因,teslamate 的地址在某个时间点以后就为空了。查了网上的资料,发现是由于部署teslamate的容器访问openstreetmap api超时导致的。比如这里提到的问题
location is blank and the map can’t be read

查了下,网上有一些解决方案,比如

第一个应该是比较完美的。但需要部署一个容器,考虑到安全性的原因,并没有拉这个容器到本地。第二个也没有找到可靠的文中提到的sniproxy,毕竟也不清楚这个代理具体做什么,直接部署感觉也不太安全。所以就研究了teslamate显示地址的逻辑,尝试自己解决。现总结如下:

teslamate有几个表,一个是drives表,包含drive id, start_position_id, end_position_id,start_address_id, end_address_id 等信息。一个是positions表,一个巨大的表,包含所有的车辆接近实时地址信息,一个是adderss表,包含车辆开车和停车的信息。 在drives表中的start_address_id, end_address_id 是address表的记录,如果为空的,则显示的地址为空,除非是手动创建了geo fence地址。
而start_position_id, end_position_id 在positions 表里面有对应的latitude和longditude. 所以修复的思路就是:

  1. 找到start_address_id, end_address_id为空的drives 记录,特别是start_position_id, end_position_id
  2. 根据start_position_id, end_position_id 在positions 表中找到对应的记录,特别是地理坐标latitude和longditude
  3. 通过这个地址调用Openstreetmap api https://nominatim.openstreetmap.org/reverse?lat=xx.abcdef&lon=yy.abcdef&format=json” 获得地址信息,这里需要在一个可以访问opensteetmap api的网络内调用
  4. 根据获得的地址信息更新address表,这里要注意的是,teslamate的表有一个限制是osm_id要唯一,也就是说如果通过调用openstreetapi得到的地址的osm_id在数据库已经有了,则不能创建新的记录,这时可以简单的更新drives 表的start_address_id为address表对应的记录的id. 如果没有找到,则可以新建一个记录,然后在更新drvies表格里的start_address_id,end_address_id 的信息

Python 源代码正在测试中,相信有了上述的思路,用什么工具来实现不是一个难的问题。