- 上demo展示

- vue代码
<template>
<div class="h-full flex flex-col">
<div class="chart_title">飞线图</div>
<div ref="chartRef" class="flex-1 mt-4"></div>
</div>
</template>
<script setup>
import echarts from "~/utils/echarts.config";
import useEcharts from "@/hooks/useEcharts";
const props = defineProps({
datas: {
type: Object,
required: true,
},
geoJSONData: {
type: Object,
required: true,
},
});
const { echartResize } = useEcharts();
const chartRef = ref();
const myChart = ref();
const convertData = data => {
const res = [];
for (let i = 0; i < data.length; i++) {
const dataItem = data[i];
const fromCoord = props.datas.chinaGeoCoordMap[dataItem[0].name];
const toCoords = props.datas.toCoords;
if (fromCoord && toCoords[i]) {
res.push({ coords: [toCoords[i], fromCoord] });
}
}
return res;
};
const chartInit = () => {
const series = [];
[["四川", props.datas.chinaDatas]].forEach(item => {
series.push(
{
type: "map",
map: "chinaGeoCoordMap",
aspectScale: 0.85,
layoutCenter: ["50%", "50%"],
layoutSize: "140%",
zoom: 1,
scaleLimit: {
min: 1,
max: 2,
},
itemStyle: {
areaColor: "#12235c",
borderColor: "#2ab8ff",
borderWidth: 0.5,
shadowColor: "rgba(0,54,255, 0.4)",
shadowBlur: 100,
},
emphasis: {
areaColor: "#02102b",
label: {
color: "#fff",
},
},
label: {
show: true,
color: "#fff",
fontSize: 12,
fontWeight: "bold",
},
},
{
type: "lines",
zlevel: 2,
effect: {
show: true,
period: 3,
trailLength: 0.02,
symbol: "arrow",
symbolSize: 5,
},
lineStyle: {
color: "#00eaff",
width: 1,
opacity: 0.7,
curveness: 0.3,
},
data: convertData(item[1]),
},
{
type: "effectScatter",
coordinateSystem: "geo",
zlevel: 2,
rippleEffect: {
period: 4,
brushType: "stroke",
scale: 4,
},
emphasis: {
show: true,
position: "right",
offset: [5, 0],
formatter: params => params.data.name,
fontSize: 13,
},
symbol: "circle",
symbolSize: val => 5 + val[2] * 5,
itemStyle: {
show: true,
color: "#00eaff",
},
data: item[1].map(dataItem => {
return props.datas.chinaGeoCoordMap[dataItem[0].name].concat([dataItem[0].value]);
}),
},
{
type: "scatter",
coordinateSystem: "geo",
zlevel: 2,
emphasis: {
color: "#f60",
label: {
normal: {
show: false,
position: "right",
color: "#0f0",
formatter: "{b}",
textStyle: {
color: "#0f0",
},
},
},
},
symbol: "pin",
symbolSize: 50,
data: [props.datas.chinaGeoCoordMap[item[0]].concat([10])],
}
);
});
const option = {
geo: {
map: "chinaGeoCoordMap",
aspectScale: 0.85,
layoutCenter: ["50%", "50%"],
layoutSize: "100%",
itemStyle: {
shadowColor: "#276fce",
shadowOffsetX: 0,
shadowOffsetY: 15,
opacity: 0.5,
},
emphasis: {
itemStyle: {
shadowColor: "#276fce",
shadowOffsetX: 0,
shadowOffsetY: 15,
opacity: 0.5,
areaColor: "#276fce",
},
},
regions: [
{
name: "南海诸岛",
itemStyle: {
areaColor: "rgba(0, 10, 52, 1)",
borderColor: "rgba(0, 10, 52, 1)",
opacity: 0,
label: {
show: false,
color: "#009cc9",
},
},
label: {
show: false,
color: "#FFFFFF",
fontSize: 12,
},
},
],
},
series,
};
option && myChart.value.setOption(option);
};
onMounted(() => {
const geoJSON = props.geoJSONData;
echarts.registerMap("chinaGeoCoordMap", geoJSON);
myChart.value = echarts.init(chartRef.value);
echartResize(myChart.value);
chartInit();
});
</script>
<style lang="scss" scoped></style>
async getGeoJSONData() {
if (fs.existsSync(cacheFilePath)) {
const cacheData = fs.readFileSync(cacheFilePath, "utf-8");
return JSON.parse(cacheData);
}
const url = "https://geojson.cn/api/data/china.json";
try {
const response = await axios.get(url);
const data = response.data;
fs.writeFileSync(cacheFilePath, JSON.stringify(data));
return data;
} catch (error) {
throw Error(error);
}
}
getChinaData() {
return {
chinaGeoCoordMap: {
四川: [103.9526, 30.7617],
黑龙江: [127.9688, 45.368],
内蒙古: [110.3467, 41.4899],
吉林: [125.8154, 44.2584],
北京市: [116.4551, 40.2539],
辽宁: [123.1238, 42.1216],
河北: [114.4995, 38.1006],
天津: [117.4219, 39.4189],
山西: [112.3352, 37.9413],
陕西: [109.1162, 34.2004],
甘肃: [103.5901, 36.3043],
宁夏: [106.3586, 38.1775],
青海: [101.4038, 36.8207],
新疆: [87.611053, 43.828171],
西藏: [91.117212, 29.646922],
重庆: [108.384366, 30.439702],
山东: [117.1582, 36.8701],
河南: [113.4668, 34.6234],
江苏: [118.8062, 31.9208],
安徽: [117.29, 32.0581],
湖北: [114.3896, 30.6628],
浙江: [119.5313, 29.8773],
福建: [119.4543, 25.9222],
江西: [116.0046, 28.6633],
湖南: [113.0823, 28.2568],
贵州: [106.6992, 26.7682],
云南: [102.9199, 25.4663],
广东: [113.12244, 23.009505],
广西: [108.479, 23.1152],
海南: [110.3893, 19.8516],
台湾: [120.702967, 24.123621],
上海: [121.4648, 31.2891],
},
chinaDatas: [
[{ name: "北京市", value: 0 }, { name: "黑龙江", value: 0 }, { name: "上海市" }],
[{ name: "内蒙古", value: 0 }],
[{ name: "吉林", value: 0 }],
[{ name: "辽宁", value: 0 }],
[{ name: "河北", value: 0 }],
[{ name: "天津", value: 0 }],
[{ name: "山西", value: 0 }],
[{ name: "陕西", value: 0 }],
[{ name: "甘肃", value: 0 }],
[{ name: "新疆", value: 0 }],
[{ name: "西藏", value: 0 }],
[{ name: "台湾", value: 0 }],
[{ name: "黑龙江", value: 0 }],
[{ name: "云南", value: 1 }],
[{ name: "宁夏", value: 0 }],
[{ name: "青海", value: 0 }],
[{ name: "四川", value: 2 }],
[{ name: "重庆", value: 1 }],
[{ name: "山东", value: 0 }],
[{ name: "河南", value: 0 }],
[{ name: "江苏", value: 0 }],
[{ name: "安徽", value: 0 }],
[{ name: "湖北", value: 0 }],
[{ name: "浙江", value: 0 }],
[{ name: "福建", value: 0 }],
[{ name: "江西", value: 0 }],
[{ name: "湖南", value: 0 }],
[{ name: "贵州", value: 1 }],
[{ name: "广西", value: 0 }],
[{ name: "海南", value: 0 }],
[{ name: "上海", value: 0 }],
],
toCoords: [
[103.9526, 30.7617],
[103.9526, 30.7617],
[108.384366, 30.439702],
[108.384366, 30.439702],
[108.384366, 30.439702],
[108.384366, 30.439702],
[108.384366, 30.439702],
[102.9199, 25.4663],
[102.9199, 25.4663],
[102.9199, 25.4663],
[102.9199, 25.4663],
[102.9199, 25.4663],
[106.6992, 26.7682],
[106.6992, 26.7682],
[106.6992, 26.7682],
[106.6992, 26.7682],
[106.6992, 26.7682],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
[103.9526, 30.7617],
],
};
}