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 | 84 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 81 insertions(+), 3 deletions(-)
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index efd6de6..c7e3e76 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -2,7 +2,6 @@
<HomeLeft></HomeLeft>
<!-- <div>中间搜索</div> -->
<HomeRight></HomeRight>
-
<SearchBox />
</template>
@@ -11,11 +10,90 @@
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';
+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();
+ });
+};
+
+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;
+ }
+ }
+};
+
+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(() => {
- getAggregation();
+ viewer = window.$viewer;
+ init();
});
});
</script>
-<style scoped lang="scss"></style>
--
Gitblit v1.9.3