From b010d69b99daeb9f893fe5f8d46fbd1d946fbb05 Mon Sep 17 00:00:00 2001 From: Dustella Date: Thu, 13 Feb 2025 15:46:58 +0800 Subject: [PATCH] release: v1 --- .gitignore | 2 + src/assets/colorbar.png | Bin 2531 -> 2934 bytes src/components.d.ts | 1 + src/components/AMapClient.vue | 62 +++++++++++++++------------- src/components/PosForm.vue | 2 +- src/components/ui/switch/Switch.vue | 39 +++++++++++++++++ src/components/ui/switch/index.ts | 1 + src/layouts/map.vue | 22 ++++++---- 8 files changed, 92 insertions(+), 37 deletions(-) create mode 100644 src/components/ui/switch/Switch.vue create mode 100644 src/components/ui/switch/index.ts diff --git a/.gitignore b/.gitignore index 585d73f..1ba80ad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ node_modules target dist .env +.env* +!.env.example .vite-ssg-temp \ No newline at end of file diff --git a/src/assets/colorbar.png b/src/assets/colorbar.png index 48a44fbc9b968f72899f2731ad88afc3e4af0c3b..34184ac179ef51e04315fb54d54cb4f087eabd6a 100644 GIT binary patch literal 2934 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 E0S3tFH2?qr literal 2531 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 diff --git a/src/components.d.ts b/src/components.d.ts index 70e1b69..391c904 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -56,6 +56,7 @@ declare module 'vue' { SelectSeparator: typeof import('./components/ui/select/SelectSeparator.vue')['default'] SelectTrigger: typeof import('./components/ui/select/SelectTrigger.vue')['default'] SelectValue: typeof import('./components/ui/select/SelectValue.vue')['default'] + Switch: typeof import('./components/ui/switch/Switch.vue')['default'] Table: typeof import('./components/ui/table/Table.vue')['default'] TableBody: typeof import('./components/ui/table/TableBody.vue')['default'] TableCaption: typeof import('./components/ui/table/TableCaption.vue')['default'] diff --git a/src/components/AMapClient.vue b/src/components/AMapClient.vue index 9a6714c..3a3b5d8 100644 --- a/src/components/AMapClient.vue +++ b/src/components/AMapClient.vue @@ -7,11 +7,11 @@ import { useOptions } from '@/composables/dateOpt' import '@amap/amap-jsapi-types' -const amapInstance = ref(null) -const map = ref(null) -const previousLayer = ref(null) +let amapInstance: null | typeof AMap = null +let map: null | AMap.Map = null +let previousLayer: null | AMap.ImageLayer = null -const FORCE_MODE_OVERRIDE = 'image' as 'image' | 'heatmap' | null +const FORCE_MODE_OVERRIDE = null as 'image' | 'heatmap' | null function getPostionText(position: [number, number]) { const [x, y] = position @@ -33,7 +33,7 @@ const apiKey = import.meta.env.VITE_AMAP_API_KEY const { options, currentFocus, getImageUrl, getHeatPoints } = useOptions() watch(options, async () => { - if (!map.value || !amapInstance.value) { + if (!map || !amapInstance) { return } if (options.castBeginDate === '' || options.castDayNo === -1) { @@ -56,24 +56,26 @@ watch(currentFocus, (newFocus) => { } const [lat, lon] = newFocus() // debugger - map.value?.setCenter([lat, lon]) - map.value?.setZoom(4) + if (map) { + map.setCenter([lat, lon]) + map.setZoom(4) + } }) const isDark = useDark() watch(isDark, (newValue) => { - map.value?.setMapStyle(newValue ? 'amap://styles/darkblue' : 'amap://styles/whitesmoke') + map?.setMapStyle(newValue ? 'amap://styles/darkblue' : 'amap://styles/whitesmoke') }) async function updateMapImage() { - if (!map.value || !amapInstance.value) { + if (!map || !amapInstance) { return } const url = await getImageUrl() - const image = new amapInstance.value.ImageLayer({ + const image = new amapInstance.ImageLayer({ url, // @ts-expect-error AMap messed up their definition bounds: new AMap.Bounds([-180, -35], [180, 35]), @@ -82,36 +84,38 @@ async function updateMapImage() { opacity: 1, // zooms: [15, 20], }) - map.value.add(image) + map.add(image) image.on('complete', () => { - previousLayer.value?.hide() - previousLayer.value = image + previousLayer?.hide() + previousLayer = image }) } async function updateMapHeatpoints() { - if (!map.value || !amapInstance.value) { + if (!map || !amapInstance) { return } - + previousLayer?.hide() const data = await getHeatPoints() let heatMap: any - const _map = map.value // @ts-expect-error Amap not providing heatmap types - _map.plugin(['AMap.Heatmap'], () => { + map.plugin(['AMap.HeatMap'], () => { // @ts-expect-error Amap not providing heatmap types - heatMap = new amapInstance.value.HeatMap(_map, { + heatMap = new amapInstance.HeatMap(map, { - radius: 100, // 给定半径 + radius: 25, // 给定半径 opacity: [0, 0.8], - + gradient: { + 0.0: 'red', + 1.0: 'red', + }, }) heatMap.setDataSet({ data, max: 1000, }) - heatMap.show() + previousLayer = heatMap }) } @@ -123,9 +127,9 @@ onMounted(async () => { version: '2.0', plugins: [], }) - amapInstance.value = _AMap + amapInstance = _AMap - map.value = new _AMap.Map('amap-container', { + map = new _AMap.Map('amap-container', { zoom: 5, center: [130, 17], zooms: [4, 20], @@ -136,13 +140,13 @@ onMounted(async () => { // ], }) - map.value.setBounds(new AMap.Bounds([-180, -35], [180, 35])) - map.value.setLimitBounds(new AMap.Bounds([-180, -35], [180, 35])) - map.value.setZoom(5) + map.setBounds(new AMap.Bounds([-180, -35], [180, 35])) + map.setLimitBounds(new AMap.Bounds([-180, -35], [180, 35])) + map.setZoom(5) - map.value.on('click', (e) => { + map.on('click', (e) => { const position = [e.lnglat.lng, e.lnglat.lat] as [number, number] - const infoWindow = new amapInstance.value!.InfoWindow({ + const infoWindow = new amapInstance!.InfoWindow({ content: `
${getPostionText(position).getX()} @@ -151,7 +155,7 @@ onMounted(async () => {
`, }) - infoWindow.open(map.value!, e.lnglat) + infoWindow.open(map!, e.lnglat) }) } }) diff --git a/src/components/PosForm.vue b/src/components/PosForm.vue index a153f42..20fab51 100644 --- a/src/components/PosForm.vue +++ b/src/components/PosForm.vue @@ -42,8 +42,8 @@ function getPostionText(position: [number, number]) { - {{ getPostionText(postion).getX() }} {{ getPostionText(postion).getY() }} + {{ getPostionText(postion).getX() }}