CrMap.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. <template>
  2. <div id="cesiumContainer" class="jt-map"></div>
  3. <div class="jt-map-tools">
  4. <button @click="openFloatLayer()">打开浮动图层</button>
  5. <button @click="closeFloatLayer()">关闭浮动图层</button>
  6. </div>
  7. </template>
  8. <script setup>
  9. import { param } from 'jquery';
  10. import { defineExpose, onMounted, getCurrentInstance } from 'vue';
  11. /* 注册方法 */
  12. const emit = defineEmits(['onEditProperty']);
  13. import { CrMap } from './CrMap.js';
  14. import CommonTools from './CommonTools.js';
  15. import { SketchViewModel } from './SketchViewModel.js';
  16. import { DrawTools } from './DrawTools.js';
  17. import { point } from '@turf/turf';
  18. const { proxy } = getCurrentInstance();
  19. /* 组件对外提供的方法 */
  20. defineExpose({
  21. /* 长度测量方法 */
  22. onMeasureLength: function() {
  23. proxy.commonTools.measureLength();
  24. },
  25. /* 面积测量方法 */
  26. onMeasureArea: function() {
  27. proxy.commonTools.measureArea();
  28. },
  29. /* 测量高度方法 */
  30. onMeasureHeight: function() {
  31. proxy.commonTools.measureHeight();
  32. },
  33. /* 空间测距 */
  34. onMeasureSpatialLength: function() {
  35. proxy.commonTools.measureSpatialLength();
  36. },
  37. /* 三角测量 */
  38. onMeasureTriangle: function() {
  39. proxy.commonTools.measureTriangle();
  40. },
  41. /* 清理资源 */
  42. onToolsClear: function() {
  43. proxy.commonTools.clear();
  44. },
  45. /* 区域查询 */
  46. onQueryByPolygon: function() {
  47. proxy.commonTools.queryByPolygon(function(res) {
  48. console.log('坐标串', res);
  49. });
  50. },
  51. /* 点查询 */
  52. onQueryByPoint: function() {
  53. proxy.commonTools.queryByPoint(function(res) {
  54. console.log('坐标串', res);
  55. });
  56. },
  57. /* 多点查询 */
  58. onQueryByMultiplePoint: function() {
  59. proxy.commonTools.queryByMultiplePoint(function(res) {
  60. console.log('坐标数组', res);
  61. });
  62. },
  63. /**
  64. * 线查询
  65. */
  66. onQueryByLine: function() {
  67. proxy.commonTools.queryByLine(function(res) {
  68. console.log('坐标串', res);
  69. });
  70. },
  71. /**
  72. * 圆查询
  73. */
  74. onQueryByCircle: function() {
  75. proxy.commonTools.queryByCircle(function(center, radius) {
  76. console.log('中心点及半径', center, radius);
  77. });
  78. },
  79. /**
  80. * 矩形查询
  81. */
  82. onQueryByRectangle: function() {
  83. proxy.commonTools.queryByRectangle(function(res) {
  84. console.log('坐标串', res);
  85. });
  86. },
  87. /* 绘制体 */
  88. onDrawPolygonBody: function() {
  89. proxy.commonTools.drawPolygonBody(function() {});
  90. },
  91. /* 拾取物体 */
  92. onPickPolygonBody: function(callComplete) {
  93. proxy.commonTools.pickPolygonBody(function(res) {
  94. if (res != undefined) callComplete(res);
  95. });
  96. },
  97. /**
  98. * 设置拾取的体对象样式及高度
  99. * @@param {JSON} options 配置项
  100. * @param {Array<Number>} options.color 颜色[0~~255,0~255,0~255,0~1]
  101. * @param {Number} options.height 高度
  102. * @param {Function} options.onComplete(message) 完成回调,如果message为undefined则代表成功,否则为失败消息
  103. */
  104. onSetPolygonBody: function(options) {
  105. proxy.commonTools.setPolygonBody({
  106. color: options.color,
  107. height: options.height,
  108. onComplete: options.onComplete
  109. });
  110. },
  111. /**
  112. * 移除拾取的体对象
  113. * @param {Function} onComplete(message) 完成回调,message为undifined为成功,否则为失败消息
  114. */
  115. onRemovePolygonBody: function(onComplete) {
  116. proxy.commonTools.removePolygonBody(onComplete);
  117. },
  118. /* 测试工具 */
  119. onTestDemo: function() {
  120. let cameraViewer = {
  121. lng: 118.22480916041573,
  122. lat: 35.140818266338854,
  123. alt: 164.9208475038474,
  124. pitch: -40.80823993511622,
  125. heading: 1.717840652315993,
  126. roll: 359.9998582097622
  127. };
  128. proxy.CMapApi.cameraFlyToo(cameraViewer);
  129. proxy.commonTools.testDemo();
  130. },
  131. /**
  132. * 获取相机视角
  133. */
  134. onGetCameraViewer: function() {
  135. let param = proxy.CMapApi.getCameraViewParams();
  136. console.log('相机视角', JSON.stringify(param));
  137. },
  138. /**
  139. * 绘制要素
  140. * @param {Array<Number>} points 经纬度点集合
  141. */
  142. onDrawFeacture: function(points) {
  143. proxy.commonTools.drawPolygonFeacture(points);
  144. },
  145. /**
  146. * 清除绘制内容
  147. */
  148. onClearDraw: function() {
  149. proxy.drawTools.Clear();
  150. },
  151. /**
  152. * 鼠标点击绘制可编辑贴地线
  153. */
  154. onMouseDrawEditLine: function() {
  155. proxy.drawTools.draw(DrawTools.DrawType.Polyline, {
  156. isEdit: true
  157. });
  158. },
  159. /**
  160. * 鼠标点击绘制可编辑贴地箭头线
  161. */
  162. onMouseDrawEditArrowLine: function() {
  163. proxy.drawTools.draw(DrawTools.DrawType.ArrowPolyline, {
  164. isEdit: true
  165. });
  166. },
  167. /**
  168. * 鼠标点击绘制可编辑贴地发光线
  169. */
  170. onMouseDrawEditGrawLine: function() {
  171. proxy.drawTools.draw(DrawTools.DrawType.GrowPolyline, {
  172. isEdit: true
  173. });
  174. },
  175. /**
  176. * 鼠标点击绘制可编辑贴地动态
  177. */
  178. onMouseDrawEditDynamicLine: function() {
  179. proxy.drawTools.draw(DrawTools.DrawType.DynamicPolyline, {
  180. isEdit: true
  181. });
  182. },
  183. /**
  184. * 鼠标点击绘制可编辑贴地描边线
  185. */
  186. onMouseDrawEditOutlineLine: function() {
  187. proxy.drawTools.draw(DrawTools.DrawType.OultliePolyline, {
  188. isEdit: true
  189. });
  190. },
  191. /**
  192. * 鼠标点击绘制可编辑贴地面
  193. */
  194. onMouseDrawEditPolygon: function() {
  195. proxy.drawTools.draw(DrawTools.DrawType.Polygon, {
  196. isEdit: true
  197. });
  198. },
  199. /**
  200. * 鼠标点击绘制可编辑矩形
  201. */
  202. onMouseDrawEditRectangle: function() {
  203. proxy.drawTools.draw(DrawTools.DrawType.Rectangle, {
  204. isEdit: true
  205. });
  206. },
  207. /**
  208. * 鼠标点击绘制可编辑圆
  209. */
  210. onMouseDrawEditCircle: function() {
  211. proxy.drawTools.draw(DrawTools.DrawType.Circle, {
  212. isEdit: true
  213. });
  214. },
  215. /**
  216. * 鼠标点击绘制可编辑动态墙
  217. */
  218. onMouseDrawDynamicEditWall: function() {
  219. proxy.drawTools.draw(DrawTools.DrawType.DynamicWall, {
  220. isEdit: true
  221. });
  222. },
  223. /**
  224. * 鼠标点击绘制可编辑颜色墙
  225. */
  226. onMouseDrawColorEditWall: function() {
  227. proxy.drawTools.draw(DrawTools.DrawType.NormalWall, {
  228. isEdit: true
  229. });
  230. },
  231. /**
  232. * 鼠标点击绘制可编辑文字墙
  233. */
  234. onMouseDrawEditText: function() {
  235. proxy.drawTools.draw(DrawTools.DrawType.TextWall, {
  236. isEdit: true
  237. });
  238. },
  239. /**
  240. * 绘制可编辑动态圆
  241. */
  242. onMouseDrawDynamicCircle: function() {
  243. proxy.drawTools.draw(DrawTools.DrawType.DynamicCircle, {
  244. isEdit: true
  245. });
  246. },
  247. /**
  248. * 绘制可编辑体
  249. */
  250. onMoouseDrawPolygonBody: function() {
  251. proxy.drawTools.draw(DrawTools.DrawType.House, {
  252. isEdit: true
  253. });
  254. },
  255. /**
  256. * 绘制视频墙
  257. */
  258. onMouseDrawEditVideoWall: function() {
  259. proxy.drawTools.draw(DrawTools.DrawType.VideoWall, {
  260. isEdit: true
  261. });
  262. },
  263. /**
  264. * 绘制空间线
  265. */
  266. onMouseDrawEditSpatialPolyline: function() {
  267. proxy.drawTools.draw(DrawTools.DrawType.SpatialLine, {
  268. isEdit: true
  269. });
  270. },
  271. /**
  272. * 绘制OD线
  273. */
  274. onMouseDrawEditOdline: function() {
  275. proxy.drawTools.draw(DrawTools.DrawType.OdLine, {
  276. isEdit: true
  277. });
  278. },
  279. /**
  280. * 更新墙属性
  281. * @param {JSON} params 参数配置项
  282. */
  283. onSubmitEditProperty: function(params) {
  284. proxy.drawTools.updateEditEntityProperty(params);
  285. },
  286. /**
  287. * 删除当前编辑的实体
  288. */
  289. onRemoveEditEntity: function() {
  290. proxy.drawTools.removeEditEntity();
  291. },
  292. /**
  293. * 旋转实体
  294. */
  295. onRotationEntity: function() {
  296. proxy.drawTools.rotationEntity({
  297. x: 90,
  298. y: 0,
  299. z: 0
  300. });
  301. }
  302. });
  303. const openFloatLayer = function() {
  304. /* 添加网格地图 */
  305. window['floatGHT'].show();
  306. };
  307. const closeFloatLayer = function() {
  308. console.log(window['floatGHT']);
  309. window['floatGHT'].hide();
  310. };
  311. /* 初始化 */
  312. onMounted(() => {
  313. let _self = proxy;
  314. proxy.CMapApi = new CrMap({
  315. selector: 'cesiumContainer',
  316. sourcePath: './resource/'
  317. });
  318. /* 创建工具集 */
  319. proxy.commonTools = new CommonTools(proxy.CMapApi.getViewer(), {
  320. isClear: false
  321. });
  322. /* 创建绘制类工具 */
  323. proxy.sketchViewModel = new SketchViewModel(proxy.CMapApi.getViewer(), {
  324. iconType: SketchViewModel.SketchIconType.Blue,
  325. isDrawPoint: true,
  326. isRetainDrawPoint: true
  327. });
  328. /* 创建绘制类工具 */
  329. proxy.drawTools = new DrawTools(proxy.CMapApi.getViewer(), {
  330. iconType: DrawTools.IconType.Blue,
  331. isDrawPoint: true,
  332. isRetainDrawPoint: true
  333. });
  334. /* 创建监听 */
  335. proxy.drawTools.onEditProperty = param => {
  336. // console.log('===调用编辑代理>>>', param);
  337. emit('onEditProperty', param);
  338. };
  339. /* 添加暗夜版图层 */
  340. proxy.CMapApi.addLayer({
  341. layId: 'mapbox',
  342. layName: '暗夜版底图',
  343. layType: CrMap.LayerType.mapboxLayer,
  344. isShow: true,
  345. config: {}
  346. });
  347. /* 添加模版影像地图 */
  348. // proxy.CMapApi.addLayer({
  349. // layId: 'tileGrid',
  350. // layName: '网格',
  351. // layType: CrMap.LayerType.tileGridLayer,
  352. // isShow: true,
  353. // config: {}
  354. // });
  355. /* 添加实景地图 */
  356. proxy.CMapApi.addLayer({
  357. layId: 'yt3d',
  358. layName: '烟台实景',
  359. layType: CrMap.LayerType.tilesetsLayer,
  360. isShow: true,
  361. config: {
  362. url: ['http://218.59.194.82:13080/crdata/sdly/crtiles/tileset.json', 'http://218.59.194.82:13080/crdata/sdyt/crtile/zxc/1tiles/tileset1.json']
  363. }
  364. });
  365. /* 添加实景地图 */
  366. proxy.CMapApi.addLayer({
  367. layId: 'qp3d01',
  368. layName: '牟平三维',
  369. layType: CrMap.LayerType.tilesetsLayer,
  370. isShow: true,
  371. config: {
  372. url: ['http://218.59.194.82:13480/ytmp/3dtiles/shijing/1/tileset1.json'],
  373. offsetHeight: 10
  374. }
  375. });
  376. // /* 添加实景地图 */
  377. // proxy.CMapApi.addLayer({
  378. // layId: 'lsq3d',
  379. // layName: '兰山区实景',
  380. // layType: CrMap.LayerType.tilesetsLayer,
  381. // isShow: true,
  382. // config: {
  383. // url: [
  384. // 'http://218.59.194.82:13080/crdata/sdly/crtiles/tileset.json',
  385. // 'http://218.59.194.82:13080/crdata/lyls/tiles/tileset.json',
  386. // 'http://218.59.194.82:13080/crdata/lyls/3Dtiles/tileset.json'
  387. // ]
  388. // }
  389. // });
  390. //http://10.88.77.134/lyls/3Dtiles/tileset.json
  391. // 'http://218.59.194.82:13080/crdata/sdly/crtiles/tileset.json',
  392. // 'http://218.59.194.82:13080/crdata/lyls/tiles/tileset.json',
  393. // 'http://218.59.194.82:13080/crdata/lyls/3Dtiles/tileset.json'
  394. /* 添加影像图 */
  395. proxy.CMapApi.addLayer({
  396. layId: 'yxt',
  397. layName: '影像图',
  398. layType: CrMap.LayerType.wmtsLayer,
  399. isShow: true,
  400. config: {
  401. url: 'http://218.59.194.74:6080/arcgis/rest/services/LYLSQ_YX_102100_202112/MapServer/WMTS'
  402. }
  403. });
  404. /* 添加模版影像地图 */
  405. // proxy.CMapApi.addLayer({
  406. // layId: 'mpYxt',
  407. // layName: '牟平影像图',
  408. // layType: CrMap.LayerType.templateLayer,
  409. // isShow: true,
  410. // config: {
  411. // url: 'http://202.102.167.52:16282/geoserver/gwc/service/tms/1.0.0/ytmp%3Atdt@EPSG%3A900913@png/{z}/{x}/{reverseY}.png',
  412. // minimumLevel: 0,
  413. // maximumLevel: 18
  414. // }
  415. // });
  416. /* 添加网格地图 */
  417. // proxy.CMapApi.addLayer({
  418. // layId: 'floatGHT',
  419. // layName: '浮动规划图',
  420. // layType: CrMap.LayerType.floatLayer,
  421. // isShow: true,
  422. // config: {
  423. // providerType: 'ArcGisMapServerImageryProvider',
  424. // url: 'http://218.59.194.74:6080/arcgis/rest/services/LYLSQ_GHT_102100_202112/MapServer',
  425. // // url: 'http://218.59.194.82:6080/arcgis/rest/services/LSQZRZY_RE_WEB_V1/MapServer',
  426. // // layers: '24',
  427. // opacity: 0.45
  428. // }
  429. // });
  430. // proxy.CMapApi.addLayer({
  431. // layId: 'floatGHT',
  432. // layName: '浮动规划图',
  433. // layType: CrMap.LayerType.floatLayer,
  434. // isShow: true,
  435. // config: {
  436. // providerType: 'ArcGisMapServerImageryProvider',
  437. // url: 'http://218.59.194.74:6080/arcgis/rest/services/LYLSQ_YX_102100_202112/MapServer',
  438. // // url: 'http://218.59.194.82:6080/arcgis/rest/services/LSQZRZY_RE_WEB_V1/MapServer',
  439. // // layers: '24',
  440. // opacity: 1.0
  441. // }
  442. // });
  443. /* 添加网格地图 */
  444. // proxy.CMapApi.addLayer({
  445. // layId: 'floatGHT',
  446. // layName: '浮动规划图',
  447. // layType: CrMap.LayerType.floatLayer,
  448. // isShow: true,
  449. // config: {
  450. // providerType: 'UrlTemplateImageryProvider',
  451. // // url: 'http://202.102.167.52:16282/geoserver/gwc/service/tms/1.0.0/ytmp%3Amap_zrzy_trfhl@EPSG%3A900913@png/{z}/{x}/{reverseY}.png',
  452. // url: 'http://202.102.167.52:16282/geoserver/gwc/service/tms/1.0.0/ytmp%3Atdt@EPSG%3A900913@png/{z}/{x}/{reverseY}.png',
  453. // opacity: 1
  454. // }
  455. // });
  456. /* 进入中国位置 */
  457. proxy.CMapApi.setMapRange({
  458. lng: 103.84, //经度
  459. lat: 31.15, // 维度
  460. alt: 24000000, // 高度
  461. heading: 0, //偏航
  462. pitch: -90, //俯仰,人如果在赤道上空,俯仰角为0可见地球。如果在北纬,俯仰角为负才能见地球
  463. roll: 0.0 //翻滚
  464. });
  465. /* 飞行到指定位置 */
  466. proxy.CMapApi.flyToRectangle({
  467. // strLng: 118.22087954757484,
  468. // strLat: 35.14124100849915,
  469. // endLng: 118.22865486061352,
  470. // endLat: 35.14589687229257,
  471. strLng: 118.05,
  472. strLat: 34.953,
  473. endLng: 118.53,
  474. endLat: 35.434,
  475. success: function() {
  476. /* 设置地形*/
  477. _self.CMapApi.setTerrain({
  478. // url: 'http://218.59.194.82:13080/crdata/shandong/dem'
  479. // url: 'http://202.102.167.52:16381/crdata/dem'
  480. // url: 'https://www.supermapol.com/realspace/services/3D-stk_terrain/rest/realspace/datas/info/data/path'
  481. url: 'http://218.59.194.82:13480/sddem/dem/'
  482. });
  483. /* 初始化显示图层 */
  484. _self.CMapApi.showInit();
  485. }
  486. });
  487. /* 查询ArcGIS服务试试 */
  488. proxy.CMapApi.queryAGServerExtent(
  489. 'http://218.59.194.82:6080/arcgis/rest/services/LSQZRZY_RE_WEB_V1/MapServer',
  490. '0',
  491. function(res) {
  492. console.log(JSON.stringify(res));
  493. },
  494. function(err) {
  495. console.log('查询范围错误', err);
  496. }
  497. );
  498. });
  499. </script>
  500. <style>
  501. .jt-map {
  502. position: relative;
  503. top: 0px;
  504. width: 100%;
  505. height: 100%;
  506. margin: 0;
  507. padding: 0;
  508. overflow: hidden;
  509. background-color: blue;
  510. }
  511. .jt-map-tools {
  512. position: absolute;
  513. left: 100px;
  514. top: 30px;
  515. }
  516. .cesium-performanceDisplay-defaultContainer {
  517. top: unset !important;
  518. bottom: 100px !important;
  519. right: 10px !important;
  520. }
  521. </style>