Profile.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /* 引入Cesium */
  2. // import * as Cesium from 'Cesium';
  3. /**
  4. * 剖面分析
  5. */
  6. class Profile {
  7. /**
  8. * 默认初始化
  9. * @param {Object} viewer 三维场景
  10. */
  11. constructor(viewer) {
  12. if (!viewer) throw new Cesium.DeveloperError('no viewer object!');
  13. this._viewer = viewer;
  14. this._profileEntities = [];
  15. }
  16. /**
  17. * 线段插值点
  18. * @ignore 忽略注释,注释不生成Doc
  19. * @param {*} positions 线段节点集合
  20. * @param {*} objectsToExclude 高度采集时排除的对象集合
  21. * @returns 经纬度点集合,包含距离值
  22. */
  23. _interPoints(positions, objectsToExclude) {
  24. let positionsCartographic = [];
  25. let terrainSamplePositions = [];
  26. for (let index = 0; index < positions.length; index++) {
  27. const element = positions[index];
  28. let ellipsoid = this._viewer.scene.globe.ellipsoid;
  29. let cartographic = ellipsoid.cartesianToCartographic(element);
  30. positionsCartographic.push(cartographic);
  31. }
  32. for (let i = 0; i < positionsCartographic.length; i++) {
  33. const m_Cartographic0 = positionsCartographic[i];
  34. const m_Cartographic1 = positionsCartographic[i + 1];
  35. if (m_Cartographic1) {
  36. let a = Math.abs(m_Cartographic0.longitude - m_Cartographic1.longitude) * 10000000;
  37. let b = Math.abs(m_Cartographic0.latitude - m_Cartographic1.latitude) * 10000000;
  38. //等距采样
  39. if (a > b) b = a;
  40. let length = parseInt(b / 2);
  41. if (length > 1000) length = 1000;
  42. if (length < 2) length = 2;
  43. for (let j = 0; j < length; j++) {
  44. terrainSamplePositions.push(
  45. new Cesium.Cartographic(
  46. Cesium.Math.lerp(
  47. m_Cartographic0.longitude,
  48. m_Cartographic1.longitude,
  49. j / (length - 1)
  50. ),
  51. Cesium.Math.lerp(
  52. m_Cartographic0.latitude,
  53. m_Cartographic1.latitude,
  54. j / (length - 1)
  55. )
  56. )
  57. );
  58. }
  59. terrainSamplePositions.pop();
  60. } else {
  61. terrainSamplePositions.push(m_Cartographic0);
  62. }
  63. }
  64. let positions_Inter = [];
  65. let distance = 0;
  66. for (let n = 0; n < terrainSamplePositions.length; n++) {
  67. //地理坐标(弧度)转经纬度坐标
  68. let curCartographic = terrainSamplePositions[n];
  69. let height = this._viewer.scene.sampleHeight(curCartographic, objectsToExclude);
  70. const lon = (curCartographic.longitude / Math.PI) * 180;
  71. const lat = (curCartographic.latitude / Math.PI) * 180;
  72. let point = Cesium.Cartesian3.fromDegrees(lon, lat, height);
  73. let preCartographic = terrainSamplePositions[n - 1];
  74. if (preCartographic) {
  75. const lon1 = (preCartographic.longitude / Math.PI) * 180;
  76. const lat1 = (preCartographic.latitude / Math.PI) * 180;
  77. let point1 = Cesium.Cartesian3.fromDegrees(lon1, lat1, height);
  78. let curDis = Cesium.Cartesian3.distance(point1, point);
  79. distance += curDis;
  80. }
  81. positions_Inter.push({
  82. position: {
  83. lon: lon,
  84. lat: lat,
  85. height: height
  86. },
  87. distance: distance,
  88. });
  89. }
  90. return positions_Inter;
  91. }
  92. }
  93. /**
  94. * 通用对外公开函数
  95. */
  96. Object.assign(Profile.prototype, /** @lends Profile.prototype */{
  97. /**
  98. * 开启剖面分析
  99. * @param {Object} [points] 坐标:[lng,lat,lng,lat,......]
  100. * @param {Object} entity 线对象
  101. */
  102. startProfileAnalysis(points, entity) {
  103. //异步函数
  104. return new Promise((resolve, reject) => {
  105. let _self = this;
  106. /* 转换坐标 */
  107. let positions = points.map(point => {
  108. return Cesium.Cartesian3.fromDegrees(point[0], point[1], point[2] || 0);
  109. });
  110. _self.removeProfileAnalysis();
  111. entity.clampToGround = true;
  112. console.log(positions);
  113. let pointsList = _self._interPoints(positions, [entity]);
  114. console.log(pointsList);
  115. resolve(pointsList);
  116. });
  117. },
  118. /**
  119. * 移除剖面检测
  120. */
  121. removeProfileAnalysis() {
  122. let _self = this;
  123. if (_self._profileEntities && _self._profileEntities.length > 0) {
  124. _self._profileEntities.forEach((element) => {
  125. _self._viewer.entities.remove(element);
  126. });
  127. }
  128. _self._profileEntities = [];
  129. },
  130. });
  131. export default Profile;