mirror of
https://gitee.com/dromara/go-view.git
synced 2025-02-24 16:22:57 +08:00
feat: 抽取PR地图下钻代码
This commit is contained in:
parent
ea179f9897
commit
19165c76d5
@ -11,7 +11,10 @@ export const option = {
|
|||||||
dataset: dataJson,
|
dataset: dataJson,
|
||||||
mapRegion: {
|
mapRegion: {
|
||||||
adcode: 'china',
|
adcode: 'china',
|
||||||
showHainanIsLands: true
|
showHainanIsLands: true,
|
||||||
|
enter: false,
|
||||||
|
backSize: 20,
|
||||||
|
backColor: '#ffffff'
|
||||||
},
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
show: true,
|
show: true,
|
||||||
@ -103,19 +106,19 @@ export const option = {
|
|||||||
borderColor: 'rgba(147, 235, 248, 0.8)',
|
borderColor: 'rgba(147, 235, 248, 0.8)',
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: '#FFFFFF',
|
color: '#FFFFFF',
|
||||||
fontSize: 12,
|
fontSize: 12
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
label: {
|
label: {
|
||||||
show: false,
|
show: false,
|
||||||
color: '#FFFFFF',
|
color: '#FFFFFF',
|
||||||
fontSize: 12,
|
fontSize: 12
|
||||||
},
|
},
|
||||||
emphasis: {
|
emphasis: {
|
||||||
disabled: false,
|
disabled: false,
|
||||||
label: {
|
label: {
|
||||||
color: '#FFFFFF',
|
color: '#FFFFFF',
|
||||||
fontSize: 12,
|
fontSize: 12
|
||||||
},
|
},
|
||||||
itemStyle: {
|
itemStyle: {
|
||||||
areaColor: '#389BB7',
|
areaColor: '#389BB7',
|
||||||
@ -148,6 +151,26 @@ export const option = {
|
|||||||
shadowOffsetY: 2,
|
shadowOffsetY: 2,
|
||||||
shadowBlur: 10
|
shadowBlur: 10
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'lines',
|
||||||
|
zlevel: 2,
|
||||||
|
effect: {
|
||||||
|
show: true,
|
||||||
|
period: 4, //箭头指向速度,值越小速度越快
|
||||||
|
trailLength: 0.4, //特效尾迹长度[0,1]值越大,尾迹越长重
|
||||||
|
symbol: 'arrow', //箭头图标
|
||||||
|
symbolSize: 7 //图标大小
|
||||||
|
},
|
||||||
|
lineStyle: {
|
||||||
|
normal: {
|
||||||
|
color: '#4fb6d2',
|
||||||
|
width: 1, //线条宽度
|
||||||
|
opacity: 0.1, //尾迹线条透明度
|
||||||
|
curveness: 0.3 //尾迹线条曲直度
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -69,11 +69,7 @@
|
|||||||
</n-space>
|
</n-space>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem name="字体颜色">
|
<SettingItem name="字体颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[1].label.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
:modes="['hex']"
|
|
||||||
v-model:value="seriesList[1].label.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem name="字体大小">
|
<SettingItem name="字体大小">
|
||||||
<n-input-number
|
<n-input-number
|
||||||
@ -180,6 +176,22 @@
|
|||||||
<SettingItem>
|
<SettingItem>
|
||||||
<n-checkbox v-model:checked="mapRegion.showHainanIsLands" size="small">显示南海群岛</n-checkbox>
|
<n-checkbox v-model:checked="mapRegion.showHainanIsLands" size="small">显示南海群岛</n-checkbox>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
|
<SettingItem v-if="seriesList[2]">
|
||||||
|
<n-checkbox v-model:checked="mapRegion.enter" size="small">点击进入下级</n-checkbox>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
<SettingItemBox name="返回图标" v-if="mapRegion.enter">
|
||||||
|
<SettingItem name="颜色">
|
||||||
|
<n-color-picker size="small" :modes="['hex']" v-model:value="mapRegion.backColor"></n-color-picker>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="大小">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="mapRegion.backSize"
|
||||||
|
:min="1"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入字体大小"
|
||||||
|
></n-input-number>
|
||||||
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
<CollapseItem name="标记" :expanded="true">
|
<CollapseItem name="标记" :expanded="true">
|
||||||
@ -223,6 +235,47 @@
|
|||||||
</SettingItem>
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
|
|
||||||
|
<CollapseItem v-if="seriesList[2]" name="飞线" :expanded="true">
|
||||||
|
<SettingItemBox name="箭头">
|
||||||
|
<SettingItem name="速度">
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<n-input-number v-model:value="seriesList[2].effect.period" size="small" :min="0"></n-input-number>
|
||||||
|
</template>
|
||||||
|
值越小速度越快
|
||||||
|
</n-tooltip>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="尾迹">
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="seriesList[2].effect.trailLength"
|
||||||
|
size="small"
|
||||||
|
:min="0"
|
||||||
|
:max="1"
|
||||||
|
></n-input-number>
|
||||||
|
</template>
|
||||||
|
特效尾迹长度[0,1]值越大,尾迹越长重
|
||||||
|
</n-tooltip>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="大小">
|
||||||
|
<n-input-number v-model:value="seriesList[2].effect.symbolSize" size="small" :min="0"></n-input-number>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
<SettingItemBox name="配置">
|
||||||
|
<SettingItem name="颜色">
|
||||||
|
<n-color-picker
|
||||||
|
size="small"
|
||||||
|
:modes="['hex']"
|
||||||
|
v-model:value="seriesList[2].lineStyle.normal.color"
|
||||||
|
></n-color-picker>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="宽度">
|
||||||
|
<n-input-number v-model:value="seriesList[2].lineStyle.normal.width" size="small" :min="1"></n-input-number>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
</CollapseItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -21,6 +21,32 @@
|
|||||||
"value": [126.642464, 45.756967, 101]
|
"value": [126.642464, 45.756967, 101]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"line": [
|
||||||
|
{
|
||||||
|
"coords": [
|
||||||
|
[113.665412, 34.757975],
|
||||||
|
[116.405285, 39.904989]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"coords": [
|
||||||
|
[101.778916, 36.623178],
|
||||||
|
[116.405285, 39.904989]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"coords": [
|
||||||
|
[106.278179, 38.46637],
|
||||||
|
[116.405285, 39.904989]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"coords": [
|
||||||
|
[126.642464, 45.756967],
|
||||||
|
[116.405285, 39.904989]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"map": [
|
"map": [
|
||||||
{
|
{
|
||||||
"name": "北京市",
|
"name": "北京市",
|
||||||
|
@ -1,12 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize>
|
<div>
|
||||||
|
<div class="back-icon" v-if="(enter && levelHistory.length !== 0) || (enter && !isPreview())" @click="backLevel">
|
||||||
|
<n-icon :color="backColor" :size="backSize * 1.1">
|
||||||
|
<ArrowBackIcon />
|
||||||
|
</n-icon>
|
||||||
|
<span
|
||||||
|
:style="{
|
||||||
|
'font-weight': 200,
|
||||||
|
color: backColor,
|
||||||
|
'font-size': `${backSize}px`
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
返回上级
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<v-chart
|
||||||
|
ref="vChartRef"
|
||||||
|
:init-options="initOptions"
|
||||||
|
:theme="themeColor"
|
||||||
|
:option="option.value"
|
||||||
|
:manual-update="isPreview()"
|
||||||
|
autoresize
|
||||||
|
@click="chartPEvents"
|
||||||
|
>
|
||||||
</v-chart>
|
</v-chart>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType, reactive, watch, ref, nextTick } from 'vue'
|
import { PropType, reactive, watch, ref, nextTick, toRefs } from 'vue'
|
||||||
import config, { includes } from './config'
|
import config, { includes } from './config'
|
||||||
import VChart from 'vue-echarts'
|
import VChart from 'vue-echarts'
|
||||||
|
import { icon } from '@/plugins'
|
||||||
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
|
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
|
||||||
import { use, registerMap } from 'echarts/core'
|
import { use, registerMap } from 'echarts/core'
|
||||||
import { EffectScatterChart, MapChart } from 'echarts/charts'
|
import { EffectScatterChart, MapChart } from 'echarts/charts'
|
||||||
@ -16,6 +41,7 @@ import { mergeTheme, setOption } from '@/packages/public/chart'
|
|||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { isPreview } from '@/utils'
|
import { isPreview } from '@/utils'
|
||||||
import mapJsonWithoutHainanIsLands from './mapWithoutHainanIsLands.json'
|
import mapJsonWithoutHainanIsLands from './mapWithoutHainanIsLands.json'
|
||||||
|
import mapChinaJson from './mapGeojson/china.json'
|
||||||
import { DatasetComponent, GridComponent, TooltipComponent, GeoComponent, VisualMapComponent } from 'echarts/components'
|
import { DatasetComponent, GridComponent, TooltipComponent, GeoComponent, VisualMapComponent } from 'echarts/components'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@ -33,6 +59,10 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const { ArrowBackIcon } = icon.ionicons5
|
||||||
|
let levelHistory: any = ref([])
|
||||||
|
|
||||||
|
const { backColor, backSize, enter } = toRefs(props.chartConfig.option.mapRegion)
|
||||||
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
|
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
|
||||||
|
|
||||||
use([
|
use([
|
||||||
@ -67,7 +97,7 @@ registerMap(`${props.chartConfig.option.mapRegion.adcode}`, { geoJSON: {} as any
|
|||||||
// 进行更换初始化地图 如果为china 单独处理
|
// 进行更换初始化地图 如果为china 单独处理
|
||||||
const registerMapInitAsync = async () => {
|
const registerMapInitAsync = async () => {
|
||||||
await nextTick()
|
await nextTick()
|
||||||
const adCode = `${props.chartConfig.option.mapRegion.adcode}`;
|
const adCode = `${props.chartConfig.option.mapRegion.adcode}`
|
||||||
if (adCode !== 'china') {
|
if (adCode !== 'china') {
|
||||||
await getGeojson(adCode)
|
await getGeojson(adCode)
|
||||||
} else {
|
} else {
|
||||||
@ -87,7 +117,16 @@ const vEchartsSetOption = () => {
|
|||||||
const dataSetHandle = async (dataset: any) => {
|
const dataSetHandle = async (dataset: any) => {
|
||||||
props.chartConfig.option.series.forEach((item: any) => {
|
props.chartConfig.option.series.forEach((item: any) => {
|
||||||
if (item.type === 'effectScatter' && dataset.point) item.data = dataset.point
|
if (item.type === 'effectScatter' && dataset.point) item.data = dataset.point
|
||||||
else if (item.type === 'map' && dataset.map) item.data = dataset.map
|
else if (item.type === 'lines' && dataset.line) {
|
||||||
|
item.data = dataset.line.map((it: any) => {
|
||||||
|
return {
|
||||||
|
...it,
|
||||||
|
lineStyle: {
|
||||||
|
color: props.chartConfig.option.series[2].lineStyle.normal.color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else if (item.type === 'map' && dataset.map) item.data = dataset.map
|
||||||
})
|
})
|
||||||
if (dataset.pieces) props.chartConfig.option.visualMap.pieces = dataset.pieces
|
if (dataset.pieces) props.chartConfig.option.visualMap.pieces = dataset.pieces
|
||||||
|
|
||||||
@ -101,6 +140,45 @@ const hainanLandsHandle = async (newData: boolean) => {
|
|||||||
registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} })
|
registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 点击区域
|
||||||
|
const chartPEvents = (e: any) => {
|
||||||
|
if (e.seriesType !== 'map') return
|
||||||
|
if (!props.chartConfig.option.mapRegion.enter) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mapChinaJson.features.forEach(item => {
|
||||||
|
var pattern = new RegExp(e.name)
|
||||||
|
if (pattern.test(item.properties.name)) {
|
||||||
|
let code = String(item.properties.adcode)
|
||||||
|
levelHistory.value.push(code)
|
||||||
|
checkOrMap(code)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回上一级
|
||||||
|
const backLevel = () => {
|
||||||
|
levelHistory.value = []
|
||||||
|
if (levelHistory.value.length > 1) {
|
||||||
|
levelHistory.value.pop()
|
||||||
|
const code = levelHistory[levelHistory.value.length - 1]
|
||||||
|
checkOrMap(code)
|
||||||
|
} else {
|
||||||
|
checkOrMap('china')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 切换地图
|
||||||
|
const checkOrMap = async (newData: string) => {
|
||||||
|
await getGeojson(newData)
|
||||||
|
props.chartConfig.option.geo.map = newData
|
||||||
|
props.chartConfig.option.series.forEach((item: any) => {
|
||||||
|
if (item.type === 'map') item.map = newData
|
||||||
|
})
|
||||||
|
vEchartsSetOption()
|
||||||
|
}
|
||||||
|
|
||||||
//监听 dataset 数据发生变化
|
//监听 dataset 数据发生变化
|
||||||
watch(
|
watch(
|
||||||
() => props.chartConfig.option.dataset,
|
() => props.chartConfig.option.dataset,
|
||||||
@ -113,8 +191,22 @@ watch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 监听线的颜色
|
||||||
|
if (props.chartConfig.option.series[2] && !isPreview()) {
|
||||||
|
watch(
|
||||||
|
() => props.chartConfig.option.series[2].lineStyle.normal.color,
|
||||||
|
() => {
|
||||||
|
dataSetHandle(props.chartConfig.option.dataset)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
//监听是否显示南海群岛
|
//监听是否显示南海群岛
|
||||||
watch(
|
if (!isPreview()) {
|
||||||
|
watch(
|
||||||
() => props.chartConfig.option.mapRegion.showHainanIsLands,
|
() => props.chartConfig.option.mapRegion.showHainanIsLands,
|
||||||
async newData => {
|
async newData => {
|
||||||
try {
|
try {
|
||||||
@ -127,19 +219,14 @@ watch(
|
|||||||
{
|
{
|
||||||
deep: false
|
deep: false
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
}
|
||||||
//监听地图展示区域发生变化
|
//监听地图展示区域发生变化
|
||||||
watch(
|
watch(
|
||||||
() => `${props.chartConfig.option.mapRegion.adcode}`,
|
() => `${props.chartConfig.option.mapRegion.adcode}`,
|
||||||
async newData => {
|
newData => {
|
||||||
try {
|
try {
|
||||||
await getGeojson(newData)
|
checkOrMap(newData)
|
||||||
props.chartConfig.option.geo.map = newData
|
|
||||||
props.chartConfig.option.series.forEach((item: any) => {
|
|
||||||
if (item.type === 'map') item.map = newData
|
|
||||||
})
|
|
||||||
vEchartsSetOption()
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
@ -154,3 +241,16 @@ useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
|
|||||||
dataSetHandle(newData)
|
dataSetHandle(newData)
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scope lang="scss">
|
||||||
|
.back-icon {
|
||||||
|
z-index: 50;
|
||||||
|
cursor: pointer;
|
||||||
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
Loading…
Reference in New Issue
Block a user