请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居第一站

 找回密码
 立即注册
查看: 2582|回复: 156

[进阶教程] 11-16修复0.57版本@HA地图坐标修正,更换图层为百度地图

  [复制链接]

8

主题

80

帖子

591

积分

论坛技术达人

积分
591
彼岸币
0

卓越贡献

发表于 2017-10-14 21:20:03 | 显示全部楼层 |阅读模式
本帖最后由 syjjx 于 2017-11-16 11:02 编辑

官方在更新0.57版本之后map文件的存放地址已经变动过了,所以我们要将文件替换到新的地方才能使得修改生效
修改文件还能继续使用原来的
具体路径为
[AppleScript] 纯文本查看 复制代码
/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/hass_frontend/



ha-panel-map.html和ha-panel-map.html.gz,路径为
[AppleScript] 纯文本查看 复制代码
/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/hass_frontend/panels



css文件,路径为
[AppleScript] 纯文本查看 复制代码
/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/hass_frontend/images/leaflet



大家使用的设备不同路径也可能有略微不同,大家可以使用以下命令
[AppleScript] 纯文本查看 复制代码
find / -name hass_frontend

可以看到类似的查询结果
/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/hass_frontend


关于地图部分,我最后一次更新,本次只是把高德替换成了百度地图,原先采用高德,一来是因为站在前人的肩膀上,二来是高德的墨卡托投影的瓦片图层算法是未加密的,方便使用。今天花了一点时间替换成百度的,百度的坐标是在国家标准的基础上二次加密的,这部分修改了一下,墨卡托投影瓦片算法根据百度规则改了下,其中利用了下百度公开的JS文件。。

附近中有个JS文件 ,想要百度的需要自行把那个JS文件放到如下路径。

[AppleScript] 纯文本查看 复制代码
/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/js




差别大家自己比较,左边高德,右边百度
2.png     2.1.png




------------------------------------------------------------------------------------------------------------


在原先的基础上,增加了卫星地图,同时支持手动开关路况信息



1.png      

修改方法和原先雷同,只需要多修改一个css文件,树莓派3上的路径为

[Bash shell] 纯文本查看 复制代码
/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/frontend/www_static/images/leaflet


将新附件中的leaflet.css替换进去即可,其他和之前的使用方法一致


路况图层修复

lk.png lk2.png

附件已经更新为路况和坐标都修复了的版本,需要的请重新下载


坐标修复之后我发现@lidicn添加的路况图层URL也是存在问题的,只有特定缩放大小才能显示路况信息


所以我做了以下修改,现在只要高德提供路况信息的缩放级都能正常显示了


主要就是url中zoom的参数,lidicn写死为1了,正确的 应该是 17-z



代码如下
在4543行附近,找到如下代码,添加u: 17-this._getZoomForUrl()注意添加的时候上一行需要增加一个逗号。
[JavaScript] 纯文本查看 复制代码
            getTileUrl: function(t) {
              var e = {
                r: Vi ? "@2x": "",
                s: this._getSubdomain(t),
                x: t.x,
                y: t.y,
                z: this._getZoomForUrl(),
                u: 17-this._getZoomForUrl()
              };
              if (this._map && !this._map.options.crs.infinite) {
                var n = this._globalTileRange.max.y - t.y;
                this.options.tms && (e.y = n),
                e["-y"] = n
              }
              return _(this._url, i(e, this.options))
            },


然后修改lidicn增加的路况图层中的url,如下:


[JavaScript] 纯文本查看 复制代码
          window.L.tileLayer("http://tm.amap.com/trafficengine/mapabc/traffictile?v=1.0&;t=1&zoom={u}&x={x}&y={y}", {
            maxZoom: 18
          }).addTo(t),



原作者https://bbs.hassbian.com/thread-1315-1-1.html

使用了原作者的补丁之后,发现home的位置和设备的定位都是偏移的。

查看了高德地图的相关资料之后,发现homeassistant中的经纬度系统使用的是WGS84系统

而高德地图使用的经纬度系统为GCJ02:又称火星坐标系


所以我在ha-panel-map 增加了一些代码,将wgs84的经纬度转化为GCJ02的,这样就修正了偏移


