From ba8633e99a27b90c55b47e8f7d6225f1f0efc6bb Mon Sep 17 00:00:00 2001 From: 648540858 <456panlinlin> Date: Fri, 8 Apr 2022 18:09:23 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9C=B0=E5=9B=BE-?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E5=9B=BE=E9=A1=B5=E9=9D=A2=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E8=AE=BE=E5=A4=87=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KeepaliveTimeoutListenerForPlatform.java | 1 - .../event/offline/OfflineEventListener.java | 6 +- .../event/online/OnlineEventListener.java | 6 +- .../event/record/RecordEndEventListener.java | 6 +- .../SubscribeListenerForPlatform.java | 1 - .../subscribe/catalog/CatalogEventLister.java | 2 +- .../request/impl/NotifyRequestProcessor.java | 24 +- .../notify/cmd/AlarmNotifyMessageHandler.java | 13 +- .../MobilePositionNotifyMessageHandler.java | 13 +- .../cmd/CatalogResponseMessageHandler.java | 13 +- .../MobilePositionResponseMessageHandler.java | 13 +- .../iot/vmp/gb28181/utils/Coordtransform.java | 126 ++++ .../impl/VideoManagerStorageImpl.java | 2 +- web_src/index.html | 20 +- web_src/package-lock.json | 561 ++++++++++++----- web_src/package.json | 2 +- web_src/src/components/UiHeader.vue | 1 + .../src/components/common/MapComponent.vue | 119 ++++ .../{dialog => common}/jessibuca.vue | 0 web_src/src/components/devicePosition.vue | 573 +++++++----------- .../src/components/dialog/devicePlayer.vue | 2 +- web_src/src/components/live.vue | 2 +- .../src/components/service/DeviceService.js | 127 ++++ web_src/src/components/service/MediaServer.js | 4 +- web_src/src/router/index.js | 14 +- 25 files changed, 1074 insertions(+), 577 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java create mode 100644 web_src/src/components/common/MapComponent.vue rename web_src/src/components/{dialog => common}/jessibuca.vue (100%) create mode 100644 web_src/src/components/service/DeviceService.js diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java index e0e4a270..ef78d371 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java @@ -52,7 +52,6 @@ public class KeepaliveTimeoutListenerForPlatform extends RedisKeyExpirationEvent public void onMessage(Message message, byte[] pattern) { // 获取失效的key String expiredKey = message.toString(); - logger.debug(expiredKey); // 平台心跳到期,需要重发, 判断是否已经多次未收到心跳回复, 多次未收到,则重新发起注册, 注册尝试多次未得到回复,则认为平台离线 String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_"; String PLATFORM_REGISTER_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_"; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java index b7992e4d..46332566 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java @@ -57,10 +57,8 @@ public class OfflineEventListener implements ApplicationListener { @Override public void onApplicationEvent(OfflineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("设备离线事件触发,deviceId:" + event.getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("设备离线事件触发,deviceId:" + event.getDeviceId() + ",from:" + event.getFrom()); String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDeviceId(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java index 755967be..5e4a3d4f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java @@ -58,10 +58,8 @@ public class OnlineEventListener implements ApplicationListener { @Override public void onApplicationEvent(OnlineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("设备上线事件触发,deviceId:" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("设备上线事件触发,deviceId:" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); Device device = event.getDevice(); if (device == null) return; String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java index b2eb7ead..4965026d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -31,10 +31,8 @@ public class RecordEndEventListener implements ApplicationListener handlerMap = new HashMap<>(); @Override public void onApplicationEvent(RecordEndEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), - event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); - } + logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), + event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); if (handlerMap.size() > 0) { for (RecordEndEventHandler recordEndEventHandler : handlerMap.values()) { recordEndEventHandler.handler(event.getRecordInfo()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java index 898e51d6..9f0d0d51 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java @@ -39,7 +39,6 @@ public class SubscribeListenerForPlatform extends RedisKeyExpirationEventMessage public void onMessage(Message message, byte[] pattern) { // 获取失效的key String expiredKey = message.toString(); - logger.debug(expiredKey); // 订阅到期 String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "_"; if (expiredKey.startsWith(PLATFORM_KEEPLIVEKEY_PREFIX)) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index f9546f0c..dd7f394e 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -66,7 +66,7 @@ public class CatalogEventLister implements ApplicationListener { subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); if (subscribe == null) { - logger.debug("发送订阅消息时发现订阅信息已经不存在"); + logger.info("发送订阅消息时发现订阅信息已经不存在"); return; } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java index 8c87be99..680be666 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; @@ -149,11 +150,12 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements logger.info("[收到Notify-MobilePosition]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), mobilePosition.getLongitude(), mobilePosition.getLatitude()); mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } @@ -223,12 +225,12 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index 302ceda1..8977fc4d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; @@ -93,12 +94,12 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java index 471b2d7e..2a53a3fb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java index cc54ec95..b8faf63a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java @@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -215,12 +216,12 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java index dca28660..b070ed52 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java new file mode 100644 index 00000000..5c12ff6c --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java @@ -0,0 +1,126 @@ +package com.genersoft.iot.vmp.gb28181.utils; + +/** + * 坐标转换 + * 一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具类 + * 参考https://github.com/wandergis/coordtransform 写的Java版本 + * @author Xinconan + * @date 2016-03-18 + * @url https://github.com/xinconan/coordtransform + */ +public class Coordtransform { + + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private static double PI = 3.1415926535897932384626; + private static double a = 6378245.0; + private static double ee = 0.00669342162296594323; + + /** + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + * 即 百度 转 谷歌、高德 + * @param bd_lon + * @param bd_lat + * @return Double[lon,lat] + */ + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta); + arr[1] = z * Math.sin(theta); + return arr; + } + + /** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + * 即谷歌、高德 转 百度 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta) + 0.0065; + arr[1] = z * Math.sin(theta) + 0.006; + return arr; + } + + /** + * WGS84转GCJ02 + * @param wgs_lon + * @param wgs_lat + * @return Double[lon,lat] + */ + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ + if(outOfChina(wgs_lon, wgs_lat)){ + return new Double[]{wgs_lon,wgs_lat}; + } + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); + double radlat = wgs_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + Double[] arr = new Double[2]; + arr[0] = wgs_lon + dlng; + arr[1] = wgs_lat + dlat; + return arr; + } + + /** + * GCJ02转WGS84 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ + if(outOfChina(gcj_lon, gcj_lat)){ + return new Double[]{gcj_lon,gcj_lat}; + } + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); + double radlat = gcj_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + double mglat = gcj_lat + dlat; + double mglng = gcj_lon + dlng; + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; + } + + private static Double transformlat(double lng, double lat) { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static Double transformlng(double lng,double lat) { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + + /** + * outOfChina + * @描述: 判断是否在国内,不在国内则不做偏移 + * @param lng + * @param lat + * @return {boolean} + */ + private static boolean outOfChina(Double lng,Double lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); + }; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java index 439ecd87..667a6197 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java @@ -274,7 +274,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { channels = deviceChannelList; } if (stringBuilder.length() > 0) { - logger.debug("[目录查询]收到的数据存在重复: {}" , stringBuilder); + logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); } try { int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels); diff --git a/web_src/index.html b/web_src/index.html index ca1b842e..a287331d 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -12,8 +12,26 @@ -
+ diff --git a/web_src/package-lock.json b/web_src/package-lock.json index b1da39e2..f97b032f 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -14,9 +14,9 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", @@ -57,7 +57,7 @@ "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", - "webpack-dev-server": "^2.11.5", + "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { @@ -65,6 +65,50 @@ "npm": ">= 3.0.0" } }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + }, + "bin": { + "gl-style-composite": "bin/gl-style-composite", + "gl-style-format": "bin/gl-style-format", + "gl-style-migrate": "bin/gl-style-migrate", + "gl-style-validate": "bin/gl-style-validate" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "node_modules/@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" + }, "node_modules/@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -214,6 +258,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1434,34 +1479,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "node_modules/bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "node_modules/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==" - }, - "node_modules/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==" - }, - "node_modules/bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "dependencies": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "node_modules/bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "node_modules/bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -2679,6 +2696,11 @@ "node": ">=8.0.0" } }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", @@ -4880,6 +4902,28 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "node_modules/geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "dependencies": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/geotiff/node_modules/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -5428,8 +5472,7 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "node_modules/iferr": { "version": "0.1.5", @@ -6042,6 +6085,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "node_modules/json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -6106,13 +6154,10 @@ "node": ">=0.10.0" } }, - "node_modules/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==", - "dependencies": { - "uc.micro": "^1.0.1" - } + "node_modules/lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "node_modules/load-json-file": { "version": "2.0.0", @@ -6335,25 +6380,10 @@ "node": ">=0.10.0" } }, - "node_modules/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==", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "node_modules/mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "node_modules/math-expression-evaluator": { "version": "1.3.8", @@ -6378,11 +6408,6 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", @@ -6783,8 +6808,7 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "node_modules/mississippi": { "version": "2.0.0", @@ -7246,6 +7270,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "node_modules/ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "dependencies": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "node_modules/ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -7512,6 +7557,11 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -7612,6 +7662,18 @@ "node": ">=4" } }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, "node_modules/pbkdf2": { "version": "3.1.1", "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", @@ -10613,6 +10675,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "node_modules/proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -10745,6 +10812,19 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "node_modules/quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -10788,6 +10868,14 @@ "node": ">= 0.8" } }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz", @@ -11225,6 +11313,14 @@ "node": ">=4" } }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -11309,6 +11405,11 @@ "aproba": "^1.1.1" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", @@ -11779,6 +11880,22 @@ "node": ">=0.8.0" } }, + "node_modules/sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -11791,6 +11908,18 @@ "node": ">=0.10.0" } }, + "node_modules/sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "dependencies": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", @@ -11983,7 +12112,8 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "node_modules/ssri": { "version": "5.3.0", @@ -12479,11 +12609,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "node_modules/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==" - }, "node_modules/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", @@ -12898,21 +13023,6 @@ "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=" }, - "node_modules/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==", - "dependencies": { - "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" - }, - "peerDependencies": { - "vue": "^2.1.8" - } - }, "node_modules/vue-clipboard2": { "version": "0.3.1", "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz", @@ -13299,6 +13409,16 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" + }, "node_modules/webpack": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", @@ -14116,6 +14236,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", @@ -14244,6 +14369,41 @@ } }, "dependencies": { + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -14360,6 +14520,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -15493,34 +15654,6 @@ "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", @@ -16579,6 +16712,11 @@ "source-map": "^0.6.1" } }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", @@ -18425,6 +18563,27 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "requires": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "dependencies": { + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -18892,8 +19051,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "iferr": { "version": "0.1.5", @@ -19367,6 +19525,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -19419,13 +19582,10 @@ "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" - } + "lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "load-json-file": { "version": "2.0.0", @@ -19604,24 +19764,10 @@ "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==" - } - } + "mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "math-expression-evaluator": { "version": "1.3.8", @@ -19646,11 +19792,6 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "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", "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", @@ -19976,8 +20117,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "mississippi": { "version": "2.0.0", @@ -20372,6 +20512,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "requires": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -20589,6 +20750,11 @@ "safe-buffer": "^5.1.1" } }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -20668,6 +20834,15 @@ "pify": "^3.0.0" } }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, "pbkdf2": { "version": "3.1.1", "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", @@ -23119,6 +23294,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -23230,6 +23410,16 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -23267,6 +23457,14 @@ "unpipe": "1.0.0" } }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz", @@ -23648,6 +23846,14 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -23719,6 +23925,11 @@ "aproba": "^1.1.1" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", @@ -24124,6 +24335,16 @@ } } }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -24133,6 +24354,15 @@ "is-plain-obj": "^1.0.0" } }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", @@ -24296,7 +24526,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "5.3.0", @@ -24703,11 +24934,6 @@ "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", @@ -25072,18 +25298,6 @@ "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", @@ -25421,6 +25635,16 @@ "minimalistic-assert": "^1.0.0" } }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" + }, "webpack": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", @@ -26091,6 +26315,11 @@ "safe-buffer": "~5.1.0" } }, + "xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", diff --git a/web_src/package.json b/web_src/package.json index 20fc3a2b..4fa733e9 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -16,9 +16,9 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", diff --git a/web_src/src/components/UiHeader.vue b/web_src/src/components/UiHeader.vue index 828dda97..3341428f 100644 --- a/web_src/src/components/UiHeader.vue +++ b/web_src/src/components/UiHeader.vue @@ -4,6 +4,7 @@ 控制台 实时监控 国标设备 + 电子地图 推流列表 拉流代理 云端录像 diff --git a/web_src/src/components/common/MapComponent.vue b/web_src/src/components/common/MapComponent.vue new file mode 100644 index 00000000..b9317d71 --- /dev/null +++ b/web_src/src/components/common/MapComponent.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/common/jessibuca.vue similarity index 100% rename from web_src/src/components/dialog/jessibuca.vue rename to web_src/src/components/common/jessibuca.vue diff --git a/web_src/src/components/devicePosition.vue b/web_src/src/components/devicePosition.vue index 777b11ed..2674b0f9 100644 --- a/web_src/src/components/devicePosition.vue +++ b/web_src/src/components/devicePosition.vue @@ -4,388 +4,257 @@ + + +
+ + +
+ +
-
- 设备定位 ({{ parentChannelId == 0 ? deviceId : parentChannelId }}) -
-
- 返回 - - - - - 历史轨迹 - 最新位置 - - 过期时间 - - 上报周期 - - - 位置订阅 - 取消订阅 - - 自动刷新 -
-
-
-
+
+
diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index 2eb3acb4..d3056ce3 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -185,7 +185,7 @@ // import player from '../dialog/rtcPlayer.vue' // import LivePlayer from '@liveqing/liveplayer' // import player from '../dialog/easyPlayer.vue' -import player from '../dialog/jessibuca.vue' +import player from '../common/jessibuca.vue' import recordDownload from '../dialog/recordDownload.vue' export default { name: 'devicePlayer', diff --git a/web_src/src/components/live.vue b/web_src/src/components/live.vue index 82575276..654e921e 100644 --- a/web_src/src/components/live.vue +++ b/web_src/src/components/live.vue @@ -46,7 +46,7 @@ + + diff --git a/web_src/src/components/service/DeviceService.js b/web_src/src/components/service/DeviceService.js index 93c98f6a..aae04189 100644 --- a/web_src/src/components/service/DeviceService.js +++ b/web_src/src/components/service/DeviceService.js @@ -46,21 +46,21 @@ class DeviceService{ } - getAllCatalog(deviceId, callback, errorCallback) { + getAllChannel(isCatalog, deviceId, callback, errorCallback) { let currentPage = 1; let count = 100; let catalogList = [] - this.getAllCatalogIteration(deviceId, catalogList, currentPage, count, callback, errorCallback) + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) } - getAllCatalogIteration(deviceId, catalogList, currentPage, count, callback, errorCallback) { - this.getCatalog(deviceId, currentPage, count, (data) => { + getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) { + this.getChanel(isCatalog, deviceId, currentPage, count, (data) => { console.log(data) if (data.list) { catalogList = catalogList.concat(data.list); if (catalogList.length < data.total) { currentPage ++ - this.getAllCatalogIteration(deviceId, catalogList, currentPage, count, callback, errorCallback) + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) }else { console.log(2222) if (typeof (callback) == "function") callback(catalogList) @@ -68,7 +68,7 @@ class DeviceService{ } }, errorCallback) } - getCatalog(deviceId, currentPage, count, callback, errorCallback) { + getChanel(isCatalog, deviceId, currentPage, count, callback, errorCallback) { this.$axios({ method: 'get', url: `/api/device/query/devices/${deviceId}/channels`, @@ -77,7 +77,7 @@ class DeviceService{ count: count, query: "", online: "", - channelType: true + channelType: isCatalog } }).then((res) =>{ if (typeof (callback) == "function") callback(res.data) @@ -85,29 +85,28 @@ class DeviceService{ } - getAllSubCatalog(deviceId, channelId, callback, errorCallback) { + getAllSubChannel(isCatalog, deviceId, channelId, callback, errorCallback) { let currentPage = 1; let count = 100; let catalogList = [] - this.getAllSubCatalogIteration(deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) } - getAllSubCatalogIteration(deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { - this.getSubCatalog(deviceId, channelId, currentPage, count, (data) => { + getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { + this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { console.log(data) if (data.list) { catalogList = catalogList.concat(data.list); if (catalogList.length < data.total) { currentPage ++ - this.getAllSubCatalogIteration(deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) }else { - console.log(2222) if (typeof (callback) == "function") callback(catalogList) } } }, errorCallback) } - getSubCatalog(deviceId, channelId, currentPage, count, callback, errorCallback) { + getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { this.$axios({ method: 'get', url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, @@ -116,12 +115,22 @@ class DeviceService{ count: count, query: "", online: "", - channelType: true + channelType: isCatalog } }).then((res) =>{ if (typeof (callback) == "function") callback(res.data) }).catch(errorCallback); } + getDeviceTree(deviceId, callback, errorCallback){ + this.$axios({ + method: 'get', + url: `/api/device/query/${deviceId}/tree`, + params:{} + }).then((res) =>{ + console.log(res.data) + if (typeof (callback) == "function") callback(res.data.data) + }).catch(errorCallback); + } } export default DeviceService; diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js index 3869fa3e..273fa8ca 100644 --- a/web_src/src/router/index.js +++ b/web_src/src/router/index.js @@ -15,6 +15,7 @@ import web from '../components/setting/Web.vue' import sip from '../components/setting/Sip.vue' import media from '../components/setting/Media.vue' import live from '../components/live.vue' +import deviceTree from '../components/common/DeviceTree.vue' import wasmPlayer from '../components/common/jessibuca.vue' import rtcPlayer from '../components/dialog/rtcPlayer.vue' @@ -115,5 +116,10 @@ export default new VueRouter({ name: 'rtcPlayer', component: rtcPlayer, }, + { + path: '/test', + name: 'deviceTree', + component: deviceTree, + }, ] }) diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css index 06982714..2a08b07f 100644 --- a/web_src/static/css/iconfont.css +++ b/web_src/static/css/iconfont.css @@ -1,8 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 1291092 */ - src: url('iconfont.woff2?t=1647245982270') format('woff2'), - url('iconfont.woff?t=1647245982270') format('woff'), - url('iconfont.ttf?t=1647245982270') format('truetype'); + src: url('iconfont.woff2?t=1650436696596') format('woff2'); } .iconfont { @@ -13,6 +11,50 @@ -moz-osx-font-smoothing: grayscale; } +.icon-jiedianleizhukongzhongxin1:before { + content: "\e9d0"; +} + +.icon-jiedianleizhukongzhongxin2:before { + content: "\e9d1"; +} + +.icon-jiedianleilianjipingtai:before { + content: "\e9d3"; +} + +.icon-jiedianleiquyu:before { + content: "\e9d4"; +} + +.icon-shebeileigis:before { + content: "\e9ec"; +} + +.icon-shebeileibanqiu:before { + content: "\e9f5"; +} + +.icon-shebeileibanqiugis:before { + content: "\e9f6"; +} + +.icon-shebeileijiankongdian:before { + content: "\ea07"; +} + +.icon-shebeileiqiangjitongdao:before { + content: "\ea15"; +} + +.icon-shebeileiqiuji:before { + content: "\ea17"; +} + +.icon-shebeileiqiujigis:before { + content: "\ea18"; +} + .icon-xitongxinxi:before { content: "\e7d6"; } diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2 index 4833708c2fabdba21bdd9160985cb62f719918cd..7204137aaf543d0e818cfe56aaed1056f957ea87 100644 GIT binary patch literal 54140 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 literal 52504 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 J!EJW*?*KW9L_q)m From 1e2d207aea24b5956d5ece95ed4a9db0f59f34d7 Mon Sep 17 00:00:00 2001 From: 648540858 <456panlinlin> Date: Fri, 22 Apr 2022 16:21:05 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E5=9C=B0=E5=9B=BE=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=B8=80=E5=A4=84=E7=99=BE=E5=BA=A6=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E7=9B=B8=E5=85=B3=E7=9A=84api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/gb28181/bean/DeviceChannel.java | 2 +- .../vmp/storager/IVideoManagerStorage.java | 9 +- .../vmp/storager/dao/DeviceChannelMapper.java | 18 - .../dao/DeviceMobilePositionMapper.java | 4 +- .../impl/VideoManagerStorageImpl.java | 10 +- .../iot/vmp/utils/node/BaseNode.java | 74 --- .../iot/vmp/utils/node/ForestNode.java | 31 - .../iot/vmp/utils/node/ForestNodeManager.java | 68 --- .../iot/vmp/utils/node/ForestNodeMerger.java | 51 -- .../genersoft/iot/vmp/utils/node/INode.java | 42 -- .../iot/vmp/utils/node/TreeNode.java | 42 -- .../vmp/vmanager/bean/DeviceChannelTree.java | 121 ---- .../vmanager/bean/DeviceChannelTreeNode.java | 56 -- .../MobilePositionController.java | 18 +- .../vmanager/gb28181/device/DeviceQuery.java | 8 - web_src/index.html | 2 +- web_src/package-lock.json | 36 +- web_src/package.json | 1 + web_src/src/api/deviceApi.js | 19 - web_src/src/components/DeviceList.vue | 2 +- web_src/src/components/channelTree.vue | 70 --- web_src/src/components/channelTreeItem.vue | 74 --- web_src/src/components/common/DeviceTree.vue | 11 +- .../src/components/common/MapComponent.vue | 168 +++++- web_src/src/components/devicePosition.vue | 551 ++++++++++-------- .../components/dialog/channelMapInfobox.vue | 65 +++ web_src/src/components/dialog/queryTrace.vue | 100 ++++ web_src/src/components/live.vue | 98 ++-- .../src/components/service/DeviceService.js | 15 +- web_src/src/layout/UiHeader.vue | 2 +- web_src/src/router/index.js | 5 + web_src/static/images/arrow.png | Bin 0 -> 5053 bytes web_src/static/images/gis/camera-offline.png | Bin 0 -> 8891 bytes web_src/static/images/gis/camera.png | Bin 0 -> 10315 bytes web_src/static/images/gis/camera1-offline.png | Bin 0 -> 10463 bytes web_src/static/images/gis/camera1.png | Bin 0 -> 13055 bytes web_src/static/images/gis/camera2-offline.png | Bin 0 -> 10061 bytes web_src/static/images/gis/camera2.png | Bin 0 -> 12553 bytes web_src/static/images/gis/camera3-offline.png | Bin 0 -> 10460 bytes web_src/static/images/gis/camera3.png | Bin 0 -> 13009 bytes 40 files changed, 732 insertions(+), 1041 deletions(-) delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/INode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java delete mode 100644 web_src/src/api/deviceApi.js delete mode 100644 web_src/src/components/channelTree.vue delete mode 100644 web_src/src/components/channelTreeItem.vue create mode 100644 web_src/src/components/dialog/channelMapInfobox.vue create mode 100644 web_src/src/components/dialog/queryTrace.vue create mode 100644 web_src/static/images/arrow.png create mode 100644 web_src/static/images/gis/camera-offline.png create mode 100644 web_src/static/images/gis/camera.png create mode 100644 web_src/static/images/gis/camera1-offline.png create mode 100644 web_src/static/images/gis/camera1.png create mode 100644 web_src/static/images/gis/camera2-offline.png create mode 100644 web_src/static/images/gis/camera2.png create mode 100644 web_src/static/images/gis/camera3-offline.png create mode 100644 web_src/static/images/gis/camera3.png diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 1e6ef773..95576f38 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -4,7 +4,7 @@ public class DeviceChannel { /** - * 数据库自赠ID + * 数据库自增ID */ private int id; diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java index d57f8127..d3a9ae9e 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java @@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageInfo; @@ -94,12 +93,6 @@ public interface IVideoManagerStorage { public List queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); - /** - * 获取某个设备的通道树 - * @param deviceId 设备ID - * @return - */ - List tree(String deviceId); /** * 获取某个设备的通道列表 @@ -285,7 +278,7 @@ public interface IVideoManagerStorage { * @param startTime * @param endTime */ - public List queryMobilePositions(String deviceId, String startTime, String endTime); + public List queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); /** * 查询最新移动位置 diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index c1ff7a6c..312d3e03 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -2,7 +2,6 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannelInPlatform; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -236,23 +235,6 @@ public interface DeviceChannelMapper { @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") List queryOnlineChannelsByDeviceId(String deviceId); - @Select(" SELECT\n" + - " id,\n" + - " channelId,\n" + - " deviceId,\n" + - " parentId,\n" + - " status,\n" + - " name as title,\n" + - " channelId as \"value\",\n" + - " channelId as \"key\",\n" + - " longitude,\n" + - " latitude,\n" + - " PTZType,\n" + - " subCount\n" + - " from device_channel\n" + - " where deviceId = #{deviceId}") - List tree(String deviceId); - @Delete(value = {" "}) - List queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); + List queryPositionByDeviceIdAndTime(String deviceId, String channelId, String startTime, String endTime); @Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + " ORDER BY time DESC LIMIT 1") diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java index 5d0031f0..661a69b3 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java @@ -13,8 +13,6 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.*; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.utils.node.ForestNodeMerger; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -354,10 +352,6 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); } - @Override - public List tree(String deviceId) { - return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); - } @Override public List queryChannelsByDeviceId(String deviceId) { @@ -504,8 +498,8 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { * @param endTime */ @Override - public synchronized List queryMobilePositions(String deviceId, String startTime, String endTime) { - return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime); + public synchronized List queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) { + return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java deleted file mode 100644 index 89e35a54..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.util.ArrayList; -import java.util.List; - -/** - * 节点基类 - * - */ -public class BaseNode implements INode { - - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - protected String channelId; - - /** - * 父节点ID - */ - protected String parentId; - - /** - * 子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - protected List children = new ArrayList(); - - /** - * 是否有子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - /** - * 是否有子孙节点 - * - * @return Boolean - */ - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public String getChannelId() { - return channelId; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public List getChildren() { - return children; - } - - public void setChildren(List children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java deleted file mode 100644 index d983c56b..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 森林节点类 - * - */ -public class ForestNode extends BaseNode { - - private static final long serialVersionUID = 1L; - - /** - * 节点内容 - */ - private Object content; - - public ForestNode(String id, String parentId, Object content) { - this.channelId = id; - this.parentId = parentId; - this.content = content; - } - - public Object getContent() { - return content; - } - - public void setContent(Object content) { - this.content = content; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java deleted file mode 100644 index affce9d1..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 森林管理类 - * - * @author smallchill - */ -public class ForestNodeManager> { - - /** - * 森林的所有节点 - */ - private final ImmutableMap nodeMap; - - /** - * 森林的父节点ID - */ - private final Map parentIdMap = Maps.newHashMap(); - - public ForestNodeManager(List nodes) { - nodeMap = Maps.uniqueIndex(nodes, INode::getChannelId); - } - - /** - * 根据节点ID获取一个节点 - * - * @param id 节点ID - * @return 对应的节点对象 - */ - public INode getTreeNodeAt(String id) { - if (nodeMap.containsKey(id)) { - return nodeMap.get(id); - } - return null; - } - - /** - * 增加父节点ID - * - * @param parentId 父节点ID - */ - public void addParentId(String parentId) { - parentIdMap.put(parentId, ""); - } - - /** - * 获取树的根节点(一个森林对应多颗树) - * - * @return 树的根节点集合 - */ - public List getRoot() { - List roots = new ArrayList<>(); - nodeMap.forEach((key, node) -> { - if (node.getParentId() == null || parentIdMap.containsKey(node.getChannelId())) { - roots.add(node); - } - }); - return roots; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java deleted file mode 100644 index 8df6f503..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.genersoft.iot.vmp.utils.CollectionUtil; - -import java.util.List; - -/** - * 森林节点归并类 - * - */ -public class ForestNodeMerger { - - /** - * 将节点数组归并为一个森林(多棵树)(填充节点的children域) - * 时间复杂度为O(n^2) - * - * @param items 节点域 - * @return 多棵树的根节点集合 - */ - public static > List merge(List items) { - ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (node != null) { - node.getChildren().add(forestNode); - } else { - forestNodeManager.addParentId(forestNode.getChannelId()); - } - } - }); - return forestNodeManager.getRoot(); - } - - public static > List merge(List items, String[] parentIds) { - ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (CollectionUtil.contains(parentIds, forestNode.getChannelId())){ - forestNodeManager.addParentId(forestNode.getChannelId()); - } else { - if (node != null){ - node.getChildren().add(forestNode); - } - } - } - }); - return forestNodeManager.getRoot(); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java deleted file mode 100644 index 27727470..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import java.io.Serializable; -import java.util.List; - -/** - * - * 节点 - */ -public interface INode extends Serializable { - - /** - * 主键 - * - * @return String - */ - String getChannelId(); - - /** - * 父主键 - * - * @return String - */ - String getParentId(); - - /** - * 子孙节点 - * - * @return List - */ - List getChildren(); - - /** - * 是否有子孙节点 - * - * @return Boolean - */ - default Boolean getHasChildren() { - return false; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java deleted file mode 100644 index 71f1b2b5..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 树型节点类 - * - */ -public class TreeNode extends BaseNode { - - private static final long serialVersionUID = 1L; - - private String title; - - private String key; - - private String value; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java deleted file mode 100644 index 73928a46..00000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.utils.node.INode; -import io.swagger.annotations.ApiModel; - -import java.util.ArrayList; -import java.util.List; - -@ApiModel(value = "DeviceChannelTree对象", description = "DeviceChannelTree对象") -public class DeviceChannelTree extends DeviceChannel implements INode { - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - private int id; - - /** - * 父节点ID - */ - private String parentId; - - private String parentName; - - private String title; - - private String key; - - private String value; - - /** - * 子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List children; - - /** - * 是否有子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - @Override - public List getChildren() { - if (this.children == null) { - this.children = new ArrayList<>(); - } - return this.children; - } - - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public int getId() { - return id; - } - - @Override - public void setId(int id) { - this.id = id; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public void setParentId(String parentId) { - this.parentId = parentId; - } - - public String getParentName() { - return parentName; - } - - public void setParentName(String parentName) { - this.parentName = parentName; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public void setChildren(List children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java deleted file mode 100644 index 96577d1f..00000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.genersoft.iot.vmp.utils.node.TreeNode; - -public class DeviceChannelTreeNode extends TreeNode { - - private Integer status; - - private String deviceId; - - private String channelId; - - private Double lng; - - private Double lat; - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getChannelId() { - return channelId; - } - - public void setChannelId(String channelId) { - this.channelId = channelId; - } - - public Double getLng() { - return lng; - } - - public void setLng(Double lng) { - this.lng = lng; - } - - public Double getLat() { - return lat; - } - - public void setLat(Double lat) { - this.lat = lat; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java index c360843d..7d11b15c 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.util.StringUtil; import io.swagger.annotations.Api; @@ -65,10 +66,11 @@ public class MobilePositionController { @ApiImplicitParam(name = "start", value = "开始时间", required = true, dataTypeClass = String.class), @ApiImplicitParam(name = "end", value = "结束时间", required = true, dataTypeClass = String.class), }) - @GetMapping("/history/{deviceId}") - public ResponseEntity> positions(@PathVariable String deviceId, - @RequestParam(required = false) String start, - @RequestParam(required = false) String end) { + @GetMapping("/history/{deviceId}/{channelId}") + public ResponseEntity>> positions(@PathVariable String deviceId, + @PathVariable String channelId, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { // if (logger.isDebugEnabled()) { // logger.debug("查询设备" + deviceId + "的历史轨迹"); // } @@ -79,9 +81,11 @@ public class MobilePositionController { if (StringUtil.isEmpty(end)) { end = null; } - - List result = storager.queryMobilePositions(deviceId, start, end); - return new ResponseEntity<>(result, HttpStatus.OK); + WVPResult> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + List result = storager.queryMobilePositions(deviceId, channelId, start, end); + wvpResult.setData(result); + return new ResponseEntity<>(wvpResult, HttpStatus.OK); } /** diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 38cbdee1..ab153ad4 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; -import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -17,14 +16,12 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.kxml2.wap.wv.WV; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -450,11 +447,6 @@ public class DeviceQuery { return result; } - @GetMapping("/{deviceId}/tree") - @ApiOperation(value = "通道树形结构", notes = "通道树形结构") - public WVPResult> tree(@PathVariable String deviceId) { - return WVPResult.Data(storager.tree(deviceId)); - } @GetMapping("/{deviceId}/sync_status") @ApiOperation(value = "获取通道同步进度", notes = "获取通道同步进度") diff --git a/web_src/index.html b/web_src/index.html index df23a7f9..24d5ee24 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -28,7 +28,7 @@ // 默认地图中心点 center:[116.41020, 39.915119], // 地图最大层级 - maxZoom:19, + maxZoom:18, // 地图最小层级 minZoom: 3 } diff --git a/web_src/package-lock.json b/web_src/package-lock.json index f97b032f..0d4c886c 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -16,6 +16,7 @@ "moment": "^2.29.1", "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", @@ -11880,6 +11881,16 @@ "node": ">=0.8.0" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/sort-asc": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", @@ -12978,13 +12989,11 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -24308,6 +24317,14 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -25260,10 +25277,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validate-npm-package-license": { "version": "3.0.4", diff --git a/web_src/package.json b/web_src/package.json index 4fa733e9..1e7f0432 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -18,6 +18,7 @@ "moment": "^2.29.1", "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", diff --git a/web_src/src/api/deviceApi.js b/web_src/src/api/deviceApi.js deleted file mode 100644 index 830164f4..00000000 --- a/web_src/src/api/deviceApi.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; - -export const tree = (deviceId) => { - return axios({ - url: `/api/device/query/${deviceId}/tree`, - method: 'get' - }) -} - -export const deviceList = (page, count) => { - return axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page, - count - } - }) -} \ No newline at end of file diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue index d934fe60..62cba31f 100644 --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -194,7 +194,7 @@ export default { this.$router.push(`/channelList/${row.deviceId}/0/15/1`); }, showDevicePosition: function (row) { - this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); + this.$router.push(`/map?deviceId=${row.deviceId}`); }, //gb28181平台对接 diff --git a/web_src/src/components/channelTree.vue b/web_src/src/components/channelTree.vue deleted file mode 100644 index ae9eac7b..00000000 --- a/web_src/src/components/channelTree.vue +++ /dev/null @@ -1,70 +0,0 @@ - - \ No newline at end of file diff --git a/web_src/src/components/channelTreeItem.vue b/web_src/src/components/channelTreeItem.vue deleted file mode 100644 index 7f2a2a59..00000000 --- a/web_src/src/components/channelTreeItem.vue +++ /dev/null @@ -1,74 +0,0 @@ - - diff --git a/web_src/src/components/common/DeviceTree.vue b/web_src/src/components/common/DeviceTree.vue index 43a797bd..fab895fd 100644 --- a/web_src/src/components/common/DeviceTree.vue +++ b/web_src/src/components/common/DeviceTree.vue @@ -1,10 +1,10 @@