diff --git a/public/img/icon4.png b/public/img/icon4.png new file mode 100644 index 0000000..9510ed8 --- /dev/null +++ b/public/img/icon4.png Binary files differ diff --git a/public/img/icon4.png b/public/img/icon4.png new file mode 100644 index 0000000..9510ed8 --- /dev/null +++ b/public/img/icon4.png Binary files differ diff --git a/src/components.d.ts b/src/components.d.ts index a1b0897..ab9c1f9 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -35,6 +35,7 @@ ImageUpload: typeof import('./components/ImageUpload/index.vue')['default'] InfoWindow: typeof import('./components/map/infoWindow.vue')['default'] InfoWindow2: typeof import('./components/map/infoWindow2.vue')['default'] + InfoWindowHot: typeof import('./components/map/infoWindowHot.vue')['default'] LineChart: typeof import('./components/Echart/LineChart.vue')['default'] Map: typeof import('./components/map/index.vue')['default'] NormalTable: typeof import('./components/NormalTable/index.vue')['default'] diff --git a/public/img/icon4.png b/public/img/icon4.png new file mode 100644 index 0000000..9510ed8 --- /dev/null +++ b/public/img/icon4.png Binary files differ diff --git a/src/components.d.ts b/src/components.d.ts index a1b0897..ab9c1f9 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -35,6 +35,7 @@ ImageUpload: typeof import('./components/ImageUpload/index.vue')['default'] InfoWindow: typeof import('./components/map/infoWindow.vue')['default'] InfoWindow2: typeof import('./components/map/infoWindow2.vue')['default'] + InfoWindowHot: typeof import('./components/map/infoWindowHot.vue')['default'] LineChart: typeof import('./components/Echart/LineChart.vue')['default'] Map: typeof import('./components/map/index.vue')['default'] NormalTable: typeof import('./components/NormalTable/index.vue')['default'] diff --git a/src/components/map/index.vue b/src/components/map/index.vue index 15929df..fbcdc2f 100644 --- a/src/components/map/index.vue +++ b/src/components/map/index.vue @@ -7,7 +7,8 @@ import AMapLoader from '@amap/amap-jsapi-loader' import infoDetail from './infoWindow.vue' import infoDetail2 from './infoWindow2.vue' -import { electricityBranch, electricityNode, getElectricityListAll, getMonitorStationList } from '@/api/api/index' +import infoDetailHot from './infoWindowHot.vue' +import { electricityBranch, electricityNode, getDeviceListPage, getElectricityListAll, getMonitorStationList } from '@/api/api/index' const publicPath = import.meta.env.BASE_URL // 设置安全密钥 window._AMapSecurityConfig = { @@ -33,11 +34,16 @@ // 光伏数组 const markerArr1 = ref([ ]) +// 用热坐标数组 +const markerArrHot = ref() +const markerArrHotInfo = ref() // 信息窗体 const infoWindow = ref() const infoWindow2 = ref() +const infoWindowHot = ref() const windowInfoRef = ref() const windowInfoRef2 = ref() +const windowInfoHotRef = ref() const markerArrInfo = ref() const markerArrInfo1 = ref() // 折现节点坐标 @@ -53,7 +59,7 @@ const AMap1 = ref() // 图层实例 const layer = ref() -const flag = ref(true) +const flag = ref(false) // 切换图层 const changeLayerGrop = () => { if (flag.value) { @@ -64,211 +70,256 @@ } flag.value = !flag.value } -defineExpose({ changeLayerGrop, flag }) // 初始化地图 -const initMap = () => { - AMapLoader.load({ +const initMap = async () => { + await AMapLoader.load({ key: '40849e82b4e33f5255b17372520c954d', // 后期需替换 version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ['AMap.Scale', 'AMap.MouseTool', 'AMap.ToolBar'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 - }) - .then((AMap) => { - AMap1.value = AMap - // 初始化地图 - map.value = new AMap.Map('map', { - viewMode: '3D', // 是否为3D地图模式 - zoom: 17, // 初始化地图级别 - center: [111.765785, 40.718114], - resizeEnable: true, - }) - // 图层实例 - layer.value = new AMap.TileLayer.Satellite() - // 地图绑定右击事件 - map.value.on('mousedown', clickHandler) - // 电网支路标记点绘制 - for (let i = 0; i < markerArr.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon1.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], // 缩放 - position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(3, -30), - }) - // 支路点详细信息// 信息窗体 - infoWindow.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef.value.initialize({ - overlay: e.target, - infoWindow: infoWindow.value, - info: markerArrInfo.value[i], - }) - }) - // 标记点文本标记 - marker.setLabel({ - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - } - // 光伏标记点及光伏绘制 - for (let i = 0; i < markerArr1.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon2.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - // 信息窗体 - infoWindow2.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef2.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow2.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef2.value.initialize({ - overlay: e.target, - infoWindow: infoWindow2.value, - info: markerArrInfo1.value[i], - }) - }) - // 标记点的文本 - marker.setLabel({ - zooms: [16, 20], - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - // 绘制电网和节点连线 - const path = markerArrInfo1.value.map((item) => { - return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] - }) - const polyline = new AMap.Polyline({ - path, - strokeColor: '#03A382', - strokeStyle: 'dashed', - strokeDasharray: [10, 3], - lineJoin: 'round', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - }) - polyline.setMap(map.value) - map.value.add(polyline) - } - // 电网支路折线绘制 - for (let i = 0; i < lineArr.value.length; i++) { - // console.log(lineArr.value[i]) - const path = lineArr.value.map(item => item.branchNodeInfos) - const line = path.map(item => ( - item.map((child) => { - return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) - }) - )) - line.forEach((item) => { - item.forEach((child) => { - const path = [child[0], child[1]] - const polyline = new AMap.Polyline({ - path, - // isOutline: true, - strokeColor: child[2] === 1 ? '#008d68' : '#000', - // strokeOpacity: 1, - strokeWeight: 3, - // 折线样式还支持 'dashed' - strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', - // strokeStyle是dashed时有效 - strokeDasharray: [10, 3], - lineJoin: 'round', - showDir: child[2] === 1, - // lineCap: 'square', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - - }) - // 离线支路连接添加开关图标 - if (child[2] === 0) { - const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon3.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - map.value.add([marker]) - } - polyline.setMap(map.value) - map.value.add(polyline) - }) - }) - // 添加支路折线文本 - // 创建纯文本标记 - // const textArr = path.map(item => ( - // item.map((child) => { - // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) - // }) - // )) - // textArr.forEach((item) => { - // // console.log(item, 'item') - // item.forEach((child) => { - // const icon = new AMap.Icon({ - // size: new AMap.Size(36, 36), // 图标尺寸 - // // image: '', // Icon的图像 - // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - // }) - // // const content = '
111
' - // const marker = new AMap.Marker({ - // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - // map: map.value, - // content: '', - // offset: new AMap.Pixel(-20, -20), - // }) - // marker.setLabel({ - // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 - // direction: 'right', // 设置文本标注方位 - // }) - // map.value.add([marker]) - // }) - // }) - } + }).then((AMap) => { + AMap1.value = AMap + // 初始化地图 + map.value = new AMap.Map('map', { + viewMode: '3D', // 是否为3D地图模式 + zoom: 17, // 初始化地图级别 + center: [111.765785, 40.718114], + resizeEnable: true, }) + // 图层实例 + layer.value = new AMap.TileLayer.Satellite() + map.value.addLayer(layer.value) + // 地图绑定右击事件 + map.value.on('mousedown', clickHandler) + }) .catch((e) => { console.log(e) }) } +// 绘制用电监测相关 +const useElectricity = () => { + const AMap = AMap1.value + // 电网支路标记点绘制 + for (let i = 0; i < markerArr.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon1.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindow.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindow.value, + info: markerArrInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } + // 光伏标记点及光伏绘制 + for (let i = 0; i < markerArr1.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon2.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + // 信息窗体 + infoWindow2.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef2.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow2.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef2.value.initialize({ + overlay: e.target, + infoWindow: infoWindow2.value, + info: markerArrInfo1.value[i], + }) + }) + // 标记点的文本 + marker.setLabel({ + zooms: [16, 20], + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + // 绘制电网和节点连线 + const path = markerArrInfo1.value.map((item) => { + return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] + }) + const polyline = new AMap.Polyline({ + path, + strokeColor: '#03A382', + strokeStyle: 'dashed', + strokeDasharray: [10, 3], + lineJoin: 'round', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + }) + polyline.setMap(map.value) + map.value.add(polyline) + } + // 电网支路折线绘制 + for (let i = 0; i < lineArr.value.length; i++) { + // console.log(lineArr.value[i]) + const path = lineArr.value.map(item => item.branchNodeInfos) + const line = path.map(item => ( + item.map((child) => { + return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) + }) + )) + line.forEach((item) => { + item.forEach((child) => { + const path = [child[0], child[1]] + const polyline = new AMap.Polyline({ + path, + // isOutline: true, + strokeColor: child[2] === 1 ? '#008d68' : '#000', + // strokeOpacity: 1, + strokeWeight: 3, + // 折线样式还支持 'dashed' + strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', + // strokeStyle是dashed时有效 + strokeDasharray: [10, 3], + lineJoin: 'round', + showDir: child[2] === 1, + // lineCap: 'square', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + + }) + // 离线支路连接添加开关图标 + if (child[2] === 0) { + const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon3.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + map.value.add([marker]) + } + polyline.setMap(map.value) + map.value.add(polyline) + }) + }) + // 添加支路折线文本 + // 创建纯文本标记 + // const textArr = path.map(item => ( + // item.map((child) => { + // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) + // }) + // )) + // textArr.forEach((item) => { + // // console.log(item, 'item') + // item.forEach((child) => { + // const icon = new AMap.Icon({ + // size: new AMap.Size(36, 36), // 图标尺寸 + // // image: '', // Icon的图像 + // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + // }) + // // const content = '
111
' + // const marker = new AMap.Marker({ + // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + // map: map.value, + // content: '', + // offset: new AMap.Pixel(-20, -20), + // }) + // marker.setLabel({ + // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 + // direction: 'right', // 设置文本标注方位 + // }) + // map.value.add([marker]) + // }) + // }) + } +} +// 绘制用热监测相关 +const useHot = () => { + for (let i = 0; i < markerArrHot.value.length; i++) { + const AMap = AMap1.value + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon4.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArrHot.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindowHot.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoHotRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindowHot.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoHotRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindowHot.value, + info: markerArrHotInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrHotInfo.value[i].deviceName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } +} onMounted(async () => { // 获取电网列表 try { @@ -289,11 +340,22 @@ markerArr1.value = list1.data.map(item => ([Number(item.lng), Number(item.lat)])) markerArrInfo1.value = list1.data // 初始化地图 - initMap() + await initMap() + useElectricity() } catch (error) { initMap() } + // 获取用热数据 + getDeviceListPage({ + offset: 1, + limit: 999, + ptn: '', + deviceType: '2', + }).then((res) => { + markerArrHotInfo.value = res.data.rows + markerArrHot.value = res.data.rows.map(item => ([Number(item.lng), Number(item.lat)])) + }) // getElectricityListAll().then((res) => { // // 电网列表 // electricityList.value = res.data @@ -312,12 +374,27 @@ // } // }) }) +// 用电检测/用热监测 默认用电 +const flagType = ref(true) +// 切换用电检测/用热监测 +const changeFlagType = () => { + map.value.clearMap() + if (flagType.value) { + useHot() + } + else { + useElectricity() + } + flagType.value = !flagType.value +} +defineExpose({ changeLayerGrop, changeFlagType, flag }) diff --git a/public/img/icon4.png b/public/img/icon4.png new file mode 100644 index 0000000..9510ed8 --- /dev/null +++ b/public/img/icon4.png Binary files differ diff --git a/src/components.d.ts b/src/components.d.ts index a1b0897..ab9c1f9 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -35,6 +35,7 @@ ImageUpload: typeof import('./components/ImageUpload/index.vue')['default'] InfoWindow: typeof import('./components/map/infoWindow.vue')['default'] InfoWindow2: typeof import('./components/map/infoWindow2.vue')['default'] + InfoWindowHot: typeof import('./components/map/infoWindowHot.vue')['default'] LineChart: typeof import('./components/Echart/LineChart.vue')['default'] Map: typeof import('./components/map/index.vue')['default'] NormalTable: typeof import('./components/NormalTable/index.vue')['default'] diff --git a/src/components/map/index.vue b/src/components/map/index.vue index 15929df..fbcdc2f 100644 --- a/src/components/map/index.vue +++ b/src/components/map/index.vue @@ -7,7 +7,8 @@ import AMapLoader from '@amap/amap-jsapi-loader' import infoDetail from './infoWindow.vue' import infoDetail2 from './infoWindow2.vue' -import { electricityBranch, electricityNode, getElectricityListAll, getMonitorStationList } from '@/api/api/index' +import infoDetailHot from './infoWindowHot.vue' +import { electricityBranch, electricityNode, getDeviceListPage, getElectricityListAll, getMonitorStationList } from '@/api/api/index' const publicPath = import.meta.env.BASE_URL // 设置安全密钥 window._AMapSecurityConfig = { @@ -33,11 +34,16 @@ // 光伏数组 const markerArr1 = ref([ ]) +// 用热坐标数组 +const markerArrHot = ref() +const markerArrHotInfo = ref() // 信息窗体 const infoWindow = ref() const infoWindow2 = ref() +const infoWindowHot = ref() const windowInfoRef = ref() const windowInfoRef2 = ref() +const windowInfoHotRef = ref() const markerArrInfo = ref() const markerArrInfo1 = ref() // 折现节点坐标 @@ -53,7 +59,7 @@ const AMap1 = ref() // 图层实例 const layer = ref() -const flag = ref(true) +const flag = ref(false) // 切换图层 const changeLayerGrop = () => { if (flag.value) { @@ -64,211 +70,256 @@ } flag.value = !flag.value } -defineExpose({ changeLayerGrop, flag }) // 初始化地图 -const initMap = () => { - AMapLoader.load({ +const initMap = async () => { + await AMapLoader.load({ key: '40849e82b4e33f5255b17372520c954d', // 后期需替换 version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ['AMap.Scale', 'AMap.MouseTool', 'AMap.ToolBar'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 - }) - .then((AMap) => { - AMap1.value = AMap - // 初始化地图 - map.value = new AMap.Map('map', { - viewMode: '3D', // 是否为3D地图模式 - zoom: 17, // 初始化地图级别 - center: [111.765785, 40.718114], - resizeEnable: true, - }) - // 图层实例 - layer.value = new AMap.TileLayer.Satellite() - // 地图绑定右击事件 - map.value.on('mousedown', clickHandler) - // 电网支路标记点绘制 - for (let i = 0; i < markerArr.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon1.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], // 缩放 - position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(3, -30), - }) - // 支路点详细信息// 信息窗体 - infoWindow.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef.value.initialize({ - overlay: e.target, - infoWindow: infoWindow.value, - info: markerArrInfo.value[i], - }) - }) - // 标记点文本标记 - marker.setLabel({ - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - } - // 光伏标记点及光伏绘制 - for (let i = 0; i < markerArr1.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon2.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - // 信息窗体 - infoWindow2.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef2.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow2.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef2.value.initialize({ - overlay: e.target, - infoWindow: infoWindow2.value, - info: markerArrInfo1.value[i], - }) - }) - // 标记点的文本 - marker.setLabel({ - zooms: [16, 20], - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - // 绘制电网和节点连线 - const path = markerArrInfo1.value.map((item) => { - return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] - }) - const polyline = new AMap.Polyline({ - path, - strokeColor: '#03A382', - strokeStyle: 'dashed', - strokeDasharray: [10, 3], - lineJoin: 'round', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - }) - polyline.setMap(map.value) - map.value.add(polyline) - } - // 电网支路折线绘制 - for (let i = 0; i < lineArr.value.length; i++) { - // console.log(lineArr.value[i]) - const path = lineArr.value.map(item => item.branchNodeInfos) - const line = path.map(item => ( - item.map((child) => { - return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) - }) - )) - line.forEach((item) => { - item.forEach((child) => { - const path = [child[0], child[1]] - const polyline = new AMap.Polyline({ - path, - // isOutline: true, - strokeColor: child[2] === 1 ? '#008d68' : '#000', - // strokeOpacity: 1, - strokeWeight: 3, - // 折线样式还支持 'dashed' - strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', - // strokeStyle是dashed时有效 - strokeDasharray: [10, 3], - lineJoin: 'round', - showDir: child[2] === 1, - // lineCap: 'square', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - - }) - // 离线支路连接添加开关图标 - if (child[2] === 0) { - const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon3.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - map.value.add([marker]) - } - polyline.setMap(map.value) - map.value.add(polyline) - }) - }) - // 添加支路折线文本 - // 创建纯文本标记 - // const textArr = path.map(item => ( - // item.map((child) => { - // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) - // }) - // )) - // textArr.forEach((item) => { - // // console.log(item, 'item') - // item.forEach((child) => { - // const icon = new AMap.Icon({ - // size: new AMap.Size(36, 36), // 图标尺寸 - // // image: '', // Icon的图像 - // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - // }) - // // const content = '
111
' - // const marker = new AMap.Marker({ - // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - // map: map.value, - // content: '', - // offset: new AMap.Pixel(-20, -20), - // }) - // marker.setLabel({ - // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 - // direction: 'right', // 设置文本标注方位 - // }) - // map.value.add([marker]) - // }) - // }) - } + }).then((AMap) => { + AMap1.value = AMap + // 初始化地图 + map.value = new AMap.Map('map', { + viewMode: '3D', // 是否为3D地图模式 + zoom: 17, // 初始化地图级别 + center: [111.765785, 40.718114], + resizeEnable: true, }) + // 图层实例 + layer.value = new AMap.TileLayer.Satellite() + map.value.addLayer(layer.value) + // 地图绑定右击事件 + map.value.on('mousedown', clickHandler) + }) .catch((e) => { console.log(e) }) } +// 绘制用电监测相关 +const useElectricity = () => { + const AMap = AMap1.value + // 电网支路标记点绘制 + for (let i = 0; i < markerArr.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon1.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindow.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindow.value, + info: markerArrInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } + // 光伏标记点及光伏绘制 + for (let i = 0; i < markerArr1.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon2.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + // 信息窗体 + infoWindow2.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef2.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow2.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef2.value.initialize({ + overlay: e.target, + infoWindow: infoWindow2.value, + info: markerArrInfo1.value[i], + }) + }) + // 标记点的文本 + marker.setLabel({ + zooms: [16, 20], + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + // 绘制电网和节点连线 + const path = markerArrInfo1.value.map((item) => { + return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] + }) + const polyline = new AMap.Polyline({ + path, + strokeColor: '#03A382', + strokeStyle: 'dashed', + strokeDasharray: [10, 3], + lineJoin: 'round', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + }) + polyline.setMap(map.value) + map.value.add(polyline) + } + // 电网支路折线绘制 + for (let i = 0; i < lineArr.value.length; i++) { + // console.log(lineArr.value[i]) + const path = lineArr.value.map(item => item.branchNodeInfos) + const line = path.map(item => ( + item.map((child) => { + return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) + }) + )) + line.forEach((item) => { + item.forEach((child) => { + const path = [child[0], child[1]] + const polyline = new AMap.Polyline({ + path, + // isOutline: true, + strokeColor: child[2] === 1 ? '#008d68' : '#000', + // strokeOpacity: 1, + strokeWeight: 3, + // 折线样式还支持 'dashed' + strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', + // strokeStyle是dashed时有效 + strokeDasharray: [10, 3], + lineJoin: 'round', + showDir: child[2] === 1, + // lineCap: 'square', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + + }) + // 离线支路连接添加开关图标 + if (child[2] === 0) { + const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon3.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + map.value.add([marker]) + } + polyline.setMap(map.value) + map.value.add(polyline) + }) + }) + // 添加支路折线文本 + // 创建纯文本标记 + // const textArr = path.map(item => ( + // item.map((child) => { + // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) + // }) + // )) + // textArr.forEach((item) => { + // // console.log(item, 'item') + // item.forEach((child) => { + // const icon = new AMap.Icon({ + // size: new AMap.Size(36, 36), // 图标尺寸 + // // image: '', // Icon的图像 + // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + // }) + // // const content = '
111
' + // const marker = new AMap.Marker({ + // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + // map: map.value, + // content: '', + // offset: new AMap.Pixel(-20, -20), + // }) + // marker.setLabel({ + // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 + // direction: 'right', // 设置文本标注方位 + // }) + // map.value.add([marker]) + // }) + // }) + } +} +// 绘制用热监测相关 +const useHot = () => { + for (let i = 0; i < markerArrHot.value.length; i++) { + const AMap = AMap1.value + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon4.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArrHot.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindowHot.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoHotRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindowHot.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoHotRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindowHot.value, + info: markerArrHotInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrHotInfo.value[i].deviceName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } +} onMounted(async () => { // 获取电网列表 try { @@ -289,11 +340,22 @@ markerArr1.value = list1.data.map(item => ([Number(item.lng), Number(item.lat)])) markerArrInfo1.value = list1.data // 初始化地图 - initMap() + await initMap() + useElectricity() } catch (error) { initMap() } + // 获取用热数据 + getDeviceListPage({ + offset: 1, + limit: 999, + ptn: '', + deviceType: '2', + }).then((res) => { + markerArrHotInfo.value = res.data.rows + markerArrHot.value = res.data.rows.map(item => ([Number(item.lng), Number(item.lat)])) + }) // getElectricityListAll().then((res) => { // // 电网列表 // electricityList.value = res.data @@ -312,12 +374,27 @@ // } // }) }) +// 用电检测/用热监测 默认用电 +const flagType = ref(true) +// 切换用电检测/用热监测 +const changeFlagType = () => { + map.value.clearMap() + if (flagType.value) { + useHot() + } + else { + useElectricity() + } + flagType.value = !flagType.value +} +defineExpose({ changeLayerGrop, changeFlagType, flag }) diff --git a/src/router/routes.ts b/src/router/routes.ts index 9f10482..6f295be 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -134,6 +134,16 @@ }, { meta: { + title: '数据管理', + icon: '', + auth: '/dataset', + }, + children: [ + ...dataRoute, + ], + }, + { + meta: { title: '碳足迹监测', icon: '', auth: '/footprint', @@ -194,16 +204,6 @@ // }, { meta: { - title: '数据管理', - icon: '', - auth: '/dataset', - }, - children: [ - ...dataRoute, - ], - }, - { - meta: { title: '系统设置', icon: '', auth: '/system', diff --git a/public/img/icon4.png b/public/img/icon4.png new file mode 100644 index 0000000..9510ed8 --- /dev/null +++ b/public/img/icon4.png Binary files differ diff --git a/src/components.d.ts b/src/components.d.ts index a1b0897..ab9c1f9 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -35,6 +35,7 @@ ImageUpload: typeof import('./components/ImageUpload/index.vue')['default'] InfoWindow: typeof import('./components/map/infoWindow.vue')['default'] InfoWindow2: typeof import('./components/map/infoWindow2.vue')['default'] + InfoWindowHot: typeof import('./components/map/infoWindowHot.vue')['default'] LineChart: typeof import('./components/Echart/LineChart.vue')['default'] Map: typeof import('./components/map/index.vue')['default'] NormalTable: typeof import('./components/NormalTable/index.vue')['default'] diff --git a/src/components/map/index.vue b/src/components/map/index.vue index 15929df..fbcdc2f 100644 --- a/src/components/map/index.vue +++ b/src/components/map/index.vue @@ -7,7 +7,8 @@ import AMapLoader from '@amap/amap-jsapi-loader' import infoDetail from './infoWindow.vue' import infoDetail2 from './infoWindow2.vue' -import { electricityBranch, electricityNode, getElectricityListAll, getMonitorStationList } from '@/api/api/index' +import infoDetailHot from './infoWindowHot.vue' +import { electricityBranch, electricityNode, getDeviceListPage, getElectricityListAll, getMonitorStationList } from '@/api/api/index' const publicPath = import.meta.env.BASE_URL // 设置安全密钥 window._AMapSecurityConfig = { @@ -33,11 +34,16 @@ // 光伏数组 const markerArr1 = ref([ ]) +// 用热坐标数组 +const markerArrHot = ref() +const markerArrHotInfo = ref() // 信息窗体 const infoWindow = ref() const infoWindow2 = ref() +const infoWindowHot = ref() const windowInfoRef = ref() const windowInfoRef2 = ref() +const windowInfoHotRef = ref() const markerArrInfo = ref() const markerArrInfo1 = ref() // 折现节点坐标 @@ -53,7 +59,7 @@ const AMap1 = ref() // 图层实例 const layer = ref() -const flag = ref(true) +const flag = ref(false) // 切换图层 const changeLayerGrop = () => { if (flag.value) { @@ -64,211 +70,256 @@ } flag.value = !flag.value } -defineExpose({ changeLayerGrop, flag }) // 初始化地图 -const initMap = () => { - AMapLoader.load({ +const initMap = async () => { + await AMapLoader.load({ key: '40849e82b4e33f5255b17372520c954d', // 后期需替换 version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ['AMap.Scale', 'AMap.MouseTool', 'AMap.ToolBar'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 - }) - .then((AMap) => { - AMap1.value = AMap - // 初始化地图 - map.value = new AMap.Map('map', { - viewMode: '3D', // 是否为3D地图模式 - zoom: 17, // 初始化地图级别 - center: [111.765785, 40.718114], - resizeEnable: true, - }) - // 图层实例 - layer.value = new AMap.TileLayer.Satellite() - // 地图绑定右击事件 - map.value.on('mousedown', clickHandler) - // 电网支路标记点绘制 - for (let i = 0; i < markerArr.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon1.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], // 缩放 - position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(3, -30), - }) - // 支路点详细信息// 信息窗体 - infoWindow.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef.value.initialize({ - overlay: e.target, - infoWindow: infoWindow.value, - info: markerArrInfo.value[i], - }) - }) - // 标记点文本标记 - marker.setLabel({ - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - } - // 光伏标记点及光伏绘制 - for (let i = 0; i < markerArr1.value.length; i++) { - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon2.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - // 信息窗体 - infoWindow2.value = new AMap.InfoWindow({ - isCustom: true, // 自定义信息窗体 - content: windowInfoRef2.value.$el, // 窗体内容(vue组件) - offset: new AMap.Pixel(9, -5), // 偏移 - }) - marker.on('click', (e) => { - // 打开信息窗口 - infoWindow2.value.open(map.value, e.lnglat) - // 初始化信息窗口 - windowInfoRef2.value.initialize({ - overlay: e.target, - infoWindow: infoWindow2.value, - info: markerArrInfo1.value[i], - }) - }) - // 标记点的文本 - marker.setLabel({ - zooms: [16, 20], - offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 - direction: 'right', // 设置文本标注方位 - }) - map.value.add([marker]) - // 绘制电网和节点连线 - const path = markerArrInfo1.value.map((item) => { - return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] - }) - const polyline = new AMap.Polyline({ - path, - strokeColor: '#03A382', - strokeStyle: 'dashed', - strokeDasharray: [10, 3], - lineJoin: 'round', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - }) - polyline.setMap(map.value) - map.value.add(polyline) - } - // 电网支路折线绘制 - for (let i = 0; i < lineArr.value.length; i++) { - // console.log(lineArr.value[i]) - const path = lineArr.value.map(item => item.branchNodeInfos) - const line = path.map(item => ( - item.map((child) => { - return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) - }) - )) - line.forEach((item) => { - item.forEach((child) => { - const path = [child[0], child[1]] - const polyline = new AMap.Polyline({ - path, - // isOutline: true, - strokeColor: child[2] === 1 ? '#008d68' : '#000', - // strokeOpacity: 1, - strokeWeight: 3, - // 折线样式还支持 'dashed' - strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', - // strokeStyle是dashed时有效 - strokeDasharray: [10, 3], - lineJoin: 'round', - showDir: child[2] === 1, - // lineCap: 'square', - lineCap: 'round', - zIndex: 50, - zooms: [16, 20], - - }) - // 离线支路连接添加开关图标 - if (child[2] === 0) { - const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] - const icon = new AMap.Icon({ - size: new AMap.Size(36, 36), // 图标尺寸 - image: `${publicPath}img/icon3.png`, // Icon的图像 - imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - }) - const marker = new AMap.Marker({ - zooms: [16, 20], - position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - map: map.value, - icon, - offset: new AMap.Pixel(-20, -20), - }) - map.value.add([marker]) - } - polyline.setMap(map.value) - map.value.add(polyline) - }) - }) - // 添加支路折线文本 - // 创建纯文本标记 - // const textArr = path.map(item => ( - // item.map((child) => { - // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) - // }) - // )) - // textArr.forEach((item) => { - // // console.log(item, 'item') - // item.forEach((child) => { - // const icon = new AMap.Icon({ - // size: new AMap.Size(36, 36), // 图标尺寸 - // // image: '', // Icon的图像 - // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 - // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 - // }) - // // const content = '
111
' - // const marker = new AMap.Marker({ - // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] - // map: map.value, - // content: '', - // offset: new AMap.Pixel(-20, -20), - // }) - // marker.setLabel({ - // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 - // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 - // direction: 'right', // 设置文本标注方位 - // }) - // map.value.add([marker]) - // }) - // }) - } + }).then((AMap) => { + AMap1.value = AMap + // 初始化地图 + map.value = new AMap.Map('map', { + viewMode: '3D', // 是否为3D地图模式 + zoom: 17, // 初始化地图级别 + center: [111.765785, 40.718114], + resizeEnable: true, }) + // 图层实例 + layer.value = new AMap.TileLayer.Satellite() + map.value.addLayer(layer.value) + // 地图绑定右击事件 + map.value.on('mousedown', clickHandler) + }) .catch((e) => { console.log(e) }) } +// 绘制用电监测相关 +const useElectricity = () => { + const AMap = AMap1.value + // 电网支路标记点绘制 + for (let i = 0; i < markerArr.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon1.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArr.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindow.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindow.value, + info: markerArrInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo.value[i].nodeName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } + // 光伏标记点及光伏绘制 + for (let i = 0; i < markerArr1.value.length; i++) { + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon2.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: markerArr1.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + // 信息窗体 + infoWindow2.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoRef2.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindow2.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoRef2.value.initialize({ + overlay: e.target, + infoWindow: infoWindow2.value, + info: markerArrInfo1.value[i], + }) + }) + // 标记点的文本 + marker.setLabel({ + zooms: [16, 20], + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrInfo1.value[i].stationName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + // 绘制电网和节点连线 + const path = markerArrInfo1.value.map((item) => { + return [[Number(item.lng), Number(item.lat)], [Number(item.nodeLng), Number(item.nodeLat)]] + }) + const polyline = new AMap.Polyline({ + path, + strokeColor: '#03A382', + strokeStyle: 'dashed', + strokeDasharray: [10, 3], + lineJoin: 'round', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + }) + polyline.setMap(map.value) + map.value.add(polyline) + } + // 电网支路折线绘制 + for (let i = 0; i < lineArr.value.length; i++) { + // console.log(lineArr.value[i]) + const path = lineArr.value.map(item => item.branchNodeInfos) + const line = path.map(item => ( + item.map((child) => { + return ([[child.flng, child.flat], [child.tlng, child.tlat], child.status2]) + }) + )) + line.forEach((item) => { + item.forEach((child) => { + const path = [child[0], child[1]] + const polyline = new AMap.Polyline({ + path, + // isOutline: true, + strokeColor: child[2] === 1 ? '#008d68' : '#000', + // strokeOpacity: 1, + strokeWeight: 3, + // 折线样式还支持 'dashed' + strokeStyle: child[2] !== 1 ? 'dashed' : 'dashed ', + // strokeStyle是dashed时有效 + strokeDasharray: [10, 3], + lineJoin: 'round', + showDir: child[2] === 1, + // lineCap: 'square', + lineCap: 'round', + zIndex: 50, + zooms: [16, 20], + + }) + // 离线支路连接添加开关图标 + if (child[2] === 0) { + const data = [(Number(child[0][0]) + Number(child[1][0])) / 2, (Number(child[0][1]) + Number(child[1][1])) / 2] + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon3.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], + position: data, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(-20, -20), + }) + map.value.add([marker]) + } + polyline.setMap(map.value) + map.value.add(polyline) + }) + }) + // 添加支路折线文本 + // 创建纯文本标记 + // const textArr = path.map(item => ( + // item.map((child) => { + // return ([[(Number(child.flng) + Number(child.tlng)) / 2, (Number(child.flat) + Number(child.tlat)) / 2], child.flowRate]) + // }) + // )) + // textArr.forEach((item) => { + // // console.log(item, 'item') + // item.forEach((child) => { + // const icon = new AMap.Icon({ + // size: new AMap.Size(36, 36), // 图标尺寸 + // // image: '', // Icon的图像 + // imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + // imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + // }) + // // const content = '
111
' + // const marker = new AMap.Marker({ + // position: child[0], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + // map: map.value, + // content: '', + // offset: new AMap.Pixel(-20, -20), + // }) + // marker.setLabel({ + // offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + // content: `
${`${child[1]}kgCO2/h`}
`, // 设置文本标注内容 + // direction: 'right', // 设置文本标注方位 + // }) + // map.value.add([marker]) + // }) + // }) + } +} +// 绘制用热监测相关 +const useHot = () => { + for (let i = 0; i < markerArrHot.value.length; i++) { + const AMap = AMap1.value + const icon = new AMap.Icon({ + size: new AMap.Size(36, 36), // 图标尺寸 + image: `${publicPath}img/icon4.png`, // Icon的图像 + imageSize: new AMap.Size(24, 30), // 根据所设置的大小拉伸或压缩图片 + imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等 + }) + const marker = new AMap.Marker({ + zooms: [16, 20], // 缩放 + position: markerArrHot.value[i], // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + map: map.value, + icon, + offset: new AMap.Pixel(3, -30), + }) + // 支路点详细信息// 信息窗体 + infoWindowHot.value = new AMap.InfoWindow({ + isCustom: true, // 自定义信息窗体 + content: windowInfoHotRef.value.$el, // 窗体内容(vue组件) + offset: new AMap.Pixel(9, -5), // 偏移 + }) + marker.on('click', (e) => { + // 打开信息窗口 + infoWindowHot.value.open(map.value, e.lnglat) + // 初始化信息窗口 + windowInfoHotRef.value.initialize({ + overlay: e.target, + infoWindow: infoWindowHot.value, + info: markerArrHotInfo.value[i], + }) + }) + // 标记点文本标记 + marker.setLabel({ + offset: new AMap.Pixel(-10, -2), // 设置文本标注偏移量 + content: `
${markerArrHotInfo.value[i].deviceName}
`, // 设置文本标注内容 + direction: 'right', // 设置文本标注方位 + }) + map.value.add([marker]) + } +} onMounted(async () => { // 获取电网列表 try { @@ -289,11 +340,22 @@ markerArr1.value = list1.data.map(item => ([Number(item.lng), Number(item.lat)])) markerArrInfo1.value = list1.data // 初始化地图 - initMap() + await initMap() + useElectricity() } catch (error) { initMap() } + // 获取用热数据 + getDeviceListPage({ + offset: 1, + limit: 999, + ptn: '', + deviceType: '2', + }).then((res) => { + markerArrHotInfo.value = res.data.rows + markerArrHot.value = res.data.rows.map(item => ([Number(item.lng), Number(item.lat)])) + }) // getElectricityListAll().then((res) => { // // 电网列表 // electricityList.value = res.data @@ -312,12 +374,27 @@ // } // }) }) +// 用电检测/用热监测 默认用电 +const flagType = ref(true) +// 切换用电检测/用热监测 +const changeFlagType = () => { + map.value.clearMap() + if (flagType.value) { + useHot() + } + else { + useElectricity() + } + flagType.value = !flagType.value +} +defineExpose({ changeLayerGrop, changeFlagType, flag }) diff --git a/src/router/routes.ts b/src/router/routes.ts index 9f10482..6f295be 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -134,6 +134,16 @@ }, { meta: { + title: '数据管理', + icon: '', + auth: '/dataset', + }, + children: [ + ...dataRoute, + ], + }, + { + meta: { title: '碳足迹监测', icon: '', auth: '/footprint', @@ -194,16 +204,6 @@ // }, { meta: { - title: '数据管理', - icon: '', - auth: '/dataset', - }, - children: [ - ...dataRoute, - ], - }, - { - meta: { title: '系统设置', icon: '', auth: '/system', diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue index f902885..0bb95a0 100644 --- a/src/views/dashboard/index.vue +++ b/src/views/dashboard/index.vue @@ -14,6 +14,13 @@ const change = () => { mapRef.value.changeLayerGrop() } +// 当前展示 +const current = ref(true) +watch(() => current.value, (newVal) => { + mapRef.value.changeFlagType() +}) +// 当前图层 +const layer = ref('卫星图层')