Commit 0ad040a4b62e9ec4b87e89baa5560f875cdc9cd2
1 parent
540a0ebf
feat(src/packages): 图表地图 高德地图新增标注物点击弹窗
Showing
6 changed files
with
56 additions
and
52 deletions
@@ -5,6 +5,12 @@ import { chartInitConfig } from '@/settings/designSetting' | @@ -5,6 +5,12 @@ import { chartInitConfig } from '@/settings/designSetting' | ||
5 | import cloneDeep from 'lodash/cloneDeep' | 5 | import cloneDeep from 'lodash/cloneDeep' |
6 | import dataJson from './data.json' | 6 | import dataJson from './data.json' |
7 | 7 | ||
8 | +export type dataExtraInfoType = typeof dataJson.markers[number]['extraInfo'] //data.json下的extraInfo类型 | ||
9 | + | ||
10 | +export type dataJsonType = typeof dataJson //data.json类型 | ||
11 | + | ||
12 | +export type dataJsonMarkersType = typeof dataJson.markers[number] //data.json markers类型 | ||
13 | + | ||
8 | export enum ThemeEnum { | 14 | export enum ThemeEnum { |
9 | NORMAL = 'normal', | 15 | NORMAL = 'normal', |
10 | DARK = 'dark', | 16 | DARK = 'dark', |
1 | { | 1 | { |
2 | "markers": [ | 2 | "markers": [ |
3 | { | 3 | { |
4 | - "name": "x", | 4 | + "name": "模拟1", |
5 | "value": 20, | 5 | "value": 20, |
6 | "position": [103.856504, 30.687278], | 6 | "position": [103.856504, 30.687278], |
7 | "extraInfo": { | 7 | "extraInfo": { |
8 | - "tbDeviceId": "xxxxxxxxxxx", | ||
9 | - "name": "xx", | ||
10 | - "alias": "xx", | 8 | + "tbDeviceId": "@xxxxxxxxxxx", |
9 | + "name": "模拟1", | ||
10 | + "alias": "模拟1", | ||
11 | "organizationDTO": { | 11 | "organizationDTO": { |
12 | - "name": "xx" | 12 | + "name": "模拟1" |
13 | }, | 13 | }, |
14 | "deviceState": "INACTIVE", | 14 | "deviceState": "INACTIVE", |
15 | "deviceProfile": { | 15 | "deviceProfile": { |
@@ -23,15 +23,15 @@ | @@ -23,15 +23,15 @@ | ||
23 | } | 23 | } |
24 | }, | 24 | }, |
25 | { | 25 | { |
26 | - "name": "xx", | 26 | + "name": "模拟2", |
27 | "value": 30, | 27 | "value": 30, |
28 | "position": [104.095368, 30.716787], | 28 | "position": [104.095368, 30.716787], |
29 | "extraInfo": { | 29 | "extraInfo": { |
30 | - "tbDeviceId": "xxxxxxxxxxxxxxx", | ||
31 | - "name": "xxx", | ||
32 | - "alias": "xx", | 30 | + "tbDeviceId": "@xxxxxxxxxxxxxxx", |
31 | + "name": "模拟2", | ||
32 | + "alias": "模拟2", | ||
33 | "organizationDTO": { | 33 | "organizationDTO": { |
34 | - "name": "xx" | 34 | + "name": "模拟2" |
35 | }, | 35 | }, |
36 | "deviceState": "INACTIVE", | 36 | "deviceState": "INACTIVE", |
37 | "deviceProfile": { | 37 | "deviceProfile": { |
src/packages/components/external/Charts/Maps/OverrideMapAmap/images/djx.png
deleted
100644 → 0
1.3 KB
src/packages/components/external/Charts/Maps/OverrideMapAmap/images/online.png
renamed from
src/packages/components/external/Charts/Maps/OverrideMapAmap/images/online1.png
514 Bytes
src/packages/components/external/Charts/Maps/OverrideMapAmap/images/zx.png
deleted
100644 → 0
1.35 KB
@@ -8,10 +8,10 @@ import AMapLoader from '@amap/amap-jsapi-loader' | @@ -8,10 +8,10 @@ import AMapLoader from '@amap/amap-jsapi-loader' | ||
8 | import { CreateComponentType } from '@/packages/index.d' | 8 | import { CreateComponentType } from '@/packages/index.d' |
9 | import { useChartDataFetch } from '@/hooks' | 9 | import { useChartDataFetch } from '@/hooks' |
10 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | 10 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' |
11 | -import { MarkerEnum, ThemeEnum } from './config' | 11 | +import { MarkerEnum, ThemeEnum, dataExtraInfoType, dataJsonType, dataJsonMarkersType } from './config' |
12 | import { isArray } from '@/utils' | 12 | import { isArray } from '@/utils' |
13 | import djh from './images/djh.png' | 13 | import djh from './images/djh.png' |
14 | -import online from './images/online1.png' | 14 | +import online from './images/online.png' |
15 | import lx1 from './images/lx1.png' | 15 | import lx1 from './images/lx1.png' |
16 | import { getDeviceActiveTime } from '@/api/external/common/index' | 16 | import { getDeviceActiveTime } from '@/api/external/common/index' |
17 | import dayjs from 'dayjs' | 17 | import dayjs from 'dayjs' |
@@ -39,6 +39,7 @@ let { | @@ -39,6 +39,7 @@ let { | ||
39 | marker | 39 | marker |
40 | } = toRefs(props.chartConfig.option.mapOptions) | 40 | } = toRefs(props.chartConfig.option.mapOptions) |
41 | 41 | ||
42 | +//官方没有高德地图api的ts,所以类型全用的any | ||
42 | let mapIns: any = null | 43 | let mapIns: any = null |
43 | let markers: any = [] | 44 | let markers: any = [] |
44 | let AMapIns: any = null | 45 | let AMapIns: any = null |
@@ -64,7 +65,7 @@ const initMap = (newData: any) => { | @@ -64,7 +65,7 @@ const initMap = (newData: any) => { | ||
64 | viewMode: viewMode.value, // 地图模式 | 65 | viewMode: viewMode.value, // 地图模式 |
65 | willReadFrequently: true | 66 | willReadFrequently: true |
66 | }) | 67 | }) |
67 | - dataHandle(props.chartConfig.option.dataset) | 68 | + dataHandle(props.chartConfig.option.dataset) //处理地图标点 |
68 | let satellite = new AMap.TileLayer.Satellite() | 69 | let satellite = new AMap.TileLayer.Satellite() |
69 | let roadNet = new AMap.TileLayer.RoadNet() | 70 | let roadNet = new AMap.TileLayer.RoadNet() |
70 | if (newData.amapStyleKey === ThemeEnum.WEIXIN) { | 71 | if (newData.amapStyleKey === ThemeEnum.WEIXIN) { |
@@ -85,12 +86,14 @@ const initMap = (newData: any) => { | @@ -85,12 +86,14 @@ const initMap = (newData: any) => { | ||
85 | }) | 86 | }) |
86 | } | 87 | } |
87 | 88 | ||
88 | -const createInfoWindow = async (extraInfo: any) => { | 89 | +//创建信息弹窗 |
90 | +const createInfoWindow = async (extraInfo: dataExtraInfoType) => { | ||
89 | try { | 91 | try { |
90 | const { name, alias, organizationDTO, deviceState, deviceProfile, deviceInfo, tbDeviceId } = extraInfo | 92 | const { name, alias, organizationDTO, deviceState, deviceProfile, deviceInfo, tbDeviceId } = extraInfo |
91 | - const res = await getDeviceActiveTime(tbDeviceId) | 93 | + if (tbDeviceId.startsWith('@')) return //假的模拟数据则终止 |
94 | + const res = await getDeviceActiveTime(tbDeviceId) //查询设备最后离线时间 | ||
92 | let { lastUpdateTs } = res[0] | 95 | let { lastUpdateTs } = res[0] |
93 | - lastUpdateTs = dayjs(lastUpdateTs).format('YYYY-MM-DD HH:mm:ss') | 96 | + const lastUpdateFormatTs = dayjs(lastUpdateTs).format('YYYY-MM-DD HH:mm:ss') |
94 | return ` | 97 | return ` |
95 | <div style="width:15vw;height:18vh;background-color:white;"> | 98 | <div style="width:15vw;height:18vh;background-color:white;"> |
96 | <div style="margin:0px 10px"> | 99 | <div style="margin:0px 10px"> |
@@ -111,7 +114,9 @@ const createInfoWindow = async (extraInfo: any) => { | @@ -111,7 +114,9 @@ const createInfoWindow = async (extraInfo: any) => { | ||
111 | 设备位置:${!deviceInfo.address ? '该设备暂无地理位置' : deviceInfo.address} | 114 | 设备位置:${!deviceInfo.address ? '该设备暂无地理位置' : deviceInfo.address} |
112 | </div> | 115 | </div> |
113 | <div style="margin-top:6px;"> | 116 | <div style="margin-top:6px;"> |
114 | - ${deviceState === 'ONLINE' ? '在线' : deviceState === 'INACTIVE' ? '创建' : '离线'}时间:${lastUpdateTs} | 117 | + ${ |
118 | + deviceState === 'ONLINE' ? '在线' : deviceState === 'INACTIVE' ? '创建' : '离线' | ||
119 | + }时间:${lastUpdateFormatTs} | ||
115 | </div> | 120 | </div> |
116 | </div> | 121 | </div> |
117 | </div> | 122 | </div> |
@@ -121,7 +126,26 @@ const createInfoWindow = async (extraInfo: any) => { | @@ -121,7 +126,26 @@ const createInfoWindow = async (extraInfo: any) => { | ||
121 | } | 126 | } |
122 | } | 127 | } |
123 | 128 | ||
124 | -const dataHandle = (newData: any) => { | 129 | +//地图点击 |
130 | +const mapClick = (markerInstance: any, markerItem: dataJsonMarkersType) => { | ||
131 | + markerInstance.setExtData({ | ||
132 | + extraInfo: markerItem.extraInfo | ||
133 | + }) | ||
134 | + mapIns.add(markerInstance) | ||
135 | + markerInstance.setLabel({ | ||
136 | + content: markerItem.extraInfo.alias || markerItem.extraInfo.name | ||
137 | + }) | ||
138 | + markerInstance.on('click', async (e: any) => { | ||
139 | + const { extraInfo } = e.target.getExtData() | ||
140 | + let infoWindow = new AMapIns.InfoWindow({ | ||
141 | + content: await createInfoWindow(extraInfo), | ||
142 | + offset: new AMapIns.Pixel(0, -50) | ||
143 | + }) | ||
144 | + infoWindow.open(mapIns, e.target.getPosition()) | ||
145 | + }) | ||
146 | +} | ||
147 | + | ||
148 | +const dataHandle = (newData: dataJsonType) => { | ||
125 | if (!mapIns && !AMapIns) { | 149 | if (!mapIns && !AMapIns) { |
126 | initMap(props.chartConfig.option) | 150 | initMap(props.chartConfig.option) |
127 | return | 151 | return |
@@ -132,54 +156,28 @@ const dataHandle = (newData: any) => { | @@ -132,54 +156,28 @@ const dataHandle = (newData: any) => { | ||
132 | markers = [] | 156 | markers = [] |
133 | // 记录新标记 | 157 | // 记录新标记 |
134 | if (mapMarkerType.value === MarkerEnum.MARKER) { | 158 | if (mapMarkerType.value === MarkerEnum.MARKER) { |
135 | - newData.markers.forEach((markerItem: any) => { | 159 | + newData.markers.forEach((markerItem: dataJsonMarkersType) => { |
136 | const markerInstance = new AMapIns.Marker({ | 160 | const markerInstance = new AMapIns.Marker({ |
137 | position: [markerItem.position[0], markerItem.position[1]], | 161 | position: [markerItem.position[0], markerItem.position[1]], |
138 | offset: new AMapIns.Pixel(-13, -30) | 162 | offset: new AMapIns.Pixel(-13, -30) |
139 | }) | 163 | }) |
140 | - // markers.push(markerInstance) 原作者这种方式添加,地图标注获取不到当前点击对象 | 164 | + // markers.push(markerInstance) 原作者这种方式添加,属于1.4.8版本的 |
141 | // markerInstance.setMap(mapIns) | 165 | // markerInstance.setMap(mapIns) |
142 | - markerInstance.setExtData({ | ||
143 | - extraInfo: markerItem.extraInfo | ||
144 | - }) | ||
145 | - mapIns.add(markerInstance) | ||
146 | - markerInstance.setLabel({ | ||
147 | - content: markerItem.extraInfo.alias || markerItem.extraInfo.name | ||
148 | - }) | ||
149 | - markerInstance.on('click', async (e: any) => { | ||
150 | - const { extraInfo } = e.target.getExtData() | ||
151 | - let infoWindow = new AMapIns.InfoWindow({ | ||
152 | - content: await createInfoWindow(extraInfo), | ||
153 | - offset: new AMapIns.Pixel(0, -50) | ||
154 | - }) | ||
155 | - infoWindow.open(mapIns, e.target.getPosition()) | ||
156 | - }) | 166 | + mapClick(markerInstance, markerItem) |
157 | }) | 167 | }) |
158 | } else if (mapMarkerType.value === MarkerEnum.CIRCLE_MARKER) { | 168 | } else if (mapMarkerType.value === MarkerEnum.CIRCLE_MARKER) { |
159 | - newData.markers.forEach((markerItem: any) => { | 169 | + newData.markers.forEach((markerItem: dataJsonMarkersType) => { |
160 | const markerInstance = new AMapIns.CircleMarker({ | 170 | const markerInstance = new AMapIns.CircleMarker({ |
161 | center: [ | 171 | center: [ |
162 | !markerItem.position[0] ? 0 : markerItem.position[0], | 172 | !markerItem.position[0] ? 0 : markerItem.position[0], |
163 | !markerItem.position[1] ? 0 : markerItem.position[1] | 173 | !markerItem.position[1] ? 0 : markerItem.position[1] |
164 | ], | 174 | ], |
165 | - radius: markerItem.value, | ||
166 | - ...marker.value, | 175 | + radius: markerItem.value, //圆圈半径大小 |
176 | + ...marker.value | ||
167 | }) | 177 | }) |
168 | - // markers.push(markerInstance) //原作者这种方式添加,地图标注获取不到当前点击对象 | 178 | + // markers.push(markerInstance) //原作者这种方式添加,属于1.4.8版本的 |
169 | // markerInstance.setMap(mapIns) | 179 | // markerInstance.setMap(mapIns) |
170 | - markerInstance.setExtData({ | ||
171 | - extraInfo: markerItem.extraInfo | ||
172 | - }) | ||
173 | - mapIns.add(markerInstance) | ||
174 | - markerInstance.on('click', async (e: any) => { | ||
175 | - console.log(e) | ||
176 | - const { extraInfo } = e.target.getExtData() | ||
177 | - let infoWindow = new AMapIns.InfoWindow({ | ||
178 | - content: await createInfoWindow(extraInfo), | ||
179 | - offset: new AMapIns.Pixel(0, -50) | ||
180 | - }) | ||
181 | - infoWindow.open(mapIns, e.target.getPosition()) | ||
182 | - }) | 180 | + mapClick(markerInstance, markerItem) |
183 | }) | 181 | }) |
184 | } | 182 | } |
185 | } | 183 | } |