Merge pull request #446 from 648540858/map
Map
29个文件已修改
15个文件已添加
1 文件已重命名
11个文件已删除
| | |
| | | |
| | | |
| | | /** |
| | | * 数据库自赠ID |
| | | * 数据库自增ID |
| | | */ |
| | | private int id; |
| | | |
| | |
| | | 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() + "_"; |
| | |
| | |
|
| | | @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();
|
| | |
|
| | |
| | |
|
| | | @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();
|
| | |
| | | private Map<String, RecordEndEventHandler> 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()); |
| | |
| | | subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); |
| | | |
| | | if (subscribe == null) { |
| | | logger.debug("发送订阅消息时发现订阅信息已经不存在"); |
| | | logger.info("发送订阅消息时发现订阅信息已经不存在"); |
| | | return; |
| | | } |
| | | }else { |
| | |
| | | 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; |
| | |
| | | logger.info("[收到 移动位置订阅]:{}/{}->{}.{}", 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); |
| | | } |
| | |
| | | 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); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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()); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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()); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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()); |
| | | } |
New file |
| | |
| | | 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); |
| | | }; |
| | | |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | |
| | | public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); |
| | | |
| | | /** |
| | | * 获取某个设备的通道树 |
| | | * @param deviceId 设备ID |
| | | * @return |
| | | */ |
| | | List<DeviceChannelTree> tree(String deviceId); |
| | | |
| | | /** |
| | | * 获取某个设备的通道列表 |
| | |
| | | * @param count |
| | | * @return |
| | | */ |
| | | PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count); |
| | | PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, Boolean online, int page, int count); |
| | | |
| | | |
| | | /** |
| | |
| | | * @param startTime |
| | | * @param endTime |
| | | */ |
| | | public List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime); |
| | | public List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); |
| | | |
| | | /** |
| | | * 查询最新移动位置 |
| | |
| | | |
| | | 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; |
| | |
| | | |
| | | @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") |
| | | List<DeviceChannel> 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" + |
| | | " from device_channel\n" + |
| | | " where deviceId = #{deviceId}") |
| | | List<DeviceChannelTree> tree(String deviceId); |
| | | |
| | | @Delete(value = {" <script>" + |
| | | "DELETE " + |
| | |
| | | |
| | | @Select(value = {" <script>" + |
| | | "SELECT * FROM device_mobile_position" + |
| | | " WHERE deviceId = #{deviceId} " + |
| | | " WHERE deviceId = #{deviceId} and channelId = #{channelId} " + |
| | | "<if test=\"startTime != null\"> AND time>=#{startTime}</if>" + |
| | | "<if test=\"endTime != null\"> AND time<=#{endTime}</if>" + |
| | | " ORDER BY time ASC" + |
| | | " </script>"}) |
| | | List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); |
| | | List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String channelId, String startTime, String endTime); |
| | | |
| | | @Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + |
| | | " ORDER BY time DESC LIMIT 1") |
| | |
| | | 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; |
| | |
| | | return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceChannelTree> tree(String deviceId) { |
| | | return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { |
| | | public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { |
| | | PageHelper.startPage(page, count); |
| | | List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, null, null, null); |
| | | List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online); |
| | | return new PageInfo<>(all); |
| | | } |
| | | |
| | |
| | | * @param endTime |
| | | */ |
| | | @Override |
| | | public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime) { |
| | | return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime); |
| | | public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) { |
| | | return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime); |
| | | } |
| | | |
| | | @Override |
| | |
| | | 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; |
| | |
| | | @ApiImplicitParam(name = "start", value = "开始时间", required = true, dataTypeClass = String.class), |
| | | @ApiImplicitParam(name = "end", value = "结束时间", required = true, dataTypeClass = String.class), |
| | | }) |
| | | @GetMapping("/history/{deviceId}") |
| | | public ResponseEntity<List<MobilePosition>> positions(@PathVariable String deviceId, |
| | | @RequestParam(required = false) String start, |
| | | @RequestParam(required = false) String end) { |
| | | @GetMapping("/history/{deviceId}/{channelId}") |
| | | public ResponseEntity<WVPResult<List<MobilePosition>>> positions(@PathVariable String deviceId, |
| | | @PathVariable String channelId, |
| | | @RequestParam(required = false) String start, |
| | | @RequestParam(required = false) String end) { |
| | | // if (logger.isDebugEnabled()) { |
| | | // logger.debug("查询设备" + deviceId + "的历史轨迹"); |
| | | // } |
| | |
| | | if (StringUtil.isEmpty(end)) { |
| | | end = null; |
| | | } |
| | | |
| | | List<MobilePosition> result = storager.queryMobilePositions(deviceId, start, end); |
| | | return new ResponseEntity<>(result, HttpStatus.OK); |
| | | WVPResult<List<MobilePosition>> wvpResult = new WVPResult<>(); |
| | | wvpResult.setCode(0); |
| | | List<MobilePosition> result = storager.queryMobilePositions(deviceId, channelId, start, end); |
| | | wvpResult.setData(result); |
| | | return new ResponseEntity<>(wvpResult, HttpStatus.OK); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), |
| | | @ApiImplicitParam(name="count", value = "每页条数", required = true, dataTypeClass = Integer.class), |
| | | @ApiImplicitParam(name="query", value = "查询内容", dataTypeClass = String.class), |
| | | @ApiImplicitParam(name="online", value = "是否在线", dataTypeClass = String.class), |
| | | @ApiImplicitParam(name="online", value = "是否在线", dataTypeClass = Boolean.class), |
| | | @ApiImplicitParam(name="channelType", value = "通道类型, 子目录", dataTypeClass = Boolean.class), |
| | | }) |
| | | @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") |
| | |
| | | int page, |
| | | int count, |
| | | @RequestParam(required = false) String query, |
| | | @RequestParam(required = false) String online, |
| | | @RequestParam(required = false) Boolean online, |
| | | @RequestParam(required = false) Boolean channelType){ |
| | | |
| | | // if (logger.isDebugEnabled()) { |
| | |
| | | return result; |
| | | } |
| | | |
| | | @GetMapping("/{deviceId}/tree") |
| | | @ApiOperation(value = "通道树形结构", notes = "通道树形结构") |
| | | public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) { |
| | | return WVPResult.Data(storager.tree(deviceId)); |
| | | } |
| | | |
| | | @GetMapping("/{deviceId}/sync_status") |
| | | @ApiOperation(value = "获取通道同步进度", notes = "获取通道同步进度") |
| | |
| | | <script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script> |
| | | <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script> |
| | | <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script> |
| | | <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=rk73w8dv1rkE4UdZsataG68VarhYQzrx&s=1"></script> |
| | | <div id="app"></div> |
| | | <!-- built files will be auto injected --> |
| | | <script> |
| | | // map组件全局参数 |
| | | window.mapParam = { |
| | | // 坐标系 GCJ-02 WGS-84, 默认WGS-84 |
| | | coordinateSystem: "GCJ-02", |
| | | // 地图瓦片地址 |
| | | tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", |
| | | // 瓦片大小 |
| | | tileSize: 256, |
| | | // 默认层级 |
| | | zoom:10, |
| | | // 默认地图中心点 |
| | | center:[116.41020, 39.915119], |
| | | // 地图最大层级 |
| | | maxZoom:18, |
| | | // 地图最小层级 |
| | | minZoom: 3 |
| | | } |
| | | </script> |
| | | </body> |
| | | </html> |
| | |
| | | "element-ui": "^2.15.6", |
| | | "fingerprintjs2": "^2.1.2", |
| | | "moment": "^2.29.1", |
| | | "ol": "^6.14.1", |
| | | "postcss-pxtorem": "^5.1.1", |
| | | "uuid": "^8.3.2", |
| | | "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", |
| | |
| | | "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": { |
| | | "node": ">= 6.0.0", |
| | | "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", |
| | |
| | | "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" |
| | | } |
| | |
| | | "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", |
| | |
| | | "engines": { |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | }, |
| | | "engines": { |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | }, |
| | | "engines": { |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "dependencies": { |
| | | "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", |
| | |
| | | "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", |
| | | "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", |
| | |
| | | "dev": true, |
| | | "dependencies": { |
| | | "is-plain-obj": "^1.0.0" |
| | | }, |
| | | "engines": { |
| | | "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/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", |
| | |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | "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": { |
| | |
| | | "version": "2.6.12", |
| | | "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", |
| | |
| | | "dependencies": { |
| | | "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", |
| | |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | "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", |
| | |
| | | "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" |
| | | } |
| | |
| | | "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", |
| | |
| | | "mdn-data": "2.0.4", |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "dev": true, |
| | | "requires": { |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "http-errors": "1.7.2", |
| | | "iconv-lite": "0.4.24", |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "requires": { |
| | | "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", |
| | |
| | | "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": { |
| | |
| | | } |
| | | } |
| | | }, |
| | | "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", |
| | |
| | | "dev": true, |
| | | "requires": { |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "version": "2.6.12", |
| | | "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", |
| | |
| | | "requires": { |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "element-ui": "^2.15.6", |
| | | "fingerprintjs2": "^2.1.2", |
| | | "moment": "^2.29.1", |
| | | "ol": "^6.14.1", |
| | | "postcss-pxtorem": "^5.1.1", |
| | | "uuid": "^8.3.2", |
| | | "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", |
| | |
| | | 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平台对接 |
New file |
| | |
| | | <template> |
| | | <div id="DeviceTree" style="width: 100%;height: 100%; background-color: #FFFFFF; overflow: auto"> |
| | | <el-container> |
| | | <el-header>设备列表</el-header> |
| | | <el-main style="background-color: #ffffff;"> |
| | | <div class="device-tree-main-box"> |
| | | <el-tree :props="defaultProps" :load="loadNode" lazy @node-click="handleNodeClick"@node-contextmenu="handleContextMenu" style="min-width: 100%; display:inline-block !important;"> |
| | | <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%"> |
| | | <span v-if="node.data.type === 0 && node.data.online" title="在线设备" class="device-online iconfont icon-jiedianleizhukongzhongxin2"></span> |
| | | <span v-if="node.data.type === 0 && !node.data.online " title="离线设备" class="device-offline iconfont icon-jiedianleizhukongzhongxin2"></span> |
| | | <span v-if="node.data.type === 2 && node.data.online" title="目录" class="device-online iconfont icon-jiedianleilianjipingtai"></span> |
| | | <span v-if="node.data.type === 2 && !node.data.online" title="目录" class="device-offline iconfont icon-jiedianleilianjipingtai"></span> |
| | | <span v-if="node.data.type === 3 && node.data.online " title="在线通道" class="device-online iconfont icon-shebeileijiankongdian"></span> |
| | | <span v-if="node.data.type === 3 && !node.data.online" title="在线通道" class="device-offline iconfont icon-shebeileijiankongdian"></span> |
| | | <span v-if="node.data.type === 4 && node.data.online " title="在线通道-球机" class="device-online iconfont icon-shebeileiqiuji"></span> |
| | | <span v-if="node.data.type === 4 && !node.data.online" title="在线通道-球机" class="device-offline iconfont icon-shebeileiqiuji"></span> |
| | | <span v-if="node.data.type === 5 && node.data.online " title="在线通道-半球" class="device-online iconfont icon-shebeileibanqiu"></span> |
| | | <span v-if="node.data.type === 5 && !node.data.online" title="在线通道-半球" class="device-offline iconfont icon-shebeileibanqiu"></span> |
| | | <span v-if="node.data.type === 6 && node.data.online " title="在线通道-枪机" class="device-online iconfont icon-shebeileiqiangjitongdao"></span> |
| | | <span v-if="node.data.type === 6 && !node.data.online" title="在线通道-枪机" class="device-offline iconfont icon-shebeileiqiangjitongdao"></span> |
| | | <span v-if="node.data.online" style="padding-left: 1px" class="device-online">{{ node.label }}</span> |
| | | <span v-if="!node.data.online" style="padding-left: 1px" class="device-offline">{{ node.label }}</span> |
| | | <span> |
| | | <i v-if="node.data.hasGPS && node.data.online" style="color: #9d9d9d" class="device-online iconfont icon-dizhi"></i> |
| | | <i v-if="node.data.hasGPS && !node.data.online" style="color: #9d9d9d" class="device-offline iconfont icon-dizhi"></i> |
| | | </span> |
| | | </span> |
| | | </el-tree> |
| | | </div> |
| | | </el-main> |
| | | </el-container> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import DeviceService from "../service/DeviceService.js"; |
| | | |
| | | export default { |
| | | name: 'DeviceTree', |
| | | data() { |
| | | return { |
| | | deviceService: new DeviceService(), |
| | | defaultProps: { |
| | | children: 'children', |
| | | label: 'name', |
| | | isLeaf: 'isLeaf' |
| | | } |
| | | }; |
| | | }, |
| | | props: ['clickEvent', 'contextMenuEvent'], |
| | | methods: { |
| | | handleNodeClick(data,node,element) { |
| | | console.log("点击事件") |
| | | console.log(data) |
| | | if(typeof (this.clickEvent) == "function") { |
| | | this.clickEvent(data.userData) |
| | | } |
| | | }, |
| | | handleContextMenu(event,data,node,element) { |
| | | console.log("右键点击事件") |
| | | if(typeof (this.contextMenuEvent) == "function") { |
| | | this.contextMenuEvent(event, data.userData) |
| | | } |
| | | }, |
| | | loadNode: function(node, resolve){ |
| | | if (node.level === 0) { |
| | | this.deviceService.getAllDeviceList((data)=>{ |
| | | console.log(data) |
| | | if (data.length > 0) { |
| | | let nodeList = [] |
| | | for (let i = 0; i < data.length; i++) { |
| | | console.log(data[i].name) |
| | | let node = { |
| | | name: data[i].name || data[i].deviceId, |
| | | isLeaf: false, |
| | | id: data[i].deviceId, |
| | | type: data[i].online, |
| | | online: data[i].online === 1, |
| | | userData: data[i] |
| | | } |
| | | nodeList.push(node); |
| | | } |
| | | resolve(nodeList) |
| | | }else { |
| | | resolve([]) |
| | | } |
| | | }, (error)=>{ |
| | | |
| | | }) |
| | | } |
| | | if (node.level === 1) { |
| | | this.deviceService.getAllChannel(true, node.data.id, (catalogData) => { |
| | | this.deviceService.getAllChannel(false, node.data.id, (channelData) => { |
| | | let data = catalogData.concat(channelData) |
| | | this.channelDataHandler(data, resolve) |
| | | }) |
| | | }) |
| | | }else if (node.level > 1){ |
| | | this.deviceService.getAllSubChannel(true, node.data.deviceId, node.data.id, (catalogData)=>{ |
| | | this.deviceService.getAllSubChannel(false, node.data.deviceId, node.data.id, (channelData)=>{ |
| | | let data = catalogData.concat(channelData) |
| | | this.channelDataHandler(data, resolve) |
| | | }) |
| | | }) |
| | | } |
| | | }, |
| | | channelDataHandler: function (data, resolve) { |
| | | if (data.length > 0) { |
| | | let nodeList = [] |
| | | for (let i = 0; i < data.length; i++) { |
| | | let type = 3; |
| | | if (data[i].subCount > 0) { |
| | | type = 2; |
| | | }else if (data[i].ptztype === 1 ) { // 1-球机;2-半球;3-固定枪机;4-遥控枪机 |
| | | type = 4; |
| | | }else if (data[i].ptztype === 2) { |
| | | type = 5; |
| | | }else if (data[i].ptztype === 3 || data[i].ptztype === 4) { |
| | | type = 6; |
| | | } |
| | | let node = { |
| | | name: data[i].name || data[i].channelId, |
| | | isLeaf: data[i].subCount === 0, |
| | | id: data[i].channelId, |
| | | deviceId: data[i].deviceId, |
| | | type: type, |
| | | online: data[i].status === 1, |
| | | hasGPS: data[i].longitude*data[i].latitude !== 0, |
| | | userData: data[i] |
| | | } |
| | | nodeList.push(node); |
| | | } |
| | | resolve(nodeList) |
| | | }else { |
| | | resolve([]) |
| | | } |
| | | } |
| | | }, |
| | | destroyed() { |
| | | // if (this.jessibuca) { |
| | | // this.jessibuca.destroy(); |
| | | // } |
| | | // this.playing = false; |
| | | // this.loaded = false; |
| | | // this.performance = ""; |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style> |
| | | .device-tree-main-box{ |
| | | text-align: left; |
| | | } |
| | | .device-online{ |
| | | color: #252525; |
| | | } |
| | | .device-offline{ |
| | | color: #727272; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div id="mapContainer" ref="mapContainer" style="width: 100%;height: 100%;"></div> |
| | | </template> |
| | | |
| | | <script> |
| | | import 'ol/ol.css'; |
| | | import Map from 'ol/Map'; |
| | | import OSM from 'ol/source/OSM'; |
| | | import XYZ from 'ol/source/XYZ'; |
| | | import VectorSource from 'ol/source/Vector'; |
| | | import Tile from 'ol/layer/Tile'; |
| | | import VectorLayer from 'ol/layer/Vector'; |
| | | import Style from 'ol/style/Style'; |
| | | import Icon from 'ol/style/Icon'; |
| | | import View from 'ol/View'; |
| | | import Feature from 'ol/Feature'; |
| | | import Overlay from 'ol/Overlay'; |
| | | import {Point, LineString} from 'ol/geom'; |
| | | import {get as getProj, fromLonLat} from 'ol/proj'; |
| | | import {ZoomSlider, Zoom} from 'ol/control'; |
| | | import {containsCoordinate} from 'ol/extent'; |
| | | |
| | | import {v4} from 'uuid' |
| | | |
| | | let olMap = null; |
| | | |
| | | export default { |
| | | name: 'MapComponent', |
| | | data() { |
| | | return { |
| | | |
| | | |
| | | }; |
| | | }, |
| | | created(){ |
| | | this.$nextTick(() => { |
| | | setTimeout(()=>{ |
| | | this.init() |
| | | }, 100) |
| | | }) |
| | | |
| | | }, |
| | | props: [], |
| | | mounted () { |
| | | |
| | | }, |
| | | methods: { |
| | | init(){ |
| | | |
| | | let center = fromLonLat([116.41020, 39.915119]); |
| | | if (mapParam.center) { |
| | | center = fromLonLat(mapParam.center); |
| | | } |
| | | const view = new View({ |
| | | center: center, |
| | | zoom: mapParam.zoom || 10, |
| | | projection: this.projection, |
| | | maxZoom: mapParam.maxZoom || 19, |
| | | minZoom: mapParam.minZoom || 1, |
| | | }); |
| | | let tileLayer = null; |
| | | if (mapParam.tilesUrl) { |
| | | tileLayer = new Tile({ |
| | | source: new XYZ({ |
| | | projection: getProj("EPSG:3857"), |
| | | wrapX: false, |
| | | tileSize: 256 || mapParam.tileSize, |
| | | url: mapParam.tilesUrl |
| | | }) |
| | | }) |
| | | }else { |
| | | tileLayer = new Tile({ |
| | | preload: 4, |
| | | source: new OSM(), |
| | | }) |
| | | } |
| | | olMap = new Map({ |
| | | target: this.$refs.mapContainer, // 容器ID |
| | | layers: [tileLayer], // 默认图层 |
| | | view: view, // 视图 |
| | | controls:[ // 控件 |
| | | // new ZoomSlider(), |
| | | new Zoom(), |
| | | ] , |
| | | }) |
| | | console.log(3222) |
| | | }, |
| | | setCenter(point){ |
| | | |
| | | }, |
| | | zoomIn(zoom){ |
| | | |
| | | }, |
| | | zoomOut(zoom){ |
| | | |
| | | }, |
| | | centerAndZoom(point,zoom,callback){ |
| | | var zoom_ = olMap.getView().getZoom(); |
| | | zoom = zoom|| zoom_; |
| | | var duration = 600; |
| | | olMap.getView().setCenter(fromLonLat(point)) |
| | | olMap.getView().animate({ |
| | | zoom: zoom , |
| | | duration: duration |
| | | }); |
| | | }, |
| | | panTo(point, zoom){ |
| | | let duration = 800; |
| | | |
| | | olMap.getView().cancelAnimations() |
| | | olMap.getView().animate({ |
| | | center: fromLonLat(point), |
| | | duration: duration |
| | | }); |
| | | if (!containsCoordinate(olMap.getView().calculateExtent(), fromLonLat(point))) { |
| | | olMap.getView().animate({ |
| | | zoom: olMap.getView().getZoom() - 1, |
| | | duration: duration / 2 |
| | | }, { |
| | | zoom: zoom || olMap.getView().getZoom(), |
| | | duration: duration / 2 |
| | | }); |
| | | } |
| | | |
| | | }, |
| | | fit(layer){ |
| | | let extent = layer.getSource().getExtent(); |
| | | if (extent) { |
| | | olMap.getView().fit(extent,{ |
| | | duration : 600, |
| | | padding: [100, 100, 100, 100] |
| | | }); |
| | | } |
| | | |
| | | |
| | | }, |
| | | openInfoBox(position, content, offset){ |
| | | let id = v4() |
| | | // let infoBox = document.createElement("div"); |
| | | // infoBox.innerHTML = content ; |
| | | // infoBox.setAttribute("infoBoxId", id) |
| | | let overlay = new Overlay({ |
| | | id:id, |
| | | autoPan:true, |
| | | autoPanAnimation:{ |
| | | duration: 250 |
| | | }, |
| | | element: content, |
| | | positioning:"bottom-center", |
| | | offset:offset, |
| | | // className:overlayStyle.className |
| | | }); |
| | | olMap.addOverlay(overlay); |
| | | overlay.setPosition(fromLonLat(position)); |
| | | return id; |
| | | }, |
| | | closeInfoBox(id){ |
| | | olMap.getOverlayById(id).setPosition(undefined) |
| | | // olMap.removeOverlay(olMap.getOverlayById(id)) |
| | | }, |
| | | /** |
| | | * 添加图层 |
| | | * @param data |
| | | * [ |
| | | * { |
| | | * |
| | | * position: [119.1212,45,122], |
| | | * image: { |
| | | * src:"/images/123.png", |
| | | * anchor: [0.5, 0.5] |
| | | * |
| | | * } |
| | | * } |
| | | * |
| | | * ] |
| | | */ |
| | | addLayer(data, clickEvent){ |
| | | let style = new Style(); |
| | | if (data.length > 0) { |
| | | let features = []; |
| | | for (let i = 0; i < data.length; i++) { |
| | | let feature = new Feature(new Point(fromLonLat(data[i].position))); |
| | | feature.customData = data[i].data; |
| | | let cloneStyle = style.clone() |
| | | cloneStyle.setImage(new Icon({ |
| | | anchor: data[i].image.anchor, |
| | | crossOrigin: 'Anonymous', |
| | | src: data[i].image.src, |
| | | })) |
| | | feature.setStyle(cloneStyle) |
| | | features.push(feature); |
| | | } |
| | | let source = new VectorSource(); |
| | | source.addFeatures(features); |
| | | let vectorLayer = new VectorLayer({ |
| | | source:source, |
| | | style:style, |
| | | renderMode:"image", |
| | | declutter: false |
| | | }) |
| | | olMap.addLayer(vectorLayer) |
| | | if (typeof clickEvent == "function") { |
| | | olMap.on("click", (event)=>{ |
| | | vectorLayer.getFeatures(event.pixel).then((features)=>{ |
| | | if (features.length > 0) { |
| | | let items = [] |
| | | for (let i = 0; i < features.length; i++) { |
| | | items.push(features[i].customData) |
| | | } |
| | | clickEvent(items) |
| | | } |
| | | }) |
| | | |
| | | |
| | | }) |
| | | } |
| | | |
| | | return vectorLayer; |
| | | } |
| | | }, |
| | | removeLayer(layer){ |
| | | olMap.removeLayer(layer) |
| | | }, |
| | | |
| | | addLineLayer(positions) { |
| | | if (positions.length > 0) { |
| | | let points = []; |
| | | for (let i = 0; i < positions.length; i++) { |
| | | points.push(fromLonLat(positions[i])); |
| | | } |
| | | let line = new LineString(points) |
| | | let lineFeature = new Feature(line); |
| | | |
| | | let source = new VectorSource(); |
| | | source.addFeature(lineFeature); |
| | | let vectorLayer = new VectorLayer({ |
| | | source: source, |
| | | }) |
| | | olMap.addLayer(vectorLayer) |
| | | return vectorLayer; |
| | | } |
| | | } |
| | | }, |
| | | destroyed() { |
| | | // if (this.jessibuca) { |
| | | // this.jessibuca.destroy(); |
| | | // } |
| | | // this.playing = false; |
| | | // this.loaded = false; |
| | | // this.performance = ""; |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style> |
| | | |
| | | </style> |
| | |
| | | <template> |
| | | <div id="devicePosition" style="height: 100%"> |
| | | <div style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center;"> |
| | | <span style="font-size: 1rem; font-weight: 500">设备定位 ({{ parentChannelId == 0 ? deviceId : parentChannelId }})</span> |
| | | <div id="devicePosition" style="width: 100vw; height: 91vh;"> |
| | | <el-container style="height: 91vh;" v-loading="isLoging"> |
| | | <el-aside width="auto" style="background-color: #ffffff"> |
| | | <DeviceTree ref="deviceTree" :clickEvent="clickEvent" :contextMenuEvent="contextmenuEventHandler" ></DeviceTree> |
| | | </el-aside> |
| | | <el-main style="height: 91vh; padding: 0"> |
| | | <MapComponent ref="map"></MapComponent> |
| | | </el-main> |
| | | </el-container> |
| | | <div ref="infobox" v-if="channel != null " > |
| | | <div v-if="channel != null" class="infobox-content"> |
| | | <el-descriptions class="margin-top" :title="channel.name" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" > |
| | | <el-descriptions-item label="生产厂商">{{channel.manufacture}}</el-descriptions-item> |
| | | <el-descriptions-item label="型号">{{channel.model}}</el-descriptions-item> |
| | | <el-descriptions-item label="设备归属" >{{channel.owner}}</el-descriptions-item> |
| | | <el-descriptions-item label="行政区域" >{{channel.civilCode}}</el-descriptions-item> |
| | | <el-descriptions-item label="安装地址" >{{channel.address == null?'未知': channel.address}}</el-descriptions-item> |
| | | <el-descriptions-item label="云台类型" >{{channel.ptztypeText}}</el-descriptions-item> |
| | | <el-descriptions-item label="经纬度" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> |
| | | <el-descriptions-item label="状态"> |
| | | <el-tag size="small" v-if="channel.status === 1">在线</el-tag> |
| | | <el-tag size="small" type="info" v-if="channel.status === 0">离线</el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <div style="padding-top: 10px"> |
| | | <el-button type="primary" size="small" title="播放" icon="el-icon-video-play" @click="play(channel)"></el-button> |
| | | <el-button type="primary" size="small" title="编辑位置" icon="el-icon-edit" @click="edit(channel)"></el-button> |
| | | <el-button type="primary" size="small" title="轨迹查询" icon="el-icon-map-location" @click="getTrace(channel)"></el-button> |
| | | </div> |
| | | <span class="infobox-close el-icon-close" @click="closeInfoBox()"></span> |
| | | </div> |
| | | </div> |
| | | <div style="background-color: #ffffff; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left; font-size: 14px;"> |
| | | <el-button icon="el-icon-arrow-left" size="mini" style="margin-right: 1rem" type="primary" @click="showDevice">返回</el-button> |
| | | <!-- <span class="demonstration">从</span> --> |
| | | <el-date-picker v-model="searchFrom" type="datetime" placeholder="选择开始日期时间" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> |
| | | <el-date-picker v-model="searchTo" type="datetime" placeholder="选择结束日期时间" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> |
| | | <el-button-group> |
| | | <el-button icon="el-icon-search" size="mini" type="primary" @click="showHistoryPath">历史轨迹</el-button> |
| | | <el-button icon="el-icon-search" size="mini" style="margin-right: 1rem" type="primary" @click="showLatestPosition">最新位置</el-button> |
| | | </el-button-group> |
| | | <el-tag style="width: 5rem; text-align: center" size="medium">过期时间</el-tag> |
| | | <el-input-number size="mini" v-model="expired" :min="300" :controls="false" style="width: 4rem;"></el-input-number> |
| | | <el-tag style="width: 5rem; text-align: center" size="medium">上报周期</el-tag> |
| | | <el-input-number size="mini" v-model="interval" :min="1" :controls="false" style="width: 4rem;"></el-input-number> |
| | | <el-button-group> |
| | | <el-button icon="el-icon-search" size="mini" type="primary" @click="subscribeMobilePosition">位置订阅</el-button> |
| | | <el-button icon="el-icon-search" size="mini" type="primary" @click="unSubscribeMobilePosition">取消订阅</el-button> |
| | | </el-button-group> |
| | | <el-checkbox size="mini" style="margin-right: 1rem; float: right" v-model="autoList" @change="autoListChange" >自动刷新</el-checkbox> |
| | | </div> |
| | | <div class="mapContainer" style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center; height: calc(100% - 10rem);"> |
| | | <div class="baidumap" id="allmap"></div> |
| | | </div> |
| | | <devicePlayer ref="devicePlayer" ></devicePlayer> |
| | | <queryTrace ref="queryTrace" ></queryTrace> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import uiHeader from "../layout/UiHeader.vue"; |
| | | import geoTools from "./GeoConvertTools.js"; |
| | | import MapComponent from "./common/MapComponent.vue"; |
| | | import DeviceService from "./service/DeviceService"; |
| | | import DeviceTree from "./common/DeviceTree"; |
| | | import channelMapInfobox from "./dialog/channelMapInfobox"; |
| | | import devicePlayer from './dialog/devicePlayer.vue' |
| | | import queryTrace from './dialog/queryTrace.vue' |
| | | |
| | | export default { |
| | | name: "devicePosition", |
| | | components: { |
| | | uiHeader, |
| | | }, |
| | | data() { |
| | | return { |
| | | pickerOptions: { |
| | | shortcuts: [{ |
| | | text: '今天', |
| | | onClick(picker) { |
| | | picker.$emit('pick', new Date()); |
| | | } |
| | | }, { |
| | | text: '昨天', |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24); |
| | | picker.$emit('pick', date); |
| | | } |
| | | }, { |
| | | text: '一周前', |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit('pick', date); |
| | | } |
| | | }] |
| | | name: "devicePosition", |
| | | components: { |
| | | MapComponent, |
| | | DeviceTree, |
| | | channelMapInfobox, |
| | | devicePlayer, |
| | | queryTrace, |
| | | }, |
| | | data() { |
| | | return { |
| | | deviceService: new DeviceService(), |
| | | layer: null, |
| | | lineLayer: null, |
| | | channel: null, |
| | | infoBoxId: null, |
| | | labelStyle: { |
| | | width: "56px" |
| | | }, |
| | | isLoging: false, |
| | | }; |
| | | }, |
| | | created() { |
| | | if (this.$route.query.deviceId) { |
| | | console.log(this.$route.query.deviceId) |
| | | // this.$refs.deviceTree.openByDeivceId(this.$route.query.deivceId) |
| | | setTimeout(()=>{ // 延迟以等待地图加载完成 TODO 后续修改为通过是实际这;状态加回调完成 |
| | | this.deviceService.getAllChannel(false, this.$route.query.deviceId, this.channelsHandler) |
| | | }, 1000) |
| | | |
| | | } |
| | | }, |
| | | destroyed() { |
| | | |
| | | }, |
| | | methods: { |
| | | clickEvent: function (data) { |
| | | if (data.channelId && data.subCount == 0) { |
| | | // 点击通道 |
| | | if (data.longitude * data.latitude === 0) { |
| | | this.$message.error('未获取到位置信息'); |
| | | } else { |
| | | if (this.layer != null) { |
| | | this.$refs.map.removeLayer(this.layer); |
| | | } |
| | | this.closeInfoBox() |
| | | this.layer = this.$refs.map.addLayer([{ |
| | | position: [data.longitude, data.latitude], |
| | | image: { |
| | | src: this.getImageByChannel(data), |
| | | anchor: [0.5, 1] |
| | | }, |
| | | deviceId: this.$route.params.deviceId, |
| | | showHistoryPosition: false, //显示历史轨迹 |
| | | startTime: null, |
| | | endTime: null, |
| | | searchFrom: null, |
| | | searchTo: null, |
| | | expired: 600, |
| | | interval: 5, |
| | | mobilePositionList: [], |
| | | mapPointList: [], |
| | | parentChannelId: this.$route.params.parentChannelId, |
| | | updateLooper: 0, //数据刷新轮训标志 |
| | | total: 0, |
| | | beforeUrl: "/deviceList", |
| | | isLoging: false, |
| | | autoList: false, |
| | | }; |
| | | }, |
| | | mounted() { |
| | | this.initData(); |
| | | this.initBaiduMap(); |
| | | if (this.autoList) { |
| | | this.updateLooper = setInterval(this.initData, 5000); |
| | | data: data |
| | | }], this.featureClickEvent) |
| | | this.$refs.map.panTo([data.longitude, data.latitude], mapParam.maxZoom) |
| | | } |
| | | } |
| | | }, |
| | | destroyed() { |
| | | // this.$destroy("videojs"); |
| | | clearTimeout(this.updateLooper); |
| | | contextmenuEventHandler: function (event, data) { |
| | | if (data.channelId && data.subCount == 0) { |
| | | // 点击通道 |
| | | this.$contextmenu({ |
| | | items: [ |
| | | { |
| | | label: "播放", |
| | | icon: "el-icon-video-play", |
| | | disabled: false, |
| | | onClick: () => { |
| | | this.play(data); |
| | | } |
| | | }, |
| | | { |
| | | label: "编辑位置", |
| | | icon: "el-icon-edit", |
| | | disabled: false, |
| | | onClick: () => { |
| | | this.edit(data) |
| | | } |
| | | }, |
| | | { |
| | | label: "轨迹查询", |
| | | icon: "el-icon-map-location", |
| | | disabled: false, |
| | | onClick: () => { |
| | | this.getTrace(data) |
| | | } |
| | | } |
| | | ], |
| | | event, // 鼠标事件信息 |
| | | customClass: "custom-class", // 自定义菜单 class |
| | | zIndex: 3000, // 菜单样式 z-index |
| | | }); |
| | | } else { |
| | | this.deviceOrSubChannelMenu(event, data) |
| | | } |
| | | |
| | | }, |
| | | methods: { |
| | | initData: function () { |
| | | // if (this.parentChannelId == "" || this.parentChannelId == 0) { |
| | | // this.getDeviceChannelList(); |
| | | // } else { |
| | | // this.showSubchannels(); |
| | | // } |
| | | }, |
| | | initParam: function () { |
| | | // this.deviceId = this.$route.params.deviceId; |
| | | // this.parentChannelId = this.$route.params.parentChannelId; |
| | | // this.currentPage = parseInt(this.$route.params.page); |
| | | // this.count = parseInt(this.$route.params.count); |
| | | // if (this.parentChannelId == "" || this.parentChannelId == 0) { |
| | | // this.beforeUrl = "/deviceList"; |
| | | // } |
| | | }, |
| | | initBaiduMap() { |
| | | this.map = new BMap.Map("allmap"); // 创建地图实例 |
| | | let points = []; |
| | | let point = new BMap.Point(116.231398, 39.567445); // 创建点坐标 |
| | | this.map.centerAndZoom(point, 5); // 初始化地图,设置中心点坐标和地图级别 |
| | | this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放 |
| | | this.map.addControl(new BMap.NavigationControl()); |
| | | this.map.addControl(new BMap.ScaleControl()); |
| | | this.map.addControl(new BMap.OverviewMapControl()); |
| | | this.map.addControl(new BMap.MapTypeControl()); |
| | | //map.setMapStyle({ style: 'midnight' }) //地图风格 |
| | | }, |
| | | currentChange: function (val) { |
| | | // var url = `/${this.$router.currentRoute.name}/${this.deviceId}/${this.parentChannelId}/${this.count}/${val}`; |
| | | // console.log(url); |
| | | // this.$router.push(url).then(() => { |
| | | // this.initParam(); |
| | | // this.initData(); |
| | | // }); |
| | | }, |
| | | handleSizeChange: function (val) { |
| | | // var url = `/${this.$router.currentRoute.name}/${this.$router.params.deviceId}/${this.$router.params.parentChannelId}/${val}/1`; |
| | | // this.$router.push(url).then(() => { |
| | | // this.initParam(); |
| | | // this.initData(); |
| | | // }); |
| | | }, |
| | | showDevice: function () { |
| | | this.$router.push(this.beforeUrl).then(() => { |
| | | this.initParam(); |
| | | this.initData(); |
| | | }); |
| | | }, |
| | | autoListChange: function () { |
| | | if (this.autoList) { |
| | | this.updateLooper = setInterval(this.initData, 1500); |
| | | } else { |
| | | window.clearInterval(this.updateLooper); |
| | | deviceOrSubChannelMenu: function (event, data) { |
| | | // 点击设备 |
| | | this.$contextmenu({ |
| | | items: [ |
| | | { |
| | | label: "定位", |
| | | icon: "el-icon-s-promotion", |
| | | disabled: false, |
| | | onClick: () => { |
| | | if (!data.channelId) { |
| | | this.deviceService.getAllChannel(false, data.deviceId, this.channelsHandler) |
| | | } |
| | | if (data.channelId && data.subCount > 0) { |
| | | // 点击子目录 |
| | | this.deviceService.getAllSubChannel(false, data.deviceId, data.channelId, this.channelsHandler) |
| | | } |
| | | } |
| | | }, |
| | | showHistoryPath: function () { |
| | | this.map.clearOverlays(); |
| | | this.mapPointList = []; |
| | | this.mobilePositionList = []; |
| | | if (!!this.searchFrom) { |
| | | this.startTime = this.toGBString(this.searchFrom); |
| | | console.log(this.startTime); |
| | | } else{ |
| | | this.startTime = null; |
| | | } |
| | | if (!!this.searchTo) { |
| | | this.endTime = this.toGBString(this.searchTo); |
| | | console.log(this.endTime); |
| | | } else { |
| | | this.endTime = null; |
| | | } |
| | | let self = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/position/history/${this.deviceId}`, |
| | | params: { |
| | | start: self.startTime, |
| | | end: self.endTime, |
| | | }, |
| | | }).then(function (res) { |
| | | self.total = res.data.length; |
| | | self.mobilePositionList = res.data; |
| | | console.log(self.mobilePositionList); |
| | | if (self.total == 0) { |
| | | self.$message({ |
| | | showClose: true, |
| | | message: '未找到符合条件的移动位置信息', |
| | | type: 'error' |
| | | }); |
| | | } else { |
| | | self.$nextTick(() => { |
| | | self.showMarkPoints(self); |
| | | }); |
| | | } |
| | | }).catch(function (error) { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | showLatestPosition: function() { |
| | | this.map.clearOverlays(); |
| | | this.mapPointList = []; |
| | | this.mobilePositionList = []; |
| | | let self = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/position/latest/${this.deviceId}` |
| | | }).then(function (res) { |
| | | console.log(res.data); |
| | | self.total = res.data.length; |
| | | self.mobilePositionList.push(res.data); |
| | | console.log(self.mobilePositionList); |
| | | if (self.total == 0) { |
| | | self.$message({ |
| | | showClose: true, |
| | | message: '未找到符合条件的移动位置信息', |
| | | type: 'error' |
| | | }); |
| | | } else { |
| | | self.$nextTick(() => { |
| | | self.showMarkPoints(self); |
| | | }); |
| | | } |
| | | }).catch(function (error) { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | subscribeMobilePosition: function() { |
| | | let self = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/position/subscribe/${this.deviceId}`, |
| | | params: { |
| | | expires: self.expired, |
| | | interval: self.interval, |
| | | }, |
| | | }).then(function (res) { |
| | | console.log(res.data); |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | unSubscribeMobilePosition: function() { |
| | | let self = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/position/subscribe/${this.deviceId}`, |
| | | params: { |
| | | expires: 0, |
| | | interval: self.interval, |
| | | }, |
| | | }) |
| | | .then(function (res) { |
| | | console.log(res.data); |
| | | }).catch(function (error) { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | toGBString: function (dateTime) { |
| | | return ( |
| | | dateTime.getFullYear() + |
| | | "-" + this.twoDigits(dateTime.getMonth() + 1) + |
| | | "-" + this.twoDigits(dateTime.getDate()) + |
| | | "T" + this.twoDigits(dateTime.getHours()) + |
| | | ":" + this.twoDigits(dateTime.getMinutes()) + |
| | | ":" + this.twoDigits(dateTime.getSeconds()) |
| | | ); |
| | | }, |
| | | twoDigits: function (num) { |
| | | if (num < 10) { |
| | | return "0" + num; |
| | | } else { |
| | | return "" + num; |
| | | } |
| | | }, |
| | | showMarkPoints: function(self) { |
| | | let that = self; |
| | | let npointJ = null; |
| | | let npointW = null; |
| | | let point = null; |
| | | for (let i = 0; i < self.mobilePositionList.length; i++) { |
| | | if (self.mobilePositionList[i].geodeticSystem == "BD-09") { |
| | | npointJ = self.mobilePositionList[i].cnLng; |
| | | npointW = self.mobilePositionList[i].cnLat; |
| | | point = new BMap.Point(npointJ, npointW); |
| | | } else { |
| | | npointJ = self.mobilePositionList[i].longitude; |
| | | npointW = self.mobilePositionList[i].latitude; |
| | | let bd2 = geoTools.GPSToBaidu(npointJ, npointW); |
| | | point = new BMap.Point(bd2.lat, bd2.lng); |
| | | } |
| | | self.mapPointList.push(point); |
| | | let marker = new BMap.Marker(point); // 创建标注 |
| | | self.map.addOverlay(marker); // 将标注添加到地图中 |
| | | //提示信息 可以解析 HTML标签以及CSS |
| | | let infoWindow = new BMap.InfoWindow(`<p style='text-align:left;font-weight:800'>设备: ${self.mobilePositionList[i].deviceId}</p> |
| | | <p style='text-align:left;font-weight:0'>时间: ${self.mobilePositionList[i].time}</p>`); |
| | | // 鼠标移上标注点要发生的事 |
| | | marker.addEventListener("mouseover", function () { |
| | | this.openInfoWindow(infoWindow); |
| | | }); |
| | | // 鼠标移开标注点要发生的事 |
| | | marker.addEventListener("mouseout", function () { |
| | | this.closeInfoWindow(infoWindow); |
| | | }); |
| | | // 鼠标点击标注点要发生的事情 |
| | | marker.addEventListener("click", function () { |
| | | alert("点击"); |
| | | }); |
| | | } |
| | | let view = that.map.getViewport(eval(self.mapPointList)); |
| | | that.map.centerAndZoom(view.center, view.zoom); |
| | | }, |
| | | } |
| | | ], |
| | | event, // 鼠标事件信息 |
| | | customClass: "custom-class", // 自定义菜单 class |
| | | zIndex: 3000, // 菜单样式 z-index |
| | | }); |
| | | |
| | | }, |
| | | channelsHandler: function (channels) { |
| | | console.log(2) |
| | | if (channels.length > 0) { |
| | | this.clean() |
| | | this.closeInfoBox() |
| | | let params = []; |
| | | for (let i = 0; i < channels.length; i++) { |
| | | if (channels[i].longitude * channels[i].latitude === 0) { |
| | | continue; |
| | | } |
| | | let item = { |
| | | position: [channels[i].longitude, channels[i].latitude], |
| | | image: { |
| | | src: this.getImageByChannel(channels[i]), |
| | | anchor: [0.5, 1] |
| | | }, |
| | | data: channels[i] |
| | | } |
| | | params.push(item); |
| | | } |
| | | console.log(3) |
| | | |
| | | this.layer = this.$refs.map.addLayer(params, this.featureClickEvent) |
| | | console.log(4) |
| | | if (params.length === 1) { |
| | | this.$refs.map.panTo([channels[0].longitude, channels[0].latitude], mapParam.maxZoom) |
| | | } else if (params.length > 1) { |
| | | this.$refs.map.fit(this.layer) |
| | | } else { |
| | | this.$message.error('未获取到位置信息'); |
| | | } |
| | | } else { |
| | | this.$message.error('未获取到位置信息'); |
| | | } |
| | | }, |
| | | getImageByChannel: function (channel) { |
| | | let src = "static/images/gis/camera.png" |
| | | switch (channel.ptztype) { |
| | | case 1: |
| | | if (channel.status === 1) { |
| | | src = "static/images/gis/camera1.png" |
| | | } else { |
| | | src = "static/images/gis/camera1-offline.png" |
| | | } |
| | | break; |
| | | case 2: |
| | | if (channel.status === 1) { |
| | | src = "static/images/gis/camera2.png" |
| | | } else { |
| | | src = "static/images/gis/camera2-offline.png" |
| | | } |
| | | break; |
| | | case 3: |
| | | if (channel.status === 1) { |
| | | src = "static/images/gis/camera3.png" |
| | | } else { |
| | | src = "static/images/gis/camera3-offline.png" |
| | | } |
| | | break; |
| | | default: |
| | | if (channel.status === 1) { |
| | | src = "static/images/gis/camera.png" |
| | | } else { |
| | | src = "static/images/gis/camera-offline.png" |
| | | } |
| | | } |
| | | return src; |
| | | }, |
| | | featureClickEvent: function (channels) { |
| | | this.closeInfoBox() |
| | | if (channels.length > 0) { |
| | | this.channel = channels[0] |
| | | } |
| | | this.$nextTick(() => { |
| | | this.infoBoxId = this.$refs.map.openInfoBox([this.channel.longitude, this.channel.latitude], this.$refs.infobox, [0, -50]) |
| | | }) |
| | | }, |
| | | closeInfoBox: function () { |
| | | if (this.infoBoxId != null) { |
| | | this.$refs.map.closeInfoBox(this.infoBoxId) |
| | | } |
| | | }, |
| | | play: function (channel) { |
| | | |
| | | let deviceId = channel.deviceId; |
| | | this.isLoging = true; |
| | | let channelId = channel.channelId; |
| | | console.log("通知设备推流1:" + deviceId + " : " + channelId); |
| | | let that = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: '/api/play/start/' + deviceId + '/' + channelId |
| | | }).then(function (res) { |
| | | that.isLoging = false; |
| | | if (res.data.code === 0) { |
| | | |
| | | that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { |
| | | streamInfo: res.data.data, |
| | | hasAudio: channel.hasAudio |
| | | }); |
| | | |
| | | } else { |
| | | that.$message.error(res.data.msg); |
| | | } |
| | | }).catch(function (e) { |
| | | }); |
| | | }, |
| | | edit: function (data) { |
| | | this.$message.warning('暂不支持'); |
| | | }, |
| | | getTrace: function (data) { |
| | | // this.$message.warning('暂不支持'); |
| | | this.clean() |
| | | this.$refs.queryTrace.openDialog(data, (channelPositions) => { |
| | | console.log("getTrace") |
| | | console.log(channelPositions) |
| | | if (channelPositions.length === 0) { |
| | | this.$message.success('未查询到轨迹信息'); |
| | | } else { |
| | | let positions = []; |
| | | for (let i = 0; i < channelPositions.length; i++) { |
| | | if (channelPositions[i].cnLng * channelPositions[i].cnLat > 0) { |
| | | positions.push([channelPositions[i].cnLng, channelPositions[i].cnLat]) |
| | | } |
| | | |
| | | } |
| | | if (positions.length === 0) { |
| | | this.$message.success('未查询到轨迹信息'); |
| | | return; |
| | | } |
| | | this.lineLayer = this.$refs.map.addLineLayer(positions) |
| | | this.$refs.map.fit(this.lineLayer) |
| | | } |
| | | }) |
| | | }, |
| | | clean: function (){ |
| | | if (this.lineLayer != null) { |
| | | this.$refs.map.removeLayer(this.lineLayer) |
| | | } |
| | | if (this.infoBoxId != null) { |
| | | this.$refs.map.closeInfoBox(this.infoBoxId) |
| | | } |
| | | if (this.layer != null) { |
| | | this.$refs.map.removeLayer(this.layer) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | }; |
| | | </script> |
| | | |
| | | <style> |
| | | .videoList { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-content: flex-start; |
| | | .infobox-content{ |
| | | width: 260px; |
| | | background-color: #FFFFFF; |
| | | padding: 10px; |
| | | border-radius: 10px; |
| | | border: 1px solid #e2e2e2; |
| | | } |
| | | |
| | | .video-item { |
| | | position: relative; |
| | | width: 15rem; |
| | | height: 10rem; |
| | | margin-right: 1rem; |
| | | background-color: #000000; |
| | | } |
| | | |
| | | .video-item-img { |
| | | .infobox-content::after { |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | margin: auto; |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .video-item-img:after { |
| | | bottom: -11px; |
| | | left: 130px; |
| | | display: block; |
| | | content: ""; |
| | | display: inline-block; |
| | | position: absolute; |
| | | z-index: 2; |
| | | top: 0; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | margin: auto; |
| | | width: 3rem; |
| | | height: 3rem; |
| | | background-image: url("../assets/loading.png"); |
| | | background-size: cover; |
| | | background-color: #000000; |
| | | width: 16px; |
| | | height: 16px; |
| | | background: url('~@static/images/arrow.png') no-repeat center; |
| | | } |
| | | |
| | | .video-item-title { |
| | | .infobox-close { |
| | | position: absolute; |
| | | bottom: 0; |
| | | right: 1rem; |
| | | top: 1rem; |
| | | color: #000000; |
| | | background-color: #ffffff; |
| | | line-height: 1.5rem; |
| | | padding: 0.3rem; |
| | | width: 14.4rem; |
| | | cursor:pointer |
| | | } |
| | | |
| | | .baidumap { |
| | | .el-descriptions__title { |
| | | font-size: 1rem; |
| | | font-weight: 700; |
| | | padding: 20px 20px 0px 23px; |
| | | text-align: center; |
| | | width: 100%; |
| | | height: 100%; |
| | | border: none; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | margin: auto; |
| | | } |
| | | |
| | | /* 去除百度地图版权那行字 和 百度logo */ |
| | | .baidumap > .BMap_cpyCtrl { |
| | | display: none !important; |
| | | } |
| | | .baidumap > .anchorBL { |
| | | display: none !important; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div id="channelMapInfobox" style="display: none"> |
| | | <div > |
| | | <el-descriptions class="margin-top" title="channel.name" :column="4" direction="vertical"> |
| | | <el-descriptions-item label="生产厂商">{{channel.manufacture}}</el-descriptions-item> |
| | | <el-descriptions-item label="型号">{{channel.model}}</el-descriptions-item> |
| | | <el-descriptions-item label="设备归属" >{{channel.owner}}</el-descriptions-item> |
| | | <el-descriptions-item label="行政区域" >{{channel.civilCode}}</el-descriptions-item> |
| | | <el-descriptions-item label="安装地址" >{{channel.address}}</el-descriptions-item> |
| | | <el-descriptions-item label="云台类型" >{{channel.ptztypeText}}</el-descriptions-item> |
| | | <el-descriptions-item label="经纬度" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> |
| | | <el-descriptions-item label="状态"> |
| | | <el-tag size="small" v-if="channel.status === 1">在线</el-tag> |
| | | <el-tag size="small" v-if="channel.status === 0">离线</el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | |
| | | <devicePlayer ref="devicePlayer" v-loading="isLoging"></devicePlayer> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import devicePlayer from '../dialog/devicePlayer.vue' |
| | | |
| | | export default { |
| | | name: "channelMapInfobox", |
| | | props: ['channel'], |
| | | computed: {devicePlayer}, |
| | | created() {}, |
| | | data() { |
| | | return { |
| | | showDialog: false, |
| | | isLoging: false |
| | | }; |
| | | }, |
| | | methods: { |
| | | |
| | | play: function (){ |
| | | let deviceId = this.channel.deviceId; |
| | | this.isLoging = true; |
| | | let channelId = this.channel.channelId; |
| | | console.log("通知设备推流1:" + deviceId + " : " + channelId); |
| | | let that = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: '/api/play/start/' + deviceId + '/' + channelId |
| | | }).then(function (res) { |
| | | that.isLoging = false; |
| | | if (res.data.code === 0) { |
| | | that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { |
| | | streamInfo: res.data.data, |
| | | hasAudio: this.channel.hasAudio |
| | | }); |
| | | } else { |
| | | that.$message.error(res.data.msg); |
| | | } |
| | | }).catch(function (e) { |
| | | }); |
| | | }, |
| | | close: function () { |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | // 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', |
New file |
| | |
| | | <template> |
| | | <div id="queryTrace" > |
| | | <el-dialog |
| | | title="查询轨迹" |
| | | width="40%" |
| | | top="2rem" |
| | | :close-on-click-modal="false" |
| | | :visible.sync="showDialog" |
| | | :destroy-on-close="true" |
| | | @close="close()" |
| | | > |
| | | <div v-loading="isLoging"> |
| | | <el-date-picker v-model="searchFrom" type="datetime" placeholder="选择开始日期时间" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> |
| | | <el-date-picker v-model="searchTo" type="datetime" placeholder="选择结束日期时间" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> |
| | | <el-button icon="el-icon-search" size="mini" type="primary" @click="onSubmit">查询</el-button> |
| | | </div> |
| | | |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import DeviceService from '../service/DeviceService' |
| | | |
| | | export default { |
| | | name: "deviceEdit", |
| | | props: [], |
| | | computed: {}, |
| | | created() {}, |
| | | data() { |
| | | return { |
| | | deviceService: new DeviceService(), |
| | | pickerOptions: { |
| | | shortcuts: [{ |
| | | text: '今天', |
| | | onClick(picker) { |
| | | picker.$emit('pick', new Date()); |
| | | } |
| | | }, { |
| | | text: '昨天', |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24); |
| | | picker.$emit('pick', date); |
| | | } |
| | | }, { |
| | | text: '一周前', |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit('pick', date); |
| | | } |
| | | }] |
| | | }, |
| | | searchFrom: null, |
| | | searchTo: null, |
| | | listChangeCallback: null, |
| | | showDialog: false, |
| | | isLoging: false, |
| | | channel: null, |
| | | callback: null, |
| | | }; |
| | | }, |
| | | methods: { |
| | | openDialog: function (channel, callback) { |
| | | console.log(channel) |
| | | this.showDialog = true; |
| | | this.callback = callback; |
| | | this.channel = channel; |
| | | }, |
| | | |
| | | onSubmit: function () { |
| | | console.log("onSubmit"); |
| | | this.isLoging = true; |
| | | this.$axios.get(`/api/position/history/${this.channel.deviceId}/${this.channel.channelId}`, { |
| | | }).then((res)=> { |
| | | this.isLoging = false; |
| | | if (typeof this.callback == "function") { |
| | | if (res.data.code == 0) { |
| | | this.callback(res.data.data) |
| | | this.close() |
| | | }else { |
| | | this.$message.error(res.data.msg); |
| | | } |
| | | |
| | | } |
| | | }).catch(function (error) { |
| | | this.isLoging = false; |
| | | console.error(error); |
| | | }) |
| | | }, |
| | | close: function () { |
| | | this.showDialog = false; |
| | | this.isLoging = false; |
| | | this.callback = null; |
| | | this.channel = null; |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | <template> |
| | | <div id="devicePosition" style="height: 100%;width: 100%"> |
| | | <el-container v-loading="loading" element-loading-text="拼命加载中"> |
| | | <div id="devicePosition" style="width:100vw; height: 91vh"> |
| | | <el-container v-loading="loading" style="height: 91vh;" element-loading-text="拼命加载中" > |
| | | <el-aside width="300px" style="background-color: #ffffff"> |
| | | <div style="text-align: center;padding-top: 20px;">设备列表</div> |
| | | <el-menu v-loading="loading"> |
| | | <el-submenu v-for="device in deviceList" :key="device.deviceId" :index="device.deviceId" @click="sendDevicePush(item)"> |
| | | <template slot="title" > |
| | | <i class="el-icon-location-outline"></i> |
| | | {{device.name}} |
| | | </template> |
| | | <ChannelTree :device="device" @sendDevicePush="sendDevicePush"></ChannelTree> |
| | | </el-submenu> |
| | | </el-menu> |
| | | <DeviceTree :clickEvent="clickEvent" :contextMenuEvent="contextMenuEvent" ></DeviceTree> |
| | | </el-aside> |
| | | <el-container> |
| | | <!-- <LivePlay></LivePlay> --> |
| | | <el-header height="40px" style="text-align: left;font-size: 17px;line-height: 40px;"> |
| | | <el-header height="5vh" style="text-align: left;font-size: 17px;line-height:5vh"> |
| | | 分屏: |
| | | <i class="el-icon-full-screen btn" :class="{active:spilt==1}" @click="spilt=1"/> |
| | | <i class="el-icon-menu btn" :class="{active:spilt==4}" @click="spilt=4"/> |
| | | <i class="el-icon-s-grid btn" :class="{active:spilt==9}" @click="spilt=9"/> |
| | | </el-header> |
| | | <el-main> |
| | | <div style="width: 100%;height: calc( 100vh - 150px );display: flex;flex-wrap: wrap;background-color: #000;"> |
| | | <el-main style="padding: 0;"> |
| | | <div style="width: 99%;height: 85vh;display: flex;flex-wrap: wrap;background-color: #000;"> |
| | | <div v-for="i in spilt" :key="i" class="play-box" |
| | | :style="liveStyle" :class="{redborder:playerIdx == (i-1)}" |
| | | @click="playerIdx = (i-1)" |
| | |
| | | <div v-if="!videoUrl[i-1]" style="color: #ffffff;font-size: 30px;font-weight: bold;">{{i}}</div> |
| | | <player v-else :ref="'player'+i" :videoUrl="videoUrl[i-1]" fluent autoplay :height="true" |
| | | :containerId="'player'+i" @screenshot="shot" @destroy="destroy"></player> |
| | | <!-- <player v-else ref="'player'+i" :idx="'player'+i" :visible.sync="showVideoDialog" :videoUrl="videoUrl[i-1]" :height="true" :hasAudio="hasAudio" fluent autoplay live ></player> --> |
| | | </div> |
| | | </div> |
| | | </el-main> |
| | |
| | | |
| | | <script> |
| | | import uiHeader from "../layout/UiHeader.vue"; |
| | | import player from './dialog/jessibuca.vue' |
| | | import ChannelTree from './channelTree.vue' |
| | | import player from './common/jessibuca.vue' |
| | | import DeviceTree from './common/DeviceTree.vue' |
| | | |
| | | export default { |
| | | name: "live", |
| | | components: { |
| | | uiHeader, player, ChannelTree |
| | | uiHeader, player, DeviceTree |
| | | }, |
| | | data() { |
| | | return { |
| | |
| | | clearTimeout(this.updateLooper); |
| | | }, |
| | | methods: { |
| | | initData: function () { |
| | | this.getDeviceList(); |
| | | |
| | | }, |
| | | destroy(idx) { |
| | | console.log(idx); |
| | | this.clear(idx.substring(idx.length-1)) |
| | | }, |
| | | getDeviceList: function() { |
| | | let that = this; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/device/query/devices`, |
| | | params: { |
| | | page: that.currentPage, |
| | | count: that.count |
| | | } |
| | | }).then(function (res) { |
| | | console.log(res.data.list); |
| | | that.total = res.data.total; |
| | | clickEvent: function (data) { |
| | | if (data.channelId && data.subCount == 0) { |
| | | this.sendDevicePush(data) |
| | | } |
| | | }, |
| | | contextMenuEvent: function (data) { |
| | | |
| | | that.deviceList = res.data.list.map(item=>{return {deviceChannelList:[],...item}}); |
| | | that.getDeviceListLoading = false; |
| | | }).catch(function (error) { |
| | | console.log(error); |
| | | that.getDeviceListLoading = false; |
| | | }); |
| | | }, |
| | | //通知设备上传媒体流 |
| | | sendDevicePush: function (itemData) { |
New file |
| | |
| | | import axios from 'axios'; |
| | | |
| | | class DeviceService{ |
| | | |
| | | constructor() { |
| | | this.$axios = axios; |
| | | } |
| | | |
| | | getDeviceList(currentPage, count, callback, errorCallback){ |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/device/query/devices`, |
| | | params: { |
| | | page: currentPage, |
| | | count: count |
| | | } |
| | | }).then((res) => { |
| | | if (typeof (callback) == "function") callback(res.data) |
| | | }).catch((error) => { |
| | | console.log(error); |
| | | if (typeof (errorCallback) == "function") errorCallback(error) |
| | | }); |
| | | } |
| | | getAllDeviceList(callback, errorCallback) { |
| | | let currentPage = 1; |
| | | let count = 100; |
| | | let deviceList = [] |
| | | this.getAllDeviceListIteration(deviceList, currentPage, count, (data) => { |
| | | if (typeof (callback) == "function") callback(data) |
| | | }, errorCallback) |
| | | } |
| | | |
| | | getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) { |
| | | this.getDeviceList(currentPage, count, (data) => { |
| | | if (data.list) { |
| | | deviceList = deviceList.concat(data.list); |
| | | if (deviceList.length < data.total) { |
| | | currentPage ++ |
| | | this.getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) |
| | | }else { |
| | | if (typeof (callback) == "function") callback(deviceList) |
| | | } |
| | | } |
| | | }, errorCallback) |
| | | } |
| | | |
| | | |
| | | getAllChannel(isCatalog, deviceId, callback, errorCallback) { |
| | | let currentPage = 1; |
| | | let count = 100; |
| | | let catalogList = [] |
| | | this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) |
| | | } |
| | | |
| | | getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) { |
| | | this.getChanel(isCatalog, deviceId, currentPage, count, (data) => { |
| | | if (data.list) { |
| | | catalogList = catalogList.concat(data.list); |
| | | if (catalogList.length < data.total) { |
| | | currentPage ++ |
| | | this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) |
| | | }else { |
| | | console.log(1) |
| | | if (typeof (callback) == "function") callback(catalogList) |
| | | } |
| | | } |
| | | }, errorCallback) |
| | | } |
| | | getChanel(isCatalog, deviceId, currentPage, count, callback, errorCallback) { |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: `/api/device/query/devices/${deviceId}/channels`, |
| | | params:{ |
| | | page: currentPage, |
| | | count: count, |
| | | query: "", |
| | | online: "", |
| | | channelType: isCatalog |
| | | } |
| | | }).then((res) =>{ |
| | | if (typeof (callback) == "function") callback(res.data) |
| | | }).catch(errorCallback); |
| | | } |
| | | |
| | | |
| | | getAllSubChannel(isCatalog, deviceId, channelId, callback, errorCallback) { |
| | | let currentPage = 1; |
| | | let count = 100; |
| | | let catalogList = [] |
| | | this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) |
| | | } |
| | | |
| | | getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { |
| | | this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { |
| | | if (data.list) { |
| | | catalogList = catalogList.concat(data.list); |
| | | if (catalogList.length < data.total) { |
| | | currentPage ++ |
| | | this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) |
| | | }else { |
| | | if (typeof (callback) == "function") callback(catalogList) |
| | | } |
| | | } |
| | | }, errorCallback) |
| | | } |
| | | getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, |
| | | params:{ |
| | | page: currentPage, |
| | | count: count, |
| | | query: "", |
| | | online: "", |
| | | channelType: isCatalog |
| | | } |
| | | }).then((res) =>{ |
| | | if (typeof (callback) == "function") callback(res.data) |
| | | }).catch(errorCallback); |
| | | } |
| | | } |
| | | |
| | | export default DeviceService; |
| | |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/server/media_server/online/list`, |
| | | }).then(function (res) { |
| | | }).then((res) => { |
| | | if (typeof (callback) == "function") callback(res.data) |
| | | }).catch(function (error) { |
| | | }).catch((error) => { |
| | | console.log(error); |
| | | }); |
| | | } |
| | |
| | | <el-menu-item index="/control">控制台</el-menu-item> |
| | | <el-menu-item index="/live">实时监控</el-menu-item> |
| | | <el-menu-item index="/deviceList">国标设备</el-menu-item> |
| | | <el-menu-item index="/map">电子地图</el-menu-item> |
| | | <el-menu-item index="/pushVideoList">推流列表</el-menu-item> |
| | | <el-menu-item index="/streamProxyList">拉流代理</el-menu-item> |
| | | <el-menu-item index="/cloudRecord">云端录像</el-menu-item> |
| | |
| | | if (this.$route.path.startsWith("/channelList")) { |
| | | this.activeIndex = "/deviceList" |
| | | } |
| | | |
| | | }, |
| | | mounted() { |
| | | window.addEventListener('beforeunload', e => this.beforeunloadHandler(e)) |
| | |
| | | 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/dialog/jessibuca.vue' |
| | | import wasmPlayer from '../components/common/jessibuca.vue' |
| | | import rtcPlayer from '../components/dialog/rtcPlayer.vue' |
| | | |
| | | const originalPush = VueRouter.prototype.push |
| | |
| | | name: 'rtcPlayer', |
| | | component: rtcPlayer, |
| | | }, |
| | | { |
| | | path: '/map', |
| | | name: 'devicePosition', |
| | | component: devicePosition, |
| | | }, |
| | | ] |
| | | }, |
| | | { |
| | |
| | | name: '登录', |
| | | component: login, |
| | | }, |
| | | { |
| | | path: '/test', |
| | | name: 'deviceTree', |
| | | component: deviceTree, |
| | | }, |
| | | ] |
| | | }) |
| | |
| | | @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 { |
| | |
| | | -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"; |
| | | } |