mirror of
				https://github.com/ecomfe/vue-echarts.git
				synced 2025-10-31 08:57:20 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup lang="ts">
 | |
| import { use } from "echarts/core";
 | |
| import { Bar3DChart } from "echarts-gl/charts";
 | |
| import { VisualMapComponent } from "echarts/components";
 | |
| import { GlobeComponent } from "echarts-gl/components";
 | |
| import { shallowRef, onMounted } from "vue";
 | |
| import type { InitOptions, LoadingOptions, Option } from "../../src/types";
 | |
| import VChart from "../../src/ECharts";
 | |
| import VExample from "./Example.vue";
 | |
| import world from "../assets/world.jpg";
 | |
| import starfield from "../assets/starfield.jpg";
 | |
| import { DEMO_TEXT_STYLE } from "../constants";
 | |
| 
 | |
| use([Bar3DChart, VisualMapComponent, GlobeComponent]);
 | |
| 
 | |
| type GlobeDatum = [number, number, number];
 | |
| 
 | |
| function isGlobeData(value: unknown): value is GlobeDatum[] {
 | |
|   return (
 | |
|     Array.isArray(value) &&
 | |
|     value.every(
 | |
|       (entry) =>
 | |
|         Array.isArray(entry) &&
 | |
|         entry.length === 3 &&
 | |
|         typeof entry[0] === "number" &&
 | |
|         typeof entry[1] === "number" &&
 | |
|         typeof entry[2] === "number",
 | |
|     )
 | |
|   );
 | |
| }
 | |
| 
 | |
| const option = shallowRef<Option | undefined>(undefined);
 | |
| const loading = shallowRef(true);
 | |
| 
 | |
| const initOptions: InitOptions = {
 | |
|   renderer: "canvas",
 | |
| };
 | |
| 
 | |
| const loadingOptions: LoadingOptions = {
 | |
|   text: "Loading...",
 | |
|   color: "#000",
 | |
|   textColor: "#fff",
 | |
|   maskColor: "transparent",
 | |
| };
 | |
| 
 | |
| onMounted(async () => {
 | |
|   const module = await import("../data/population.json");
 | |
|   const population = module.default;
 | |
| 
 | |
|   if (!isGlobeData(population)) {
 | |
|     loading.value = false;
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   const processed = population
 | |
|     .filter(([, , amount]) => amount > 0)
 | |
|     .map(([lon, lat, amount]): GlobeDatum => [lon, lat, Math.sqrt(amount)]);
 | |
| 
 | |
|   option.value = {
 | |
|     textStyle: { ...DEMO_TEXT_STYLE },
 | |
|     backgroundColor: "#000",
 | |
|     globe: {
 | |
|       baseTexture: world,
 | |
|       heightTexture: world,
 | |
|       shading: "lambert",
 | |
|       environment: starfield,
 | |
|       light: {
 | |
|         main: {
 | |
|           intensity: 2,
 | |
|         },
 | |
|       },
 | |
|       viewControl: {
 | |
|         autoRotate: false,
 | |
|       },
 | |
|     },
 | |
|     visualMap: {
 | |
|       bottom: "3%",
 | |
|       left: "3%",
 | |
|       max: 40,
 | |
|       calculable: true,
 | |
|       realtime: false,
 | |
|       inRange: {
 | |
|         colorLightness: [0.2, 0.9],
 | |
|       },
 | |
|       textStyle: {
 | |
|         color: "#fff",
 | |
|       },
 | |
|       controller: {
 | |
|         inRange: {
 | |
|           color: "orange",
 | |
|         },
 | |
|       },
 | |
|       outOfRange: {
 | |
|         colorAlpha: 0,
 | |
|       },
 | |
|     },
 | |
|     series: [
 | |
|       {
 | |
|         type: "bar3D",
 | |
|         coordinateSystem: "globe",
 | |
|         data: processed,
 | |
|         barSize: 0.6,
 | |
|         minHeight: 0.2,
 | |
|         silent: true,
 | |
|         itemStyle: {
 | |
|           color: "orange",
 | |
|         },
 | |
|       },
 | |
|     ],
 | |
|   } satisfies Option;
 | |
| 
 | |
|   loading.value = false;
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <VExample id="gl" title="GL charts" desc="Globe · Bar3D">
 | |
|     <VChart
 | |
|       :option="option"
 | |
|       :init-options="initOptions"
 | |
|       autoresize
 | |
|       :loading="loading"
 | |
|       :loading-options="loadingOptions"
 | |
|       style="background-color: #000"
 | |
|     />
 | |
|     <template #extra>
 | |
|       <p>
 | |
|         You can use extension packs like
 | |
|         <a href="https://github.com/ecomfe/echarts-gl">ECharts-GL</a>.
 | |
|       </p>
 | |
|       <p>
 | |
|         <small>(You can only use the canvas renderer for GL charts.)</small>
 | |
|       </p>
 | |
|     </template>
 | |
|   </VExample>
 | |
| </template>
 | 
