当前位置: 首页 > wzjs >正文

网站正在建设中提示页面建怎么网站比较赚钱

网站正在建设中提示页面,建怎么网站比较赚钱,济南网站建设服务公司,西安优化外包文章目录 前言一、实现步骤1. 项目初始化2. 准备GeoJson数据3. 创建地图组件4. 创建主页面组件5. 使用组件 二、功能亮点三、性能优化建议四、常见问题解决五、结语六、实战demo七、资源下载 前言 在数据可视化领域,地图展示是一种非常直观的表现形式。而地图钻取&…

文章目录

  • 前言
  • 一、实现步骤
    • 1. 项目初始化
    • 2. 准备GeoJson数据
    • 3. 创建地图组件
    • 4. 创建主页面组件
    • 5. 使用组件
  • 二、功能亮点
  • 三、性能优化建议
  • 四、常见问题解决
  • 五、结语
  • 六、实战demo
  • 七、资源下载


前言

在数据可视化领域,地图展示是一种非常直观的表现形式。而地图钻取(Drill-down)功能可以让用户从宏观到微观逐级查看数据,提供更好的交互体验。本文将详细介绍如何使用 Vue3EChartsGeoJson 实现一个完整的区域地图钻取功能。

技术栈介绍

  • Vue3:当前最流行的前端框架之一,提供响应式数据和组件化开发体验
  • ECharts:百度开源的数据可视化库,功能强大,支持多种图表类型
  • GeoJson:一种用于表示地理空间数据的 JSON 格式标准

一、实现步骤

1. 项目初始化

首先创建一个Vue3项目:

npm init vue@latest vue3-echarts-map
cd vue3-echarts-map
npm install

安装必要的依赖:

npm install echarts axios

2. 准备GeoJson数据

地图钻取需要各级行政区划的 GeoJson 数据,可以从以下途径获取:

  • 阿里云DataV:https://datav.aliyun.com/portal/school/atlas/area_selector
  • GeoJSON:https://geojson.cn/editor?url=https://geojson.cn/api/china/330000.topo.json
  • 高德地图API
  • 自己制作或从公开数据源获取

在本例中,我们准备了中国地图、省级地图和市级地图三个级别的GeoJson数据。

3. 创建地图组件

创建 MapChart.vue 组件:

<template><div ref="chartRef" style="width: 100%; height: 600px;"></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount, watch } from 'vue';
import * as echarts from 'echarts';
import axios from 'axios';const props = defineProps({mapData: Object,chartData: Array,mapName: String,drillLevel: Number
});const emit = defineEmits(['drillDown']);const chartRef = ref(null);
let chartInstance = null;// 初始化图表
const initChart = () => {if (!chartRef.value) return;chartInstance = echarts.init(chartRef.value);// 注册地图数据echarts.registerMap(props.mapName, props.mapData);const option = {title: {text: `${props.mapName}地图`,left: 'center'},tooltip: {trigger: 'item',formatter: params => {const data = params.data;return `${params.name}<br/>${data ? `数值: ${data.value}` : ''}`;}},visualMap: {min: 0,max: 100,text: ['高', '低'],realtime: false,calculable: true,inRange: {color: ['#50a3ba', '#eac736', '#d94e5d']}},series: [{name: props.mapName,type: 'map',map: props.mapName,roam: true,emphasis: {label: {show: true}},data: props.chartData,selectedMode: 'single'}]};chartInstance.setOption(option);// 绑定点击事件实现钻取chartInstance.on('click', params => {if (props.drillLevel < 2) { // 限制钻取层级emit('drillDown', params.name);}});
};// 响应数据变化
watch(() => [props.mapData, props.chartData], () => {if (chartInstance) {initChart();}
});onMounted(() => {initChart();window.addEventListener('resize', resizeChart);
});onBeforeUnmount(() => {if (chartInstance) {chartInstance.dispose();chartInstance = null;}window.removeEventListener('resize', resizeChart);
});const resizeChart = () => {if (chartInstance) {chartInstance.resize();}
};
</script>

4. 创建主页面组件

创建 MapDrillDown.vue 作为主页面:

<template><div class="map-container"><div class="breadcrumb"><span v-for="(item, index) in breadcrumb" :key="index"@click="handleBreadcrumbClick(index)":class="{ 'active': index === breadcrumb.length - 1 }">{{ item }} {{ index < breadcrumb.length - 1 ? '>' : '' }}</span></div><button v-if="currentLevel > 0" @click="drillUp" class="drill-btn">返回上级</button><MapChart:mapData="currentMapData":chartData="currentChartData":mapName="currentMapName":drillLevel="currentLevel"@drillDown="handleDrillDown"/></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';
import MapChart from './MapChart.vue';// 当前级别:0-全国,1-省级,2-市级
const currentLevel = ref(0);
const currentMapData = ref(null);
const currentChartData = ref([]);
const currentMapName = ref('中国');
const breadcrumb = ref(['中国']);// 模拟数据 - 实际项目中可以从API获取
const mockData = {china: [{ name: '广东省', value: 83 },{ name: '浙江省', value: 67 },{ name: '江苏省', value: 72 },// 其他省份数据...],guangdong: [{ name: '广州市', value: 95 },{ name: '深圳市', value: 89 },{ name: '珠海市', value: 78 },// 其他城市数据...],zhejiang: [{ name: '杭州市', value: 88 },{ name: '宁波市', value: 76 },{ name: '温州市', value: 65 },// 其他城市数据...]
};// 加载GeoJson数据
const loadGeoJson = async (name) => {try {// 实际项目中这里应该是从服务器获取GeoJson// const res = await axios.get(`/geojson/${name}.json`);// return res.data;// 这里使用模拟的GeoJson路径let geoJsonPath = '';if (name === '中国') {geoJsonPath = '/geojson/china.json';} else if (['广东省', '浙江省'].includes(name)) {geoJsonPath = `/geojson/${name}.json`;}if (geoJsonPath) {const res = await axios.get(geoJsonPath);return res.data;}return null;} catch (error) {console.error('加载GeoJson失败:', error);return null;}
};// 初始化全国地图
const initChinaMap = async () => {currentLevel.value = 0;currentMapName.value = '中国';breadcrumb.value = ['中国'];const geoJson = await loadGeoJson('中国');if (geoJson) {currentMapData.value = geoJson;currentChartData.value = mockData.china;}
};// 向下钻取
const handleDrillDown = async (name) => {if (currentLevel.value === 0) {// 从全国钻取到省份const geoJson = await loadGeoJson(name);if (geoJson) {currentLevel.value = 1;currentMapName.value = name;breadcrumb.value = ['中国', name];currentMapData.value = geoJson;currentChartData.value = mockData[name.toLowerCase()] || [];}} else if (currentLevel.value === 1) {// 从省份钻取到城市const cityData = mockData[currentMapName.value.toLowerCase()];const city = cityData.find(item => item.name === name);if (city) {currentLevel.value = 2;breadcrumb.value = ['中国', currentMapName.value, name];// 这里可以继续加载更详细的GeoJson数据}}
};// 向上钻取
const drillUp = () => {if (currentLevel.value === 1) {initChinaMap();} else if (currentLevel.value === 2) {const provinceName = breadcrumb.value[1];handleDrillDown(provinceName);}
};// 面包屑导航点击
const handleBreadcrumbClick = (index) => {if (index === 0 && currentLevel.value !== 0) {initChinaMap();} else if (index === 1 && currentLevel.value === 2) {const provinceName = breadcrumb.value[1];handleDrillDown(provinceName);}
};onMounted(() => {initChinaMap();
});
</script><style scoped>
.map-container {position: relative;width: 100%;height: 100%;
}.breadcrumb {margin-bottom: 15px;font-size: 16px;
}.breadcrumb span {cursor: pointer;margin: 0 5px;color: #666;
}.breadcrumb span.active {color: #333;font-weight: bold;
}.breadcrumb span:hover {text-decoration: underline;
}.drill-btn {position: absolute;top: 10px;right: 10px;z-index: 100;padding: 5px 10px;background-color: #409eff;color: white;border: none;border-radius: 4px;cursor: pointer;
}.drill-btn:hover {background-color: #66b1ff;
}
</style>

5. 使用组件

在App.vue中使用我们的地图组件:

<template><div id="app"><h1>区域地图钻取示例</h1><MapDrillDown /></div>
</template><script setup>
import MapDrillDown from './components/MapDrillDown.vue';
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 20px;padding: 20px;
}
</style>

二、功能亮点

  1. 多级钻取:支持从全国地图钻取到省级,再钻取到市级
  2. 面包屑导航:清晰的层级导航,可以快速返回上级
  3. 响应式设计:图表随窗口大小自动调整
  4. 视觉效果:使用渐变色表示数据强度
  5. 交互体验:鼠标悬停显示详细信息,点击实现钻取

三、性能优化建议

  • GeoJson数据精简:使用简化后的 GeoJson 数据减少体积
  • 数据缓存:对已加载的 GeoJson 数据进行缓存
  • 按需加载:只在需要时加载下一级地图数据
  • 防抖处理:对窗口 resize 事件添加防抖
  • Web Worker:大数据量处理可以使用 Web Worker

四、常见问题解决

  1. 地图显示不完整:

    • 检查 GeoJson 数据是否完整
    • 确保 ECharts 正确注册了地图数据
    • 确认地图名称与注册名称一致
  2. 钻取后数据不显示:

    • 检查 mock 数据中是否有对应区域的数据
    • 确认数据格式是否符合 ECharts 要求
    • 查看控制台是否有错误信息
  3. 地图渲染性能问题:

    • 简化 GeoJson 数据
    • 使用 EChartslarge 模式
    • 考虑使用 Canvas 渲染代替 SVG

五、结语

通过本文的介绍,我们实现了一个基于 Vue3EChartsGeoJson 的区域地图钻取功能。这种技术可以广泛应用于各种需要地理数据展示的场景,如商业分析、疫情监控、物流管理等。希望本文能对你的项目开发有所帮助。

六、实战demo

集成到界面设计引擎,体验地址:https://www.nbweixin.cn/autopage/
从左边拖动一个区域地图组件即可查看效果。

在这里插入图片描述

七、资源下载

🔗全国地图geojson包 :https://download.csdn.net/download/mss359681091/90657356?spm=1001.2014.3001.5501

🔗完整demo:https://download.csdn.net/download/mss359681091/90657456?spm=1001.2014.3001.5501


文章转载自:

http://WH0m6Jto.fLchj.cn
http://DnyKuQMe.fLchj.cn
http://aJaQhPVt.fLchj.cn
http://Xt41qwxG.fLchj.cn
http://L6zaKl8x.fLchj.cn
http://BEBNNItn.fLchj.cn
http://6SWmFjyw.fLchj.cn
http://aD3BUdED.fLchj.cn
http://cxLXRStc.fLchj.cn
http://3EuTglMc.fLchj.cn
http://pqIqfD9I.fLchj.cn
http://BY6KCHV1.fLchj.cn
http://sfc39eK0.fLchj.cn
http://0T2GBV4i.fLchj.cn
http://cfWffjGh.fLchj.cn
http://P2Gj70PW.fLchj.cn
http://WfnTu6vQ.fLchj.cn
http://PmhB6qgm.fLchj.cn
http://KDElmstT.fLchj.cn
http://ccbw04Gp.fLchj.cn
http://MDuLZzdg.fLchj.cn
http://3yIi7W9P.fLchj.cn
http://kiZ3j5rm.fLchj.cn
http://WG1MBq00.fLchj.cn
http://66fvevW8.fLchj.cn
http://CgOjHF54.fLchj.cn
http://D9qEelkk.fLchj.cn
http://QQ7qnRw0.fLchj.cn
http://Gb8cqKdb.fLchj.cn
http://LGyassev.fLchj.cn
http://www.dtcms.com/wzjs/679608.html

相关文章:

  • 济南网站制作平台徐州网站建设魔站
  • 栖霞建设网站舆情信息怎么写
  • seo如何网站正常更新免费网站建设推广服务
  • 丹东网站开发公司鹤壁市做网站
  • 安庆哪里做网站乐清新闻综合频道节目表
  • 如何做网站的实时画面wordpress 登录背景
  • 广州网站建设360网站优化wordpress图片旋转
  • 59网一起做网站网站做app的软件叫什么
  • 提供常州网站建设公司企业网站模板哪个好
  • 建一个购物网站要多少钱模拟制作app的软件
  • 网站建设技术网站建设网站建设计入什么科目
  • 个体户可以注册网站建设服务wordpress grace6
  • 网站建设 h5医院网站怎么做优化排名
  • 建设020网站需要多少钱国内环保行业网站开发
  • 深圳php网站开发个人网站设计公司
  • 做网站需要前置审批做游戏网站需要注意的问题
  • 网站基本功能文山专业网站建设哪家好
  • 网站建设常见问题凡客优品家居
  • 重庆品牌型网站建设多少钱指数函数图像及性质
  • 上海石化有做网站设计的吗wordpress 解释符号
  • 合肥网站建设首选 晨飞网络江门网络培训学院
  • 百度做任务的网站网站主页流动图片怎么做
  • 公司签约网站微信saas平台
  • 大庆市建设局网站网站开发工程师是做什么的
  • 上海网站设计工具吉林高端网站建设
  • 南昌网站专业制作订阅号可以做网站链接吗
  • 企业网站改版项目描述无锡网站建设标准
  • 网站建设的商品编码网站名称能用商标做名称吗
  • 海南省住房与城乡建设部网站谷歌关键词搜索量数据查询
  • 扬中网站建设价格借20万资金办厂