主要代码如下:
[JavaScript] 纯文本查看 复制代码
var WGS84_to_Other_Coordinate = function() {}
      WGS84_to_Other_Coordinate.prototype.x_PI = 3.14159265358979324 * 3000.0 / 180.0;
      WGS84_to_Other_Coordinate.prototype.a = 6378245.0;
      WGS84_to_Other_Coordinate.prototype.ee = 0.00669342162296594323;
      WGS84_to_Other_Coordinate.prototype.transform = function(wgLat,wgLon,Coord) {
            if (this.outOfChina(wgLat, wgLon)) {
                return [wgLat, wgLon];
            }
                dLat = this.transformLat(wgLon - 105.0, wgLat - 35.0);
                dLon = this.transformLon(wgLon - 105.0, wgLat - 35.0);
                radLat = wgLat / 180.0 * Math.PI;
                magic = Math.sin(radLat);
                magic = 1 - this.ee * magic * magic;
                sqrtMagic = Math.sqrt(magic);
                dLat = (dLat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtMagic) * Math.PI);
                dLon = (dLon * 180.0) / (this.a / sqrtMagic * Math.cos(radLat) * Math.PI);
                mgLat = wgLat + dLat;
                mgLon = wgLon + dLon;
                if (Coord){
                        return [mgLat, mgLon];
                }
                else{
                        var z = Math.sqrt(mgLon * mgLon + mgLat * mgLat) + 0.00002 * Math.sin(mgLat * this.x_PI);
                        var theta = Math.atan2(mgLat, mgLon) + 0.000003 * Math.cos(mgLon * this.x_PI);
                        var bd_lng = z * Math.cos(theta) + 0.0065;
                        var bd_lat = z * Math.sin(theta) + 0.006;
                        console.log(bd_lng+"||||"+bd_lat);
                        return [bd_lat,bd_lng]
                }
      };

      WGS84_to_Other_Coordinate.prototype.outOfChina = function(lat, lon) {

          if (lon < 72.004 || lon > 137.8347)
              return true;
          if (lat < 0.8293 || lat > 55.8271)
              return true;

          return false;

      };

      WGS84_to_Other_Coordinate.prototype.transformLat = function(x, y) {

          var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
          ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
          ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
          ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;

          return ret;

      };

      WGS84_to_Other_Coordinate.prototype.transformLon = function(x, y) {

          var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
          ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
          ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
          ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;

          return ret;

      };



然后在源代码中搜索    a.push(window.L.marker
修改成如下样子,一共有4个地方需要修改
[JavaScript] 纯文本查看 复制代码
                  a.push(window.L.marker(new WGS84_to_Other_Coordinate().transform(s.attributes.latitude, s.attributes.longitude,true), {
                    icon: o,
                    interactive: !1,
                    title: n
                  }).addTo(i)),


最后大家在configuration.yaml中设置经纬度的时候,去http://www.gpsspg.com/maps.htm 获取坐标,选用其中的谷歌地球坐标

附上我修改好的文件
游客,如果您要查看本帖隐藏内容请回复





评分

参与人数 5金钱 +88 收起 理由
Milo + 20 膜拜大神!
cxlwill + 10 谢谢分享!
lidicn + 20 谢谢大神分享!
Roger + 20 太牛了!终于来了个懂GIS的大神!.
Jones + 18 谢谢大神分享!

查看全部评分

回复

使用道具 举报

103

主题

777

帖子

3151

积分

超级版主

Rank: 8Rank: 8

积分
3151
彼岸币
0

教程狂人论坛风云人物突出贡献

发表于 2017-10-15 00:45:47 来自手机 | 显示全部楼层
太赞了!
回复

使用道具 举报

3

主题

42

帖子

285

积分

论坛分享达人

积分
285
彼岸币
0
发表于 2017-10-15 01:19:02 | 显示全部楼层
牛逼牛逼 这个可以有
回复

使用道具 举报

4

主题

132

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
彼岸币
0
发表于 2017-10-15 08:21:47 来自手机 | 显示全部楼层
太牛了!就需要这个!!
回复

使用道具 举报

2

主题

159

帖子

725

积分

高级会员

Rank: 4

积分
725
彼岸币
0
发表于 2017-10-15 08:40:37 | 显示全部楼层
楼主太牛了
回复

使用道具 举报

3

主题

135

帖子

679

积分

高级会员

Rank: 4

积分
679
彼岸币
0
发表于 2017-10-15 09:17:29 | 显示全部楼层
赶紧修改,谢谢分享
回复

使用道具 举报

8

主题

80

帖子

591

积分

论坛技术达人

积分
591
彼岸币
0

卓越贡献

 楼主| 发表于 2017-10-15 13:25:00 | 显示全部楼层

路况图层我又改了下,各个级别都可以正常显示了
回复

使用道具 举报

9

主题

185

帖子

690

积分

高级会员

Rank: 4

积分
690
彼岸币
0
发表于 2017-10-15 13:39:38 | 显示全部楼层
我修改家庭地址为高德地图的坐标后,设备坐标始终不对,还以为是我手机的gps出问题了,原来是这么回事。。。感谢
回复

使用道具 举报

13

主题

102

帖子

1122

积分

超级版主

Rank: 8Rank: 8

积分
1122
彼岸币
0

论坛风云人物

发表于 2017-10-15 17:14:11 来自手机 | 显示全部楼层
太牛了,大神大神
回复

使用道具 举报

3

主题

147

帖子

611

积分

高级会员

懵懂的小白

Rank: 4

积分
611
彼岸币
0
发表于 2017-10-15 18:17:31 | 显示全部楼层
谢谢分享,正需要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2017-12-14 06:34 , Processed in 0.246268 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表