235 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
<!DOCTYPE html>
 | 
						||
<html lang="en">
 | 
						||
  <head>
 | 
						||
    <!-- Use correct character set. -->
 | 
						||
    <meta charset="utf-8" />
 | 
						||
    <!-- Tell IE to use the latest, best version. -->
 | 
						||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
						||
    <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
 | 
						||
    <meta
 | 
						||
      name="viewport"
 | 
						||
      content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
 | 
						||
    />
 | 
						||
    <title>poiIconLabel</title>
 | 
						||
    <script src="./Build/Cesium/Cesium.js"></script>
 | 
						||
    <style>
 | 
						||
      @import url(./Build/Cesium/Widgets/widgets.css);
 | 
						||
      html,
 | 
						||
      body,
 | 
						||
      #cesiumContainer {
 | 
						||
        width: 100%;
 | 
						||
        height: 100%;
 | 
						||
        margin: 0;
 | 
						||
        padding: 0;
 | 
						||
        overflow: hidden;
 | 
						||
      }
 | 
						||
    </style>
 | 
						||
  </head>
 | 
						||
  <body>
 | 
						||
    <div id="cesiumContainer"></div>
 | 
						||
    <script>
 | 
						||
      Cesium.Ion.defaultAccessToken =
 | 
						||
        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
 | 
						||
 | 
						||
      var viewer = new Cesium.Viewer("cesiumContainer", {
 | 
						||
        geocoder: false, //位置查找
 | 
						||
        homeButton: false, //视图返回初始位置
 | 
						||
        sceneModePicker: false, //视角选择器
 | 
						||
        baseLayerPicker: false, //底图选择器
 | 
						||
        navigationHelpButton: false, //导航帮助按钮
 | 
						||
        animation: false, //动画控制器
 | 
						||
        // creditContainer:"credit",//版权显示
 | 
						||
        timeline: false, //时间线
 | 
						||
        fullscreenButton: false, //全屏控件
 | 
						||
        vrButton: false,
 | 
						||
        terrainProvider: Cesium.createWorldTerrain({
 | 
						||
          requestVertexNormal: true, //添加地形光照
 | 
						||
          requestWaterMask: true, //添加水面波浪效果
 | 
						||
        }),
 | 
						||
      });
 | 
						||
 | 
						||
      //========================================================================================
 | 
						||
      // viewer.imageryLayers.removeAll();
 | 
						||
      // 添加 Mapbox tile provider
 | 
						||
      // const mapboxAccess =
 | 
						||
      //   "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
 | 
						||
 | 
						||
      // 样式id查看:https://docs.mapbox.com/api/maps/styles/
 | 
						||
      // URL格式的 mapbox://styles/:owner/:style, 其中 :owner 是您的 Mapbox 账户名 :style 是样式 ID 。
 | 
						||
      // 可选值:streets-v10、outdoors-v10 、light-v9、dark-v9、satellite-v9、satellite-streets-v10
 | 
						||
      // const mapboxStyleImagery = new Cesium.MapboxStyleImageryProvider({
 | 
						||
      //   styleId: "streets-v10",
 | 
						||
      //   accessToken: mapboxAccess,
 | 
						||
      //   // proxy: new Cesium.DefaultProxy("http://127.0.0.1:8080/proxy/"),
 | 
						||
      // });
 | 
						||
      // viewer.imageryLayers.addImageryProvider(mapboxStyleImagery);
 | 
						||
 | 
						||
      // var imageryLayers = viewer.scene.imageryLayers;
 | 
						||
      //后添加的图层在顶部,addImageryProvider 方法
 | 
						||
      // var blackMarble = imageryLayers.addImageryProvider(
 | 
						||
      //   new Cesium.IonImageryProvider({ assetId: 3812 })
 | 
						||
      // );
 | 
						||
 | 
						||
      //========================================================================================
 | 
						||
      //添加OSM的建筑
 | 
						||
      const tileset = viewer.scene.primitives.add(
 | 
						||
        new Cesium.Cesium3DTileset({
 | 
						||
          url: Cesium.IonResource.fromAssetId(96188),
 | 
						||
        })
 | 
						||
      );
 | 
						||
      // Add OSM Building tileset
 | 
						||
      let osmBuildingsTileset = Cesium.createOsmBuildings();
 | 
						||
 | 
						||
      //设置条件渲染
 | 
						||
      osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
 | 
						||
        defines: {
 | 
						||
          mh: "${feature['cesium#estimatedHeight']}",
 | 
						||
        },
 | 
						||
        color: {
 | 
						||
          conditions: [
 | 
						||
            // ["(${mh} >= 100.0)", "color('blue')"],
 | 
						||
            // ["(${mh} >= 1.0)", "color('red')"],
 | 
						||
            ["${mh} >= 300", "rgba(45, 0, 75, 0.5)"],
 | 
						||
            ["${mh} >= 200", "rgb(102, 71, 151)"],
 | 
						||
            ["${mh} >= 100", "rgb(170, 162, 204)"],
 | 
						||
            ["${mh} >= 50", "rgb(224, 226, 238)"],
 | 
						||
            ["${mh} >= 25", "rgb(252, 230, 200)"],
 | 
						||
            ["${mh} >= 10", "rgb(248, 176, 87)"],
 | 
						||
            ["${mh} >= 5", "rgb(198, 106, 11)"],
 | 
						||
            ["true", "rgb(127, 59, 8)"],
 | 
						||
            // ["${name} === '周大福金融中心(广州东塔)'","color('red')"],
 | 
						||
            // ["${name} === '周大福金融中心(广州东塔)'", "color('red')"],
 | 
						||
          ],
 | 
						||
        },
 | 
						||
        // "show" : "${Height} > 50.0"
 | 
						||
      });
 | 
						||
      viewer.scene.primitives.add(osmBuildingsTileset);
 | 
						||
      // osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
 | 
						||
      // 	defines: {
 | 
						||
      // 		material: "${feature['building:material']}",
 | 
						||
      // 	},
 | 
						||
      // 	color: {
 | 
						||
      // 	conditions: [
 | 
						||
      // 		["${material} === null", "color('white')"],
 | 
						||
      // 		["${material} === 'glass'", "color('skyblue', 0.5)"],
 | 
						||
      // 		["${material} === 'concrete'", "color('grey')"],
 | 
						||
      // 		["${material} === 'brick'", "color('indianred')"],
 | 
						||
      // 		["${material} === 'stone'", "color('lightslategrey')"],
 | 
						||
      // 		["${material} === 'metal'", "color('lightgrey')"],
 | 
						||
      // 		["${material} === 'steel'", "color('lightsteelblue')"],
 | 
						||
      // 		["true", "color('white')"], // This is the else case
 | 
						||
      // 	],
 | 
						||
      // 	},
 | 
						||
      // });
 | 
						||
      // const gzTile = "http://localhost:9000/model/985e07c0af2611ecb9f6593f47f8b446/tileset.json";
 | 
						||
      //  const gzTileset = viewer.scene.primitives.add(
 | 
						||
      //     new Cesium.Cesium3DTileset({
 | 
						||
      //       url: gzTile,
 | 
						||
      //     })
 | 
						||
      //   );
 | 
						||
      //   gzTileset.style = new Cesium.Cesium3DTileStyle({
 | 
						||
      //     color:{
 | 
						||
      //       conditions:[
 | 
						||
      //         ["${floor} === '4'","color(red)"]
 | 
						||
      //       ]
 | 
						||
      //     }
 | 
						||
      //   })
 | 
						||
 | 
						||
      // 创建一个用于存储标注的数据源
 | 
						||
      const dataSource = new Cesium.CustomDataSource("poiIconLabel");
 | 
						||
      viewer.dataSources.add(dataSource);
 | 
						||
 | 
						||
      /**
 | 
						||
       * 用于添加poi的icon和label的函数
 | 
						||
       * @param {*} lon :经度
 | 
						||
       * @param {*} lat :纬度
 | 
						||
       * @param {*} name :标签内容
 | 
						||
       * @param {*} color :底部圆和横线的颜色
 | 
						||
       * @param {*} url :icon地址
 | 
						||
       */
 | 
						||
      function poiIconLabelAdd(lon, lat, height, name, color, url) {
 | 
						||
        // 获取标注数据源
 | 
						||
        const labelDataSource = viewer.dataSources.getByName("poiIconLabel")[0];
 | 
						||
        labelDataSource.entities.removeAll();
 | 
						||
 | 
						||
        //添加图标和标注
 | 
						||
        labelDataSource.entities.add({
 | 
						||
          name: name,
 | 
						||
          position: Cesium.Cartesian3.fromDegrees(lon, lat, height + 300),
 | 
						||
          // 图标
 | 
						||
          billboard: {
 | 
						||
            image: url,
 | 
						||
            width: 50,
 | 
						||
            height: 50,
 | 
						||
          },
 | 
						||
          label: {
 | 
						||
            //文字标签
 | 
						||
            text: name,
 | 
						||
            font: "20px sans-serif",
 | 
						||
            style: Cesium.LabelStyle.FILL,
 | 
						||
            // 对齐方式(水平和竖直)
 | 
						||
            horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
 | 
						||
            verticalOrigin: Cesium.VerticalOrigin.CENTER,
 | 
						||
            pixelOffset: new Cesium.Cartesian2(20, -2),
 | 
						||
            showBackground: true,
 | 
						||
            backgroundColor: new Cesium.Color.fromBytes(0, 70, 24),
 | 
						||
          },
 | 
						||
        });
 | 
						||
 | 
						||
        // 先画线后画点,防止线压盖点
 | 
						||
        let linePositions = [];
 | 
						||
        linePositions.push(new Cesium.Cartesian3.fromDegrees(lon, lat, height));
 | 
						||
        linePositions.push(
 | 
						||
          new Cesium.Cartesian3.fromDegrees(lon, lat, height + 300)
 | 
						||
        );
 | 
						||
        labelDataSource.entities.add({
 | 
						||
          polyline: {
 | 
						||
            positions: linePositions,
 | 
						||
            width: 1.5,
 | 
						||
            material: color,
 | 
						||
          },
 | 
						||
        });
 | 
						||
 | 
						||
        // 画点
 | 
						||
        labelDataSource.entities.add({
 | 
						||
          // 给初始点位设置一定的离地高度,否者会被压盖
 | 
						||
          position: Cesium.Cartesian3.fromDegrees(lon, lat, height),
 | 
						||
          point: {
 | 
						||
            color: color,
 | 
						||
            pixelSize: 15,
 | 
						||
          },
 | 
						||
        });
 | 
						||
      }
 | 
						||
 | 
						||
      //添加点击事件
 | 
						||
      const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
 | 
						||
      handler.setInputAction(function (movement) {
 | 
						||
        viewer.selectedEntity = undefined;
 | 
						||
        const pickedBuilding = viewer.scene.pick(movement.position);
 | 
						||
        if (pickedBuilding) {
 | 
						||
          const lat = pickedBuilding.getProperty("cesium#latitude");
 | 
						||
          const lon = pickedBuilding.getProperty("cesium#longitude");
 | 
						||
          const height = pickedBuilding.getProperty("cesium#estimatedHeight");
 | 
						||
          const name = pickedBuilding.getProperty("name");
 | 
						||
          const color = Cesium.Color.SNOW;
 | 
						||
          const url = "./data/local.png";
 | 
						||
          poiIconLabelAdd(lon, lat, height, name, color, url);
 | 
						||
        }
 | 
						||
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
 | 
						||
 | 
						||
      viewer.camera.flyTo({
 | 
						||
        destination: new Cesium.Cartesian3(
 | 
						||
          -2325771.0288233184,
 | 
						||
          5392181.511762224,
 | 
						||
          2484480.395134067
 | 
						||
        ),
 | 
						||
        orientation: {
 | 
						||
          heading: 6.0399326,
 | 
						||
          pitch: -0.30503,
 | 
						||
          roll: 6.2825747,
 | 
						||
        },
 | 
						||
      });
 | 
						||
    </script>
 | 
						||
  </body>
 | 
						||
</html>
 |