From c2b6ebe136ff420bf3fda48896b49723b53d67af Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Fri, 28 Mar 2025 17:31:40 +0800
Subject: [PATCH] feat: 聚合demo

---
 src/views/Home/Home.vue |  136 +++++++++++++++++++++++++++++++--------------
 1 files changed, 93 insertions(+), 43 deletions(-)

diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index 6697a5f..c7e3e76 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -1,49 +1,99 @@
 <template>
-  <Header></Header>
-  <div class="warp">
-    <HomeLeft></HomeLeft>
-    <!-- <div>中间搜索</div> -->
-    <HomeRight></HomeRight>
-  </div>
+  <HomeLeft></HomeLeft>
+  <!-- <div>中间搜索</div> -->
+  <HomeRight></HomeRight>
+  <SearchBox />
 </template>
 
-<script>
-import index from '@/mixins';
-import { mapGetters } from 'vuex';
-import Header from '../Home/components/Header.vue';
-import HomeLeft from '../Home/components/HomeLeft/Index.vue'
-import HomeRight from '../Home/components/HomeRight/Index.vue'
+<script setup>
+import HomeRight from './components/HomeRight/HomeRight.vue';
+import HomeLeft from '@/views/Home/components/HomeLeft/HomeLeft.vue';
+import { getAggregation } from '@/views/Home/aggregation';
+import SearchBox from '@/views/Home/SearchBox.vue';
+import jiangxi from '@/assets/geojson/jiangxi.json';
+import nanchang from '@/assets/geojson/nanchang.json';
+import jiangxishi from '@/assets/geojson/jiangxishi.json';
+import zg from '@/assets/geojson/zg.json';
+import * as Cesium from 'cesium';
 
-export default {
-  mixins: [index],
-  components: {
-    Header,
-    HomeLeft,
-    HomeRight,
-  },
-  name: 'index',
-  provide() {
-    return {
-      index: this,
-    };
-  },
-  computed: {},
-  props: [],
-  methods: {
-
-  },
+const list = [
+  { name: '县', value: [0,48651], gJson: null },
+  { name: '市', value: [48651,314863], gJson: jiangxishi },
+  { name: '省', value: [314863,1169651], gJson: jiangxi },
+  { name: '国', value: [1169651,37962800], gJson: zg },
+];
+let viewer = null;
+const active = ref('');
+const init = () => {
+  determineScaling();
+  viewer.camera.moveEnd.addEventListener(() => {
+    determineScaling();
+  });
 };
-</script>
-<style scoped lang="scss">
-.page-home {
-  height: 100vh;
-  width: 100%;
-  background-size: 100% 100%;
-  background-repeat: no-repeat;
-  font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
-  .warp {
-    display: flex;
-    justify-content: space-between;
+
+const determineScaling = () => {
+  let height = viewer.camera.positionCartographic.height;
+  console.log('缩放结束,高度为:', height);
+  // 根据高度展示对应的 gJson
+  for (let item of list) {
+    // if (height < item.value) {
+    if (height > item.value[0] && height <= item.value[1]) {
+      if (active.value !== item.name) {
+        viewer.dataSources.removeAll(true);
+        viewer.entities.removeAll();
+        active.value = item.name;
+        if (item.gJson) {
+          aggregation(item);
+        }
+      }
+      break;
+    }
   }
-}
-</style>
+};
+
+const aggregation = item => {
+  const featuresList = item.gJson.features.map(item => ({
+    name: item.properties.name,
+    position: item.properties.center,
+  }));
+  // 遍历特征并添加实体
+  featuresList.forEach(feature => {
+    if (!feature.position) return;
+    const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1]);
+    viewer.entities.add({
+      position: position,
+      label: {
+        // 随机整数
+        text: feature.name + Math.floor(Math.random() * 100),
+        font: '14pt monospace',
+        fillColor: Cesium.Color.WHITE,
+        outlineColor: Cesium.Color.BLACK,
+        outlineWidth: 2,
+        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+        pixelOffset: new Cesium.Cartesian2(0, -9),
+      },
+    });
+  });
+  // 加载新的 GeoJSON 数据
+  Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
+    viewer.dataSources.add(dataSource);
+    item.dataSource = dataSource; // 保存数据源以便后续删除
+    // 获取数据源中的实体
+    const entities = dataSource.entities.values;
+    entities.forEach(entity => {
+      entity.polygon.material = new Cesium.ColorMaterialProperty(
+        Cesium.Color.YELLOW.withAlpha(0) // 透明填充
+      );
+      entity.polygon.outline = true; // 显示边框
+      entity.polygon.outlineColor = Cesium.Color.YELLOW; // 黑色边框
+    });
+  });
+};
+onMounted(() => {
+  nextTick(() => {
+    viewer = window.$viewer;
+    init();
+  });
+});
+</script>

--
Gitblit v1.9.3