From 9571eb3a15046bf12dae06f58d567b9a8a307e66 Mon Sep 17 00:00:00 2001
From: Lawrence <1934378145@qq.com>
Date: 星期三, 27 一月 2021 15:24:28 +0800
Subject: [PATCH] 增加移动位置显示功能
---
web_src/src/components/devicePosition.vue | 374 ++++++++++++++++++++++++++++
web_src/src/main.js | 10
web_src/src/components/GeoConvertTools.js | 250 +++++++++++++++++++
web_src/src/router/index.js | 6
web_src/src/components/videoList.vue | 38 +-
web_src/package.json | 1
web_src/package-lock.json | 80 ++++++
web_src/index.html | 1
README.md | 8
9 files changed, 744 insertions(+), 24 deletions(-)
diff --git a/README.md b/README.md
index 724cfef..40a522c 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,14 @@
12. 鏀寔鎾斁h265, g.711鏍煎紡鐨勬祦
13. 鏀寔鍥哄畾娴佸湴鍧�鍜岃嚜鍔ㄧ偣鎾紝鍚屾椂鏀寔鏈偣鎾椂鐩存帴鎾斁娴佸湴鍧�锛屼唬鐮佽嚜鍔ㄥ彂璧风偣鎾�. ( [鏌ョ湅WIKI](https://github.com/648540858/wvp-GB28181-pro/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%9B%BA%E5%AE%9A%E6%92%AD%E6%94%BE%E5%9C%B0%E5%9D%80%E4%B8%8E%E8%87%AA%E5%8A%A8%E7%82%B9%E6%92%AD)锛�
14. 鎶ヨ淇℃伅澶勭悊锛屾敮鎸佸悜鍓嶇鎺ㄩ�佹姤璀︿俊鎭�
+15. 鏀寔璁㈤槄涓庨�氱煡鏂规硶
+ [X] 绉诲姩浣嶇疆璁㈤槄
+ [X] 绉诲姩浣嶇疆閫氱煡澶勭悊
+ [ ] 鎶ヨ浜嬩欢璁㈤槄
+ [X] 鎶ヨ浜嬩欢閫氱煡澶勭悊
+ [ ] 璁惧鐩綍璁㈤槄
+ [X] 璁惧濂撮瞾閫氱煡澶勭悊
+16. 绉诲姩浣嶇疆鏌ヨ鍜屾樉绀猴紝鍙�氳繃閰嶇疆鏂囦欢璁剧疆绉诲姩浣嶇疆鍘嗗彶鏄惁瀛樺偍
# 寰呭疄鐜帮細
涓婄骇绾ц仈
diff --git a/web_src/index.html b/web_src/index.html
index 1224125..8b26e72 100644
--- a/web_src/index.html
+++ b/web_src/index.html
@@ -7,6 +7,7 @@
</head>
<body>
<script type="text/javascript" src="./js/EasyWasmPlayer.js"></script>
+ <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=rk73w8dv1rkE4UdZsataG68VarhYQzrx&s=1"></script>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
diff --git a/web_src/package-lock.json b/web_src/package-lock.json
index fb6278d..54840f6 100644
--- a/web_src/package-lock.json
+++ b/web_src/package-lock.json
@@ -1269,6 +1269,34 @@
"integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=",
"dev": true
},
+ "bmaplib.curveline": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz",
+ "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q=="
+ },
+ "bmaplib.heatmap": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz",
+ "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q=="
+ },
+ "bmaplib.lushu": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz",
+ "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w=="
+ },
+ "bmaplib.markerclusterer": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz",
+ "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==",
+ "requires": {
+ "bmaplib.texticonoverlay": "^1.0.2"
+ }
+ },
+ "bmaplib.texticonoverlay": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz",
+ "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg=="
+ },
"bn.js": {
"version": "5.1.3",
"resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz",
@@ -5266,6 +5294,14 @@
"invert-kv": "^1.0.0"
}
},
+ "linkify-it": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
+ "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+ "requires": {
+ "uc.micro": "^1.0.1"
+ }
+ },
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz",
@@ -5443,6 +5479,25 @@
"object-visit": "^1.0.0"
}
},
+ "markdown-it": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
+ "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "entities": "~1.1.1",
+ "linkify-it": "^2.0.0",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ }
+ }
+ },
"math-expression-evaluator": {
"version": "1.2.22",
"resolved": "https://registry.npm.taobao.org/math-expression-evaluator/download/math-expression-evaluator-1.2.22.tgz",
@@ -5465,6 +5520,11 @@
"resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.4.tgz",
"integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=",
"dev": true
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
},
"media-typer": {
"version": "0.3.0",
@@ -10074,8 +10134,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"ssri": {
"version": "5.3.0",
@@ -10489,6 +10548,11 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
+ "uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ },
"uglify-js": {
"version": "3.4.10",
"resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz",
@@ -10841,6 +10905,18 @@
"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz",
"integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM="
},
+ "vue-baidu-map": {
+ "version": "0.21.22",
+ "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz",
+ "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==",
+ "requires": {
+ "bmaplib.curveline": "^1.0.0",
+ "bmaplib.heatmap": "^1.0.4",
+ "bmaplib.lushu": "^1.0.7",
+ "bmaplib.markerclusterer": "^1.0.13",
+ "markdown-it": "^8.4.0"
+ }
+ },
"vue-clipboard2": {
"version": "0.3.1",
"resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz",
diff --git a/web_src/package.json b/web_src/package.json
index d99d7bc..4a9f766 100644
--- a/web_src/package.json
+++ b/web_src/package.json
@@ -19,6 +19,7 @@
"moment": "^2.29.1",
"postcss-pxtorem": "^5.1.1",
"vue": "^2.6.11",
+ "vue-baidu-map": "^0.21.22",
"vue-clipboard2": "^0.3.1",
"vue-cookies": "^1.7.4",
"vue-router": "^3.1.6"
diff --git a/web_src/src/components/GeoConvertTools.js b/web_src/src/components/GeoConvertTools.js
new file mode 100644
index 0000000..6866249
--- /dev/null
+++ b/web_src/src/components/GeoConvertTools.js
@@ -0,0 +1,250 @@
+/**
+ * 缁忕含搴﹁浆鎹�
+ */
+export default {
+ PI: 3.1415926535897932384626,
+ //PI: 3.14159265358979324,
+ x_pi: (3.1415926535897932384626 * 3000.0) / 180.0,
+ delta: function (lat, lng) {
+ // Krasovsky 1940
+ //
+ // a = 6378245.0, 1/f = 298.3
+ // b = a * (1 - f)
+ // ee = (a^2 - b^2) / a^2;
+ var a = 6378245.0; // a: 鍗槦妞悆鍧愭爣鎶曞奖鍒板钩闈㈠湴鍥惧潗鏍囩郴鐨勬姇褰卞洜瀛愩��
+ var ee = 0.00669342162296594323; // ee: 妞悆鐨勫亸蹇冪巼銆�
+ var dLat = this.transformLat(lng - 105.0, lat - 35.0);
+ var dLng = this.transformLng(lng - 105.0, lat - 35.0);
+ var radLat = (lat / 180.0) * this.PI;
+ var magic = Math.sin(radLat);
+ magic = 1 - ee * magic * magic;
+ var sqrtMagic = Math.sqrt(magic);
+ dLat = (dLat * 180.0) / (((a * (1 - ee)) / (magic * sqrtMagic)) * this.PI);
+ dLng = (dLng * 180.0) / ((a / sqrtMagic) * Math.cos(radLat) * this.PI);
+ return {
+ lat: dLat,
+ lng: dLng
+ };
+ },
+ /**
+ * WGS-84 to GCJ-02 GPS鍧愭爣杞腑鍥藉潗鏍�
+ * @param {number} wgsLat GPS绾害
+ * @param {number} wgsLng GPS缁忓害
+ * @return {object} 杩斿洖涓浗鍧愭爣缁忕含搴﹀璞�
+ */
+ GPSToChina: function (wgsLat, wgsLng) {
+ if (this.outOfChina(wgsLat, wgsLng)) return {
+ lat: wgsLat,
+ lng: wgsLng
+ };
+ var d = this.delta(wgsLat, wgsLng);
+ return {
+ lat: Number(wgsLat) + Number(d.lat),
+ lng: Number(wgsLng) + Number(d.lng)
+ };
+ },
+ /**
+ * GCJ-02 to WGS-84 涓浗鏍囧噯鍧愭爣杞珿PS鍧愭爣
+ * @param {number} gcjLat 涓浗鏍囧噯鍧愭爣绾害
+ * @param {number} gcjLng 涓浗鏍囧噯鍧愭爣缁忓害
+ * @return {object} 杩斿洖GPS缁忕含搴﹀璞�
+ */
+ chinaToGPS: function (gcjLat, gcjLng) {
+ if (this.outOfChina(gcjLat, gcjLng)) return {
+ lat: gcjLat,
+ lng: gcjLng
+ };
+ var d = this.delta(gcjLat, gcjLng);
+ return {
+ lat: Number(gcjLat) - Number(d.lat),
+ lng: Number(gcjLng) - Number(d.lng)
+ };
+ },
+ /**
+ * GCJ-02 to WGS-84 exactly 涓浗鏍囧噯鍧愭爣杞珿PS鍧愭爣(绮剧‘)
+ * @param {number} gcjLat 涓浗鏍囧噯鍧愭爣绾害
+ * @param {number} gcjLng 涓浗鏍囧噯鍧愭爣缁忓害
+ * @return {object} 杩斿洖GPS缁忕含搴﹀璞�(绮剧‘)
+ */
+ chinaToGPSExact: function (gcjLat, gcjLng) {
+ var initDelta = 0.01;
+ var threshold = 0.000000001;
+ var dLat = initDelta,
+ dLng = initDelta;
+ var mLat = gcjLat - dLat,
+ mLng = gcjLng - dLng;
+ var pLat = gcjLat + dLat,
+ pLng = gcjLng + dLng;
+ var wgsLat,
+ wgsLng,
+ i = 0;
+ while (1) {
+ wgsLat = (mLat + pLat) / 2;
+ wgsLng = (mLng + pLng) / 2;
+ var tmp = this.gcj_encrypt(wgsLat, wgsLng);
+ dLat = tmp.lat - gcjLat;
+ dLng = tmp.lng - gcjLng;
+ if (Math.abs(dLat) < threshold && Math.abs(dLng) < threshold) break;
+
+ if (dLat > 0) pLat = wgsLat;
+ else mLat = wgsLat;
+ if (dLng > 0) pLng = wgsLng;
+ else mLng = wgsLng;
+
+ if (++i > 10000) break;
+ }
+ //console.log(i);
+ return {
+ lat: wgsLat,
+ lng: wgsLng
+ };
+ },
+ /**
+ * GCJ-02 to BD-09 涓浗鏍囧噯鍧愭爣杞櫨搴﹀潗鏍�(绮剧‘)
+ * @param {number} gcjLat 涓浗鏍囧噯鍧愭爣绾害
+ * @param {number} gcjLng 涓浗鏍囧噯鍧愭爣缁忓害
+ * @return {object} 杩斿洖鐧惧害缁忕含搴﹀璞�
+ */
+ chinaToBaidu: function (gcjLat, gcjLng) {
+ var x = gcjLng,
+ y = gcjLat;
+ var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi);
+ var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi);
+ var bdLng = z * Math.cos(theta) + 0.0065;
+ var bdLat = z * Math.sin(theta) + 0.006;
+ return {
+ lat: bdLat,
+ lng: bdLng
+ };
+ },
+ /**
+ * BD-09 to GCJ-02 鐧惧害鍧愭爣杞腑鍥芥爣鍑嗗潗鏍�
+ * @param {number} bdLat 鐧惧害鍧愭爣绾害
+ * @param {number} bdLng 鐧惧害鍧愭爣缁忓害
+ * @return {object} 杩斿洖涓浗鏍囧噯缁忕含搴﹀璞�
+ */
+ baiduToChina: function (bdLat, bdLng) {
+ var x = bdLng - 0.0065,
+ y = bdLat - 0.006;
+ var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi);
+ var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi);
+ var gcjLng = z * Math.cos(theta);
+ var gcjLat = z * Math.sin(theta);
+ return {
+ lat: gcjLat,
+ lng: gcjLng
+ };
+ },
+ /**
+ * BD-09 to GCJ-02 鐧惧害鍧愭爣杞琯ps鍧愭爣
+ * @param {number} bdLat 鐧惧害鍧愭爣绾害
+ * @param {number} bdLng 鐧惧害鍧愭爣缁忓害
+ * @return {object} 杩斿洖gps缁忕含搴﹀璞�
+ */
+ baiduToGPS: function (bdLat, bdLng) {
+ let china = this.baiduToChina(bdLat, bdLng);
+ return this.chinaToGPS(china.lat, china.lng);
+ },
+ /**
+ * WGS-84 to to BD-09 GPS鍧愭爣杞珺aidu鍧愭爣
+ * @param {number} gpsLat GPS绾害
+ * @param {number} gpsLng GPS缁忓害
+ * @return {object} 杩斿洖鐧惧害缁忕含搴﹀璞�
+ */
+ GPSToBaidu: function (gpsLat, gpsLng) {
+ var china = this.GPSToChina(gpsLat, gpsLng);
+ return this.chinaToBaidu(china.lat, china.lng);
+ },
+ /**
+ * WGS-84 to Web mercator GPS鍧愭爣杞ⅷ鍗℃墭鍧愭爣
+ * @param {number} wgsLat GPS绾害
+ * @param {number} wgsLng GPS缁忓害
+ * @return {object} 杩斿洖澧ㄥ崱鎵樼粡绾害瀵硅薄
+ */
+ GPSToMercator: function (wgsLat, wgsLng) {
+ var x = (wgsLng * 20037508.34) / 180;
+ var y = Math.log(Math.tan(((90 + wgsLat) * this.PI) / 360)) / (this.PI / 180);
+ y = (y * 20037508.34) / 180;
+ return {
+ lat: y,
+ lng: x
+ };
+ /*
+ if ((Math.abs(wgsLng) > 180 || Math.abs(wgsLat) > 90))
+ return null;
+ var x = 6378137.0 * wgsLng * 0.017453292519943295;
+ var a = wgsLat * 0.017453292519943295;
+ var y = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));
+ return {'lat' : y, 'lng' : x};
+ //*/
+ },
+ /**
+ * Web mercator to WGS-84 澧ㄥ崱鎵樺潗鏍囪浆GPS鍧愭爣
+ * @param {number} mercatorLat 澧ㄥ崱鎵樼含搴�
+ * @param {number} mercatorLng 澧ㄥ崱鎵樼粡搴�
+ * @return {object} 杩斿洖GPS缁忕含搴﹀璞�
+ */
+ mercatorToGPS: function (mercatorLat, mercatorLng) {
+ var x = (mercatorLng / 20037508.34) * 180;
+ var y = (mercatorLat / 20037508.34) * 180;
+ y = (180 / this.PI) * (2 * Math.atan(Math.exp((y * this.PI) / 180)) - this.PI / 2);
+ return {
+ lat: y,
+ lng: x
+ };
+ /*
+ if (Math.abs(mercatorLng) < 180 && Math.abs(mercatorLat) < 90)
+ return null;
+ if ((Math.abs(mercatorLng) > 20037508.3427892) || (Math.abs(mercatorLat) > 20037508.3427892))
+ return null;
+ var a = mercatorLng / 6378137.0 * 57.295779513082323;
+ var x = a - (Math.floor(((a + 180.0) / 360.0)) * 360.0);
+ var y = (1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * mercatorLat) / 6378137.0)))) * 57.295779513082323;
+ return {'lat' : y, 'lng' : x};
+ //*/
+ },
+ /**
+ * 涓ょ偣涔嬮棿鐨勮窛绂�
+ * @param {number} latA 璧风偣绾害
+ * @param {number} lngA 璧风偣缁忓害
+ * @param {number} latB 缁堢偣绾害
+ * @param {number} lngB 缁堢偣缁忓害
+ * @return {number} 杩斿洖璺濈(绫�)
+ */
+ distance: function (latA, lngA, latB, lngB) {
+ var earthR = 6371000;
+ var x = Math.cos((latA * this.PI) / 180) * Math.cos((latB * this.PI) / 180) * Math.cos(((lngA - lngB) * this.PI) / 180);
+ var y = Math.sin((latA * this.PI) / 180) * Math.sin((latB * this.PI) / 180);
+ var s = x + y;
+ if (s > 1) s = 1;
+ if (s < -1) s = -1;
+ var alpha = Math.acos(s);
+ var distance = alpha * earthR;
+ return distance;
+ },
+ /**
+ * 鏄惁鍦ㄤ腑鍥戒箣澶�
+ * @param {number} lat 绾害
+ * @param {number} lng 缁忓害
+ * @return {boolean]} 杩斿洖缁撴灉鐪熸垨鍋�
+ */
+ outOfChina: function (lat, lng) {
+ if (lat < 72.004 || lat > 137.8347) return true;
+ if (lng < 0.8293 || lng > 55.8271) return true;
+ return false;
+ },
+ 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0) / 3.0;
+ ret += ((20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin((y / 3.0) * this.PI)) * 2.0) / 3.0;
+ ret += ((160.0 * Math.sin((y / 12.0) * this.PI) + 320 * Math.sin((y * this.PI) / 30.0)) * 2.0) / 3.0;
+ return ret;
+ },
+ transformLng: 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0) / 3.0;
+ ret += ((20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin((x / 3.0) * this.PI)) * 2.0) / 3.0;
+ ret += ((150.0 * Math.sin((x / 12.0) * this.PI) + 300.0 * Math.sin((x / 30.0) * this.PI)) * 2.0) / 3.0;
+ return ret;
+ }
+};
diff --git a/web_src/src/components/devicePosition.vue b/web_src/src/components/devicePosition.vue
new file mode 100644
index 0000000..2910623
--- /dev/null
+++ b/web_src/src/components/devicePosition.vue
@@ -0,0 +1,374 @@
+<template>
+ <div id="devicePosition" style="height: 100%">
+ <el-container style="height: 100%">
+ <el-header>
+ <uiHeader></uiHeader>
+ </el-header>
+ <el-main>
+ <div style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center;">
+ <span style="font-size: 1rem; font-weight: 500">璁惧瀹氫綅 ({{ parentChannelId == 0 ? deviceId : parentChannelId }})</span>
+ </div>
+ <div style="background-color: #ffffff; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left; font-size: 14px;">
+ <el-button icon="el-icon-arrow-left" size="mini" style="margin-right: 1rem" type="primary" @click="showDevice">杩斿洖</el-button>
+ <!-- <span class="demonstration">浠�</span> -->
+ <el-date-picker v-model="searchFrom" type="datetime" placeholder="閫夋嫨寮�濮嬫棩鏈熸椂闂�" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker>
+ <el-date-picker v-model="searchTo" type="datetime" placeholder="閫夋嫨缁撴潫鏃ユ湡鏃堕棿" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker>
+ <el-button-group>
+ <el-button icon="el-icon-search" size="mini" type="primary" @click="showHistoryPath">鍘嗗彶杞ㄨ抗</el-button>
+ <el-button icon="el-icon-search" size="mini" style="margin-right: 1rem" type="primary" @click="showLatestPosition">鏈�鏂颁綅缃�</el-button>
+ </el-button-group>
+ <el-tag style="width: 5rem; text-align: center" size="medium">杩囨湡鏃堕棿</el-tag>
+ <el-input-number size="mini" v-model="expired" :min="300" :controls="false" style="width: 4rem;"></el-input-number>
+ <el-tag style="width: 5rem; text-align: center" size="medium">涓婃姤鍛ㄦ湡</el-tag>
+ <el-input-number size="mini" v-model="interval" :min="1" :controls="false" style="width: 4rem;"></el-input-number>
+ <el-button-group>
+ <el-button icon="el-icon-search" size="mini" type="primary" @click="subscribeMobilePosition">浣嶇疆璁㈤槄</el-button>
+ <el-button icon="el-icon-search" size="mini" type="primary" @click="unSubscribeMobilePosition">鍙栨秷璁㈤槄</el-button>
+ </el-button-group>
+ <el-checkbox size="mini" style="margin-right: 1rem; float: right" v-model="autoList" @change="autoListChange" >鑷姩鍒锋柊</el-checkbox>
+ </div>
+ <div class="mapContainer" style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center; height: calc(100% - 10rem);">
+ <div class="baidumap" id="allmap"></div>
+ </div>
+ </el-main>
+ </el-container>
+ </div>
+</template>
+
+<script>
+import uiHeader from "./UiHeader.vue";
+import moment from "moment";
+import geoTools from "./GeoConvertTools.js";
+export default {
+ name: "devicePosition",
+ components: {
+ uiHeader,
+ },
+ data() {
+ return {
+ pickerOptions: {
+ shortcuts: [{
+ text: '浠婂ぉ',
+ onClick(picker) {
+ picker.$emit('pick', new Date());
+ }
+ }, {
+ text: '鏄ㄥぉ',
+ onClick(picker) {
+ const date = new Date();
+ date.setTime(date.getTime() - 3600 * 1000 * 24);
+ picker.$emit('pick', date);
+ }
+ }, {
+ text: '涓�鍛ㄥ墠',
+ onClick(picker) {
+ const date = new Date();
+ date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+ picker.$emit('pick', date);
+ }
+ }]
+ },
+ deviceId: this.$route.params.deviceId,
+ showHistoryPosition: false, //鏄剧ず鍘嗗彶杞ㄨ抗
+ startTime: null,
+ endTime: null,
+ searchFrom: null,
+ searchTo: null,
+ expired: 600,
+ interval: 5,
+ mobilePositionList: [],
+ mapPointList: [],
+ parentChannelId: this.$route.params.parentChannelId,
+ updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織
+ total: 0,
+ beforeUrl: "/videoList",
+ isLoging: false,
+ autoList: false,
+ };
+ },
+ mounted() {
+ this.initData();
+ this.initBaiduMap();
+ if (this.autoList) {
+ this.updateLooper = setInterval(this.initData, 5000);
+ }
+ },
+ destroyed() {
+ // this.$destroy("videojs");
+ clearTimeout(this.updateLooper);
+ },
+ methods: {
+ initData: function () {
+ // if (this.parentChannelId == "" || this.parentChannelId == 0) {
+ // this.getDeviceChannelList();
+ // } else {
+ // this.showSubchannels();
+ // }
+ },
+ initParam: function () {
+ // this.deviceId = this.$route.params.deviceId;
+ // this.parentChannelId = this.$route.params.parentChannelId;
+ // this.currentPage = parseInt(this.$route.params.page);
+ // this.count = parseInt(this.$route.params.count);
+ // if (this.parentChannelId == "" || this.parentChannelId == 0) {
+ // this.beforeUrl = "/videoList";
+ // }
+ },
+ initBaiduMap() {
+ this.map = new BMap.Map("allmap"); // 鍒涘缓鍦板浘瀹炰緥
+ let points = [];
+ let point = new BMap.Point(116.231398, 39.567445); // 鍒涘缓鐐瑰潗鏍�
+ this.map.centerAndZoom(point, 5); // 鍒濆鍖栧湴鍥撅紝璁剧疆涓績鐐瑰潗鏍囧拰鍦板浘绾у埆
+ this.map.enableScrollWheelZoom(true); //寮�鍚紶鏍囨粴杞缉鏀�
+ this.map.addControl(new BMap.NavigationControl());
+ this.map.addControl(new BMap.ScaleControl());
+ this.map.addControl(new BMap.OverviewMapControl());
+ this.map.addControl(new BMap.MapTypeControl());
+ //map.setMapStyle({ style: 'midnight' }) //鍦板浘椋庢牸
+ },
+ currentChange: function (val) {
+ // var url = `/${this.$router.currentRoute.name}/${this.deviceId}/${this.parentChannelId}/${this.count}/${val}`;
+ // console.log(url);
+ // this.$router.push(url).then(() => {
+ // this.initParam();
+ // this.initData();
+ // });
+ },
+ handleSizeChange: function (val) {
+ // var url = `/${this.$router.currentRoute.name}/${this.$router.params.deviceId}/${this.$router.params.parentChannelId}/${val}/1`;
+ // this.$router.push(url).then(() => {
+ // this.initParam();
+ // this.initData();
+ // });
+ },
+ showDevice: function () {
+ this.$router.push(this.beforeUrl).then(() => {
+ this.initParam();
+ this.initData();
+ });
+ },
+ autoListChange: function () {
+ if (this.autoList) {
+ this.updateLooper = setInterval(this.initData, 1500);
+ } else {
+ window.clearInterval(this.updateLooper);
+ }
+ },
+ showHistoryPath: function () {
+ this.map.clearOverlays();
+ this.mapPointList = [];
+ this.mobilePositionList = [];
+ if (!!this.searchFrom) {
+ this.startTime = this.toGBString(this.searchFrom);
+ console.log(this.startTime);
+ } else{
+ this.startTime = null;
+ }
+ if (!!this.searchTo) {
+ this.endTime = this.toGBString(this.searchTo);
+ console.log(this.endTime);
+ } else {
+ this.endTime = null;
+ }
+ let self = this;
+ this.$axios.get(`/api/positions/${this.deviceId}/history`, {
+ params: {
+ start: self.startTime,
+ end: self.endTime,
+ },
+ })
+ .then(function (res) {
+ self.total = res.data.length;
+ self.mobilePositionList = res.data;
+ console.log(self.mobilePositionList);
+ // 闃叉鍑虹幇琛ㄦ牸閿欎綅
+ self.$nextTick(() => {
+ self.showMarkPoints(self);
+ });
+ })
+ .catch(function (error) {
+ console.log(error);
+ });
+ },
+ showLatestPosition: function() {
+ this.map.clearOverlays();
+ this.mapPointList = [];
+ this.mobilePositionList = [];
+ let self = this;
+ this.$axios.get(`/api/positions/${this.deviceId}/latest`)
+ .then(function (res) {
+ console.log(res.data);
+ self.total = res.data.length;
+ self.mobilePositionList.push(res.data);
+ console.log(self.mobilePositionList);
+ // 闃叉鍑虹幇琛ㄦ牸閿欎綅
+ self.$nextTick(() => {
+ self.showMarkPoints(self);
+ });
+ })
+ .catch(function (error) {
+ console.log(error);
+ });
+ },
+ subscribeMobilePosition: function() {
+ let self = this;
+ this.$axios.get(`/api/positions/${this.deviceId}/subscribe`, {
+ params: {
+ expires: self.expired,
+ interval: self.interval,
+ },
+ })
+ .then(function (res) {
+ console.log(res.data);
+ })
+ .catch(function (error) {
+ console.log(error);
+ });
+ },
+ unSubscribeMobilePosition: function() {
+ let self = this;
+ this.$axios.get(`/api/positions/${this.deviceId}/subscribe`, {
+ params: {
+ expires: 0,
+ interval: self.interval,
+ },
+ })
+ .then(function (res) {
+ console.log(res.data);
+ })
+ .catch(function (error) {
+ console.log(error);
+ });
+ },
+ toGBString: function (dateTime) {
+ return (
+ dateTime.getFullYear() +
+ "-" + this.twoDigits(dateTime.getMonth() + 1) +
+ "-" + this.twoDigits(dateTime.getDate()) +
+ "T" + this.twoDigits(dateTime.getHours()) +
+ ":" + this.twoDigits(dateTime.getMinutes()) +
+ ":" + this.twoDigits(dateTime.getSeconds())
+ );
+ },
+ twoDigits: function (num) {
+ if (num < 10) {
+ return "0" + num;
+ } else {
+ return "" + num;
+ }
+ },
+ showMarkPoints: function(self) {
+ let that = self;
+ let npointJ = null;
+ let npointW = null;
+ let point = null;
+ for (let i = 0; i < self.mobilePositionList.length; i++) {
+ if (self.mobilePositionList[i].geodeticSystem == "BD-09") {
+ npointJ = self.mobilePositionList[i].cnLng;
+ npointW = self.mobilePositionList[i].cnLat;
+ point = new BMap.Point(npointJ, npointW);
+ } else {
+ npointJ = self.mobilePositionList[i].longitude;
+ npointW = self.mobilePositionList[i].latitude;
+ let bd2 = geoTools.GPSToBaidu(npointJ, npointW);
+ point = new BMap.Point(bd2.lat, bd2.lng);
+ }
+ self.mapPointList.push(point);
+ let marker = new BMap.Marker(point); // 鍒涘缓鏍囨敞
+ self.map.addOverlay(marker); // 灏嗘爣娉ㄦ坊鍔犲埌鍦板浘涓�
+ //鎻愮ず淇℃伅 鍙互瑙f瀽 HTML鏍囩浠ュ強CSS
+ let infoWindow = new BMap.InfoWindow(`<p style='text-align:left;font-weight:800'>璁惧: ${self.mobilePositionList[i].deviceId}</p>
+ <p style='text-align:left;font-weight:0'>鏃堕棿: ${self.mobilePositionList[i].time}</p>`);
+ // 榧犳爣绉讳笂鏍囨敞鐐硅鍙戠敓鐨勪簨
+ marker.addEventListener("mouseover", function () {
+ this.openInfoWindow(infoWindow);
+ });
+ // 榧犳爣绉诲紑鏍囨敞鐐硅鍙戠敓鐨勪簨
+ marker.addEventListener("mouseout", function () {
+ this.closeInfoWindow(infoWindow);
+ });
+ // 榧犳爣鐐瑰嚮鏍囨敞鐐硅鍙戠敓鐨勪簨鎯�
+ marker.addEventListener("click", function () {
+ alert("鐐瑰嚮");
+ });
+ }
+ let view = that.map.getViewport(eval(self.mapPointList));
+ that.map.centerAndZoom(view.center, view.zoom);
+ },
+ },
+};
+</script>
+
+<style>
+.videoList {
+ display: flex;
+ flex-wrap: wrap;
+ align-content: flex-start;
+}
+
+.video-item {
+ position: relative;
+ width: 15rem;
+ height: 10rem;
+ margin-right: 1rem;
+ background-color: #000000;
+}
+
+.video-item-img {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ margin: auto;
+ width: 100%;
+ height: 100%;
+}
+
+.video-item-img:after {
+ content: "";
+ display: inline-block;
+ position: absolute;
+ z-index: 2;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ margin: auto;
+ width: 3rem;
+ height: 3rem;
+ background-image: url("../assets/loading.png");
+ background-size: cover;
+ background-color: #000000;
+}
+
+.video-item-title {
+ position: absolute;
+ bottom: 0;
+ color: #000000;
+ background-color: #ffffff;
+ line-height: 1.5rem;
+ padding: 0.3rem;
+ width: 14.4rem;
+}
+
+.baidumap {
+ width: 100%;
+ height: 100%;
+ border: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+}
+
+/* 鍘婚櫎鐧惧害鍦板浘鐗堟潈閭h瀛� 鍜� 鐧惧害logo */
+.baidumap > .BMap_cpyCtrl {
+ display: none !important;
+}
+.baidumap > .anchorBL {
+ display: none !important;
+}
+</style>
diff --git a/web_src/src/components/videoList.vue b/web_src/src/components/videoList.vue
index 01dae2c..450d736 100644
--- a/web_src/src/components/videoList.vue
+++ b/web_src/src/components/videoList.vue
@@ -11,7 +11,7 @@
<el-button icon="el-icon-refresh-right" circle size="mini" :loading="getDeviceListLoading" @click="getDeviceList()"></el-button>
</div>
</div>
- <devicePlayer ref="devicePlayer"></devicePlayer>
+ <!-- <devicePlayer ref="devicePlayer"></devicePlayer> -->
<!--璁惧鍒楄〃-->
<el-table :data="deviceList" border style="width: 100%" :height="winHeight">
<el-table-column prop="name" label="鍚嶇О" width="180" align="center">
@@ -40,7 +40,7 @@
</el-table-column>
<el-table-column prop="channelCount" label="閫氶亾鏁�" align="center">
</el-table-column>
- <el-table-column label="鐘舵��" width="180" align="center">
+ <el-table-column label="鐘舵��" width="80" align="center">
<template slot-scope="scope">
<div slot="reference" class="name-wrapper">
<el-tag size="medium" v-if="scope.row.online == 1">鍦ㄧ嚎</el-tag>
@@ -49,10 +49,11 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="240" align="center" fixed="right">
+ <el-table-column label="鎿嶄綔" width="360" align="center" fixed="right">
<template slot-scope="scope">
<el-button size="mini" :ref="scope.row.deviceId + 'refbtn' " icon="el-icon-refresh" @click="refDevice(scope.row)">鍒锋柊閫氶亾</el-button>
<el-button size="mini" icon="el-icon-s-open" v-bind:disabled="scope.row.online==0" type="primary" @click="showChannelList(scope.row)">鏌ョ湅閫氶亾</el-button>
+ <el-button size="mini" icon="el-icon-s-open" v-bind:disabled="scope.row.online==0" type="primary" @click="showDevicePosition(scope.row)">绉诲姩浣嶇疆</el-button>
</template>
</el-table-column>
</el-table>
@@ -73,7 +74,7 @@
</template>
<script>
- import uiHeader from './UiHeader.vue'
+ import uiHeader from './UiHeader.vue'
export default {
name: 'app',
components: {
@@ -155,7 +156,10 @@
console.log(JSON.stringify(row))
this.$router.push(`/channelList/${row.deviceId}/0/15/1`);
},
-
+ showDevicePosition: function(row) {
+ console.log(JSON.stringify(row))
+ this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`);
+ },
//gb28181骞冲彴瀵规帴
//鍒锋柊璁惧淇℃伅
@@ -191,18 +195,18 @@
},
//閫氱煡璁惧涓婁紶濯掍綋娴�
sendDevicePush: function(itemData) {
- let deviceId = this.currentDevice.deviceId;
- let channelId = itemData.channelId;
- console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId);
- let that = this;
- this.$axios({
- method: 'get',
- url: '/api/play/' + deviceId + '/' + channelId
- }).then(function(res) {
- let ssrc = res.data.ssrc;
- that.$refs.devicePlayer.play(ssrc,deviceId,channelId);
- }).catch(function(e) {
- });
+ // let deviceId = this.currentDevice.deviceId;
+ // let channelId = itemData.channelId;
+ // console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId);
+ // let that = this;
+ // this.$axios({
+ // method: 'get',
+ // url: '/api/play/' + deviceId + '/' + channelId
+ // }).then(function(res) {
+ // let ssrc = res.data.ssrc;
+ // that.$refs.devicePlayer.play(ssrc,deviceId,channelId);
+ // }).catch(function(e) {
+ // });
},
transportChange: function (row) {
console.log(row);
diff --git a/web_src/src/main.js b/web_src/src/main.js
index 03bb4a4..5e0696b 100644
--- a/web_src/src/main.js
+++ b/web_src/src/main.js
@@ -12,21 +12,21 @@
import { Notification } from 'element-ui';
import Fingerprint2 from 'fingerprintjs2';
-// 生成唯一ID
+// 鐢熸垚鍞竴ID
Fingerprint2.get(function(components) {
const values = components.map(function(component,index) {
- if (index === 0) { //把微信浏览器里UA的wifi或4G等网络替换成空,不然切换网络会ID不一样
+ if (index === 0) { //鎶婂井淇℃祻瑙堝櫒閲孶A鐨剋ifi鎴�4G绛夌綉缁滄浛鎹㈡垚绌�,涓嶇劧鍒囨崲缃戠粶浼欼D涓嶄竴鏍�
return component.value.replace(/\bNetType\/\w+\b/, '');
}
return component.value;
})
- //console.log(values) //使用的浏览器信息npm
- // 生成最终id
+ //console.log(values) //浣跨敤鐨勬祻瑙堝櫒淇℃伅npm
+ // 鐢熸垚鏈�缁坕d
let port = window.location.port;
console.log(port);
const fingerPrint = Fingerprint2.x64hash128(values.join(port), 31)
Vue.prototype.$browserId = fingerPrint;
- console.log("唯一标识码:" + fingerPrint);
+ console.log("鍞竴鏍囪瘑鐮侊細" + fingerPrint);
});
Vue.use(VueClipboard);
diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js
index b8f8705..e8ff105 100644
--- a/web_src/src/router/index.js
+++ b/web_src/src/router/index.js
@@ -4,6 +4,7 @@
import control from '../components/control.vue'
import videoList from '../components/videoList.vue'
import channelList from '../components/channelList.vue'
+import devicePosition from '../components/devicePosition.vue'
import login from '../components/Login.vue'
const originalPush = VueRouter.prototype.push
@@ -35,5 +36,10 @@
name: 'channelList',
component: channelList,
},
+ {
+ path: '/devicePosition/:deviceId/:parentChannelId/:count/:page',
+ name: 'devicePosition',
+ component: devicePosition,
+ },
]
})
--
Gitblit v1.8.0