CesiumMap.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <el-dialog v-if="isShow"
  3. :model-value="isShow"
  4. title="地理信息"
  5. :width="1200"
  6. :close-on-click-modal="false"
  7. :before-close="handleClose"
  8. >
  9. <div id="mapBox" >
  10. <!--<div id="mapOperation">-->
  11. <!-- <el-button>点标记</el-button>-->
  12. <!-- <el-button>线标记</el-button>-->
  13. <!-- <el-button>面标记</el-button>-->
  14. <!--</div>-->
  15. <div id="mapContainer">
  16. </div>
  17. </div>
  18. <template #footer>
  19. <el-button type="primary">确认</el-button>
  20. </template>
  21. </el-dialog>
  22. </template>
  23. <script>
  24. import 'cesium/Widgets/widgets.css'
  25. import CesiumMarker from "@/static/js/CesiumMarker";
  26. export default {
  27. data() {
  28. return {
  29. viewer: '',
  30. drawData: {
  31. points: [],
  32. lines: [],
  33. polygons: []
  34. },
  35. cesiumConfig: {
  36. animation: false, //动画控制不显示
  37. timeline: false, //时间线不显示
  38. fullscreenButton: false, //全屏按钮不显示
  39. imageryProvider: new Cesium.SingleTileImageryProvider({
  40. url: (function createColorCanvas(color) {
  41. let width = 1,
  42. height = 1;
  43. let canvas = document.createElement("canvas");
  44. canvas.width = width;
  45. canvas.height = height;
  46. let ctx = canvas.getContext("2d");
  47. ctx.fillStyle = color;
  48. ctx.fillRect(0, 0, width, height);
  49. return canvas.toDataURL();
  50. })("#ffffff00"),
  51. rectangle: Cesium.Rectangle.fromDegrees(-180.0, -90.0, 180.0, 90.0),
  52. }),
  53. infoBox: false,
  54. baseLayerPicker: false, //地图切换不显示
  55. geocoder: false,
  56. homeButton: false,
  57. selectionIndicator: false, // 去除绿色选择框
  58. sceneModePicker: false,
  59. navigationHelpButton: false,
  60. navigationInstructionsInitiallyVisible:false,
  61. scene3DOnly: true, // 仅以3D渲染以节省GPU内存
  62. useBrowserRecommendedResolution: true, // 以浏览器建议的分辨率渲染
  63. },
  64. }
  65. },
  66. props: {
  67. isShow: Boolean,
  68. item: Object,
  69. isGeoJson: Boolean,
  70. close: Function
  71. },
  72. watch: {
  73. "isShow": function (val) {
  74. this.initMap();
  75. }
  76. },
  77. mounted() {
  78. this.$util.loading.handleLoading(true)
  79. this.initMap();
  80. },
  81. methods: {
  82. initMap() {
  83. let app = this;
  84. this.$nextTick(()=>{
  85. app.viewer = new Cesium.Viewer('mapContainer', app.cesiumConfig);
  86. app.viewer.scene.preRender.addEventListener(function () {
  87. app.loading = true;
  88. })
  89. app.viewer.scene.postRender.addEventListener(function () {
  90. app.loading = false;
  91. })
  92. // 加载底图
  93. app.viewer.imageryLayers.addImageryProvider(
  94. new Cesium.WebMapTileServiceImageryProvider({
  95. url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk='+systemConfig.tdt_tk,
  96. layer: "img",
  97. style: "default",
  98. // tileMatrixSetID: "w",
  99. format: "image/jpeg",
  100. subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
  101. tileMatrixSetID: "GoogleMapsCompatible",
  102. show: true,
  103. minimumLevel: 1,
  104. maximumLevel: 18,
  105. })
  106. );
  107. // 加载注记
  108. app.viewer.imageryLayers.addImageryProvider(
  109. new Cesium.WebMapTileServiceImageryProvider({
  110. url: 'http://t{s}.tianditu.gov.cn/cia_w/wmts?tk='+systemConfig.tdt_tk,
  111. layer: "cia",
  112. style: "default",
  113. tileMatrixSetID: "w",
  114. format: "tiles",
  115. subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
  116. maximumLevel: 20,
  117. })
  118. );
  119. // 加载GeoJson
  120. if (app.isGeoJson) {
  121. let geojson = {"type": "Feature", "geometry": JSON.parse(app.item.geometryStr), "properties": {}}
  122. let res = Cesium.GeoJsonDataSource.load(geojson,{
  123. stroke: Cesium.Color.fromCssColorString('#ff0000'),
  124. fill: Cesium.Color.RED.withAlpha(0.3),
  125. strokeWidth: 5,
  126. clampToGround:true,
  127. })
  128. app.viewer.dataSources.add(res);
  129. res.then(()=>{
  130. app.$util.loading.handleLoading(false)
  131. app.viewer.zoomTo(res, {heading: 2.718565, pitch: -0.415366, roll: 0.0,});
  132. }).catch(()=>{
  133. app.$message({message:'加载失败', type: 'error'})
  134. app.$util.loading.handleLoading(false)
  135. })
  136. } else {
  137. // 加载模型
  138. if (app.item.modelUrl && app.item.modelUrl!=='') {
  139. app.add3DTiles(app.viewer, app.item.modelUrl)
  140. } else {
  141. app.$util.loading.handleLoading(false)
  142. }
  143. }
  144. });
  145. },
  146. // 添加模型
  147. add3DTiles(viewer, url){
  148. let app = this;
  149. let tileset = new Cesium.Cesium3DTileset({
  150. url: url,
  151. skipLevelOfDetail: true, //开启跳级加载
  152. maximumScreenSpaceError: 16,
  153. maximumNumberOfLoadedTiles: 2000,
  154. maximumMemoryUsage: 512,//tileset可以使用的最大内存
  155. show: true,
  156. immediatelyLoadDesiredLevelOfDetail: true,
  157. });
  158. tileset.allTilesLoaded.addEventListener(function() {
  159. app.$util.loading.handleLoading(false)
  160. });
  161. tileset.tileFailed.addEventListener(function (err) {
  162. app.$util.loading.handleLoading(false);
  163. app.$message({message: '模型加载失败', type: 'error'});
  164. app.handleClose()
  165. })
  166. viewer.scene.primitives.add(tileset);
  167. tileset.show=true;
  168. tileset.readyPromise.then(function () {
  169. viewer.zoomTo(tileset, {
  170. heading: 2.718565,
  171. pitch: -0.415366,
  172. roll: 0.0,
  173. });
  174. }).catch(err=>{
  175. app.$util.loading.handleLoading(false);
  176. app.$message({dangerouslyUseHTMLString: true, message: '模型加载失败,'+err.statusCode+':'+err.response, type: 'error'});
  177. app.handleClose()
  178. });
  179. return tileset;
  180. },
  181. handleClose() {
  182. this.close(false)
  183. }
  184. }
  185. }
  186. </script>
  187. <style scoped>
  188. #mapBox {
  189. width: 100%;
  190. height: 100%;
  191. }
  192. #mapContainer {
  193. width: 100%;
  194. height: 100%;
  195. }
  196. #mapOperation {
  197. margin-bottom: 10px;
  198. }
  199. </style>
  200. <style>
  201. /*隐藏 cesium logo*/
  202. .cesium-widget-credits{
  203. display: none !important;
  204. }
  205. .el-dialog__body {
  206. padding-top: 10px;
  207. }
  208. </style>