152 lines
4.4 KiB
152 lines
4.4 KiB
import pin19be6b from '/@/assets/icons/pin-19be6b.svg' |
|
import pin212121 from '/@/assets/icons/pin-212121.svg' |
|
import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg' |
|
import pinb620e0 from '/@/assets/icons/pin-b620e0.svg' |
|
import pine23c39 from '/@/assets/icons/pin-e23c39.svg' |
|
import pineffbb00 from '/@/assets/icons/pin-ffbb00.svg' |
|
import { getRoot } from '/@/root' |
|
import rootStore from '/@/store' |
|
import { GeojsonCoordinate } from '/@/types/map' |
|
|
|
export function useGMapCover () { |
|
const root = getRoot() |
|
const AMap = root.$aMap |
|
|
|
const normalColor = '#2D8CF0' |
|
const store = rootStore |
|
const coverList = store.state.coverList |
|
|
|
function AddCoverToMap (cover :any) { |
|
root.$map.add(cover) |
|
coverList.push(cover) |
|
// console.log('coverList:', store.state.coverList) |
|
} |
|
|
|
function getPinIcon (color?:string) { |
|
// console.log('color', color) |
|
const colorObj: { |
|
[key: number| string]: any |
|
} = { |
|
'2d8cf0': pin2d8cf0, |
|
'19be6b': pin19be6b, |
|
'212121': pin212121, |
|
'b620e0': pinb620e0, |
|
'e23c39': pine23c39, |
|
'ffbb00': pineffbb00, |
|
} |
|
const iconName = (color?.replaceAll('#', '') || '').toLocaleLowerCase() |
|
return new AMap.Icon({ |
|
// size: new AMap.Size(40, 50), |
|
image: colorObj[iconName], |
|
// imageOffset: new AMap.Pixel(0, -60), |
|
// imageSize: new AMap.Size(40, 50) |
|
}) |
|
} |
|
|
|
function init2DPin (name: string, coordinates:GeojsonCoordinate, color?:string, data?:{}) { |
|
console.log(name, coordinates[0], coordinates[1], color, data) |
|
const pin = new AMap.Marker({ |
|
position: new AMap.LngLat(coordinates[0], coordinates[1]), |
|
title: name, |
|
icon: getPinIcon(color), |
|
// strokeColor: color || normalColor, |
|
// fillColor: color || normalColor, |
|
extData: data |
|
}) |
|
// console.log('coordinates pin', pin) |
|
AddCoverToMap(pin) |
|
} |
|
|
|
function AddOverlayGroup (overlayGroup) { |
|
root.$map.add(overlayGroup) |
|
coverList.push(overlayGroup) |
|
} |
|
function initPolyline (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) { |
|
const path = [] as GeojsonCoordinate[] |
|
coordinates.forEach(coordinate => { |
|
path.push(new AMap.LngLat(coordinate[0], coordinate[1])) |
|
}) |
|
const polyline = new AMap.Polyline({ |
|
path: path, |
|
strokeColor: color || normalColor, |
|
strokeOpacity: 1, |
|
strokeWeight: 2, |
|
strokeStyle: 'solid', |
|
extData: data |
|
// draggable: true, |
|
}) |
|
AddOverlayGroup(polyline) |
|
} |
|
|
|
function initPolygon (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) { |
|
const path = [] as GeojsonCoordinate[] |
|
coordinates.forEach(coordinate => { |
|
path.push(new AMap.LngLat(coordinate[0], coordinate[1])) |
|
}) |
|
// console.log('Polygon', path) |
|
const Polygon = new AMap.Polygon({ |
|
path: path, |
|
strokeOpacity: 1, |
|
strokeWeight: 2, |
|
fillColor: color || normalColor, |
|
fillOpacity: 0.4, |
|
// draggable: true, |
|
strokeColor: color || normalColor, |
|
extData: data |
|
}) |
|
AddOverlayGroup(Polygon) |
|
} |
|
|
|
function removeCoverFromMap (id:string) { |
|
for (let i = 0; i < coverList.length; i++) { |
|
const ele = coverList[i] |
|
// console.log(ele) |
|
const extdata = ele?.getExtData() |
|
if (extdata?.id === id) { |
|
console.log(extdata) |
|
root.$map.remove(ele) |
|
coverList.slice(i, 1) |
|
break |
|
} |
|
} |
|
} |
|
|
|
function getElementFromMap (id:string) { |
|
// console.log('start', new Date().getTime()) |
|
const ele = coverList.find(ele => ele?.getExtData().id === id) |
|
// console.log('end', new Date().getTime()) |
|
return ele |
|
// coverList.forEach((ele:any) => { |
|
// const extdata = ele?.getExtData() |
|
// // console.log(extdata) |
|
// if (extdata?.id === id) { |
|
// return ele |
|
// } |
|
// }) |
|
} |
|
|
|
function updatePinElement (id:string, name: string, coordinates:GeojsonCoordinate, color?:string) { |
|
const element = getElementFromMap(id) as any |
|
if (element) { |
|
const icon = getPinIcon(color) |
|
element.setPosition(new AMap.LngLat(coordinates[0], coordinates[1])) |
|
element.setIcon(icon) |
|
element.setTitle(name) |
|
} else { |
|
// console.log('into init PIN') |
|
init2DPin(name, coordinates, color, { |
|
id: id, |
|
name: name |
|
}) |
|
} |
|
} |
|
|
|
return { |
|
init2DPin, |
|
initPolyline, |
|
initPolygon, |
|
removeCoverFromMap, |
|
getElementFromMap, |
|
updatePinElement |
|
} |
|
}
|
|
|