Cesium.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <div id="cesiumContainer" style="height: 100%;width: 100%;"></div>
  3. </template>
  4. <script setup>
  5. import { ref, onMounted, onUnmounted } from 'vue'
  6. import * as Cesium from 'cesium';
  7. import "cesium/Build/CesiumUnminified/Widgets/widgets.css";
  8. import JYLData from '@/assets/Data/THJYL.json'
  9. const TDTTK = "d9e7aa2ad204aba6aeedea6f5ab48ed9";
  10. onMounted(() => {
  11. const viewer = new Cesium.Viewer('cesiumContainer', {
  12. timeline: false,
  13. });
  14. // 定义距离显示条件和缩放属性
  15. const distanceDisplayCondition = new Cesium.DistanceDisplayCondition(
  16. 0, // 最小显示距离(0表示始终显示)
  17. 10000000 // 最大显示距离(1000公里外不显示)
  18. );
  19. const pointNearFarScalar = new Cesium.NearFarScalar(
  20. 10000, 1.0, // 近点距离和缩放比例
  21. 1000000, 0.3 // 远点距离和缩放比例
  22. );
  23. const labelNearFarScalar = new Cesium.NearFarScalar(
  24. 10000, 1.0, // 近点距离和缩放比例
  25. 400000, 0 // 远点距离和缩放比例(50公里外完全隐藏)
  26. );
  27. // const entitiesNearFarScalar = new Cesium.NearFarScalar(
  28. // 10000, 1.0, // 近点距离和缩放比例
  29. // 1000000, 0.1 // 远点距离和缩放比例(50公里外完全隐藏)
  30. // );
  31. // 遍历数据并添加点和标签
  32. JYLData.forEach((item) => {
  33. const position = Cesium.Cartesian3.fromDegrees(
  34. parseFloat(item.LGTD), // 经度
  35. parseFloat(item.LTTD) // 纬度
  36. );
  37. // 创建组合了图标和标签的实体
  38. viewer.entities.add({
  39. position: position,
  40. // scaleByDistance:entitiesNearFarScalar,
  41. billboard: {
  42. image: '/src/assets/icon/blue.png', // 图标路径
  43. scale: 0.4,
  44. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  45. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  46. distanceDisplayCondition: distanceDisplayCondition,
  47. scaleByDistance: pointNearFarScalar
  48. },
  49. label: {
  50. text: item.STNM || '未知点',
  51. font: '16px 微软雅黑',
  52. fillColor: Cesium.Color.WHITE,
  53. backgroundColor: new Cesium.Color(0.1, 0.1, 0.1, 0.7),
  54. backgroundPadding: new Cesium.Cartesian2(8, 4),
  55. showBackground: true,
  56. cornerRadius: 4,
  57. outlineColor: Cesium.Color.BLACK,
  58. outlineWidth: 1,
  59. style: Cesium.LabelStyle.FILL,
  60. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  61. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  62. pixelOffset: new Cesium.Cartesian2(0, -32),
  63. scale: 1.0,
  64. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  65. distanceDisplayCondition: distanceDisplayCondition,
  66. scaleByDistance: labelNearFarScalar
  67. },
  68. });
  69. });
  70. // 天地图影像
  71. const tdtLayer = new Cesium.WebMapTileServiceImageryProvider({
  72. url: `http://t0.tianditu.com/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&tk=${TDTTK}`,
  73. layer: "tdt",
  74. style: "default",
  75. format: "image/jpeg",
  76. tileMatrixSetID: "w",
  77. maximumLevel: 18,
  78. show: false,
  79. });
  80. viewer.imageryLayers.addImageryProvider(tdtLayer);
  81. // 天地图注记
  82. const tdtAnnotionLayer = new Cesium.WebMapTileServiceImageryProvider({
  83. url: `http://t0.tianditu.com/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&tk=${TDTTK}`,
  84. layer: "tdtAnno",
  85. style: "default",
  86. format: "image/jpeg",
  87. tileMatrixSetID: "w",
  88. maximumLevel: 18,
  89. show: false,
  90. });
  91. // 移除默认水印
  92. viewer.cesiumWidget.creditContainer.style.display = "none";
  93. // 设置初始镜头位置(太湖)
  94. viewer.camera.setView({
  95. destination: Cesium.Cartesian3.fromDegrees(120.169103, 31.226174, 500000),
  96. orientation: {
  97. heading: Cesium.Math.toRadians(0),
  98. pitch: Cesium.Math.toRadians(-90),
  99. },
  100. });
  101. viewer.imageryLayers.addImageryProvider(tdtAnnotionLayer);
  102. // 清理函数
  103. onUnmounted(() => {
  104. if (viewer && !viewer.isDestroyed()) {
  105. viewer.destroy();
  106. }
  107. });
  108. })
  109. </script>