From cc6994a5858cd662f5904005bbbd9d34b712f76c Mon Sep 17 00:00:00 2001
From: ZhangXianQiang <1135831638@qq.com>
Date: 星期五, 19 四月 2024 11:56:25 +0800
Subject: [PATCH] feat:添加地图label

---
 src/views/screen/components/screen-map-three/experience/index.js       |    4 ++
 src/views/screen/components/screen-map-three/experience/cssRenderer.js |   31 +++++++++++++++
 src/views/screen/components/screen-map-three/experience/world/map.js   |   39 ++++++++++++++++++-
 src/assets/map/zigong2.json                                            |   30 ++++++++++++++
 4 files changed, 100 insertions(+), 4 deletions(-)

diff --git a/src/assets/map/zigong2.json b/src/assets/map/zigong2.json
index ee0d331..f27b2b3 100644
--- a/src/assets/map/zigong2.json
+++ b/src/assets/map/zigong2.json
@@ -20,6 +20,10 @@
           "pixels",
           "pixels"
         ],
+        "center": [
+          104.681471408,
+          29.41058885
+        ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
       },
@@ -568,7 +572,11 @@
         "styleUrl": "#msn_ylw-pushpin0",
         "fill-opacity": "0.5",
         "fill": "#000000",
-        "stroke-opacity": "1"
+        "stroke-opacity": "1",
+        "center": [
+          104.805193,
+          29.348033
+        ]
       },
       "geometry": {
         "coordinates": [
@@ -936,6 +944,10 @@
         "icon-offset-units": [
           "pixels",
           "pixels"
+        ],
+        "center": [
+          104.968050,
+          29.285946
         ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
@@ -2027,6 +2039,10 @@
           "pixels",
           "pixels"
         ],
+        "center": [
+          104.81804,
+          29.440594
+        ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
       },
@@ -2913,6 +2929,10 @@
           "pixels",
           "pixels"
         ],
+        "center": [
+          104.599106,
+          29.341427
+        ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
       },
@@ -3734,6 +3754,10 @@
         "icon-offset-units": [
           "pixels",
           "pixels"
+        ],
+        "center": [
+          104.3334,
+          29.2938
         ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
@@ -5281,6 +5305,10 @@
           "pixels",
           "pixels"
         ],
+        "center": [
+          105.104762,
+          29.518852
+        ],
         "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",
         "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:榛戜綋,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)"
       },
diff --git a/src/views/screen/components/screen-map-three/experience/cssRenderer.js b/src/views/screen/components/screen-map-three/experience/cssRenderer.js
new file mode 100644
index 0000000..dcae37c
--- /dev/null
+++ b/src/views/screen/components/screen-map-three/experience/cssRenderer.js
@@ -0,0 +1,31 @@
+import * as THREE from 'three';
+import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer';
+export default class CSSRenderer {
+  constructor(experience) {
+    this.experience = experience;
+    this.container = experience.container;
+    this.canvas = experience.canvas;
+    this.sizes = experience.sizes;
+    this.scene = experience.scene;
+    this.camera = experience.camera;
+
+    this.setInstance();
+  }
+  setInstance() {
+    this.instance = new CSS2DRenderer();
+    this.instance.setSize(this.sizes.width, this.sizes.height);
+    this.instance.domElement.style.position = 'absolute';
+    this.instance.domElement.style.top = '0px';
+    this.instance.domElement.style.left = '0px';
+    this.instance.domElement.style.pointerEvents = 'none';
+    this.container.appendChild(this.instance.domElement);
+
+  }
+  resize() {
+    this.instance.setSize(this.sizes.width, this.sizes.height);
+    this.instance.setPixelRatio(this.sizes.pixelRatio);
+  }
+  update() {
+    this.instance.render(this.scene, this.camera.instance);
+  }
+}
\ No newline at end of file
diff --git a/src/views/screen/components/screen-map-three/experience/index.js b/src/views/screen/components/screen-map-three/experience/index.js
index 8dd4eb2..17affbd 100644
--- a/src/views/screen/components/screen-map-three/experience/index.js
+++ b/src/views/screen/components/screen-map-three/experience/index.js
@@ -4,6 +4,7 @@
 import World from "./world/world";
 import Camera from "./camera";
 import Renderer from "./renderer";
+import CSSRenderer from './cssRenderer';
 
 // 宸ュ叿绫�
 import Sizes from "./utils/sizes";
@@ -12,11 +13,13 @@
 export default class Experience {
   constructor(canvas) {
     this.canvas = canvas;
+    this.container = canvas.parentElement;
     this.sizes = new Sizes(this.canvas);
     this.time = new Time();
     this.scene = new Scene();
     this.camera = new Camera(this);
     this.renderer = new Renderer(this);
+    this.cssRenderer = new CSSRenderer(this);
     this.world = new World(this);
 
     // const size = 100;
@@ -40,6 +43,7 @@
     this.camera.update();
     this.world.update();
     this.renderer.update();
+    this.cssRenderer.update();
     this.stats.update();
   }
 }
\ No newline at end of file
diff --git a/src/views/screen/components/screen-map-three/experience/world/map.js b/src/views/screen/components/screen-map-three/experience/world/map.js
index 2d2a299..fd648d6 100644
--- a/src/views/screen/components/screen-map-three/experience/world/map.js
+++ b/src/views/screen/components/screen-map-three/experience/world/map.js
@@ -1,6 +1,7 @@
 import * as THREE from 'three';
 import * as d3 from 'd3';
 import mapData from '@/assets/map/zigong2.json';
+import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer';
 
 import textureMapImage from '@/assets/map/texture/gz-map.jpg';
 import textureMapFxImage from '@/assets/map/texture/gz-map-fx.jpg';
@@ -17,9 +18,11 @@
 export default class Map {
     constructor(experience) {
         this.experience = experience;
-        this.scene = this.experience.scene;
-        this.camera = this.experience.camera;
+        this.scene = experience.scene;
+        this.camera = experience.camera;
+
         this.provinceMeshList = [];
+        this.labelList = [];
         this.textureLoader = new THREE.TextureLoader();
         this.setTexture();
         this.operationData(mapData);
@@ -66,6 +69,7 @@
             const province = new THREE.Object3D();
             // 鍦板潃
             province.properties = feature.properties.name;
+            province.isHover = false;
             // 澶氫釜鎯呭喌
             // console.log(feature.geometry.type);
             if (feature.geometry.type === "MultiPolygon") {
@@ -90,7 +94,9 @@
                     this.provinceMeshList.push(mesh);
                 });
             }
-            province.isHover = false;
+            const label = this.drawLabelText(feature);
+            this.labelList.push({ name: feature.properties.name, label });
+            province.add(label);
             this.map.add(province);
         });
         this.map.position.set(1, 1, -1.5);
@@ -149,6 +155,22 @@
         ]);
     }
 
+    drawLabelText(province) {
+        const [x, y] = projection(province.properties.center);
+        const div = document.createElement('div');
+        div.innerHTML = province.properties.name;
+        div.style.padding = '4px 10px';
+        div.style.color = '#fff';
+        div.style.fontSize = '16px';
+        div.style.position = 'absolute';
+        div.style.backgroundColor = 'rgba(25,25,25,0.5)';
+        div.style.borderRadius = '5px';
+        const label = new CSS2DObject(div);
+        div.style.pointerEvents = 'none';
+        label.position.set(x, y, MAP_DEPTH + 0.05);
+        return label;
+    }
+
 
     setMouseEvent() {
         this.mouseEvent = this.handleEvent.bind(this);
@@ -177,6 +199,7 @@
             if (intersects.length) {
                 let temp = intersects[0].object;
                 this.animation(temp.parent);
+                this.showLabel(temp.parent);
             } else {
                 this.animation();
             }
@@ -231,6 +254,16 @@
         })
     }
 
+    showLabel(province) {
+        this.labelList.forEach((item) => {
+            // if (item.name === province.properties) {
+            //     item.label.element.style.visibility = 'visible';
+            // } else {
+            //     item.label.element.style.visibility = 'hidden';
+            // }
+        })
+    }
+
     enterAnimation() {
         gsap.to(this.map.scale, {
             z: 10,

--
Gitblit v1.8.0