You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Transform.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /**
  2. * @Author : Caven Chen
  3. */
  4. import { Cesium } from '../../namespace'
  5. import Position from '../position/Position'
  6. const WMP = new Cesium.WebMercatorProjection()
  7. class Transform {
  8. /**
  9. * Transforms Cartesian To WGS84
  10. * @param cartesian
  11. * @returns {Position}
  12. */
  13. static transformCartesianToWGS84(cartesian) {
  14. if (cartesian) {
  15. let cartographic =
  16. Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian)
  17. return new Position(
  18. Cesium.Math.toDegrees(cartographic?.longitude || 0),
  19. Cesium.Math.toDegrees(cartographic?.latitude || 0),
  20. cartographic.height || 0
  21. )
  22. }
  23. return new Position(0, 0)
  24. }
  25. /**
  26. * Transforms Cartographic To WGS84
  27. * @param cartographic
  28. * @returns {Position}
  29. */
  30. static transformCartographicToWGS84(cartographic) {
  31. if (cartographic) {
  32. return new Position(
  33. Cesium.Math.toDegrees(cartographic?.longitude || 0),
  34. Cesium.Math.toDegrees(cartographic?.latitude || 0),
  35. cartographic.height || 0
  36. )
  37. }
  38. return new Position(0, 0)
  39. }
  40. /**
  41. * Transforms WGS84 To Cartesian
  42. * @param position
  43. * @returns {Cartesian3}
  44. */
  45. static transformWGS84ToCartesian(position) {
  46. return position
  47. ? Cesium.Cartesian3.fromDegrees(
  48. position.lng,
  49. position.lat,
  50. position.alt,
  51. Cesium.Ellipsoid.WGS84
  52. )
  53. : Cesium.Cartesian3.ZERO
  54. }
  55. /**
  56. * Transforms WGS84 To Cartographic
  57. * @param position
  58. * @returns {Cartographic}
  59. */
  60. static transformWGS84ToCartographic(position) {
  61. return position
  62. ? Cesium.Cartographic.fromDegrees(
  63. position.lng,
  64. position.lat,
  65. position.alt
  66. )
  67. : Cesium.Cartographic.ZERO
  68. }
  69. /**
  70. * Transforms Cartesian Array To WGS84 Array
  71. * @param cartesianArr
  72. * @returns {*|*[]}
  73. */
  74. static transformCartesianArrayToWGS84Array(cartesianArr) {
  75. return cartesianArr
  76. ? cartesianArr.map((item) => this.transformCartesianToWGS84(item))
  77. : []
  78. }
  79. /**
  80. * Transforms WGS84 Array To Cartesian Array
  81. * @param WGS84Arr
  82. * @returns {*|*[]}
  83. */
  84. static transformWGS84ArrayToCartesianArray(WGS84Arr) {
  85. return WGS84Arr
  86. ? WGS84Arr.map((item) => this.transformWGS84ToCartesian(item))
  87. : []
  88. }
  89. /**
  90. * Transforms WGS84 To Mercator
  91. * @param position
  92. * @returns {Position}
  93. */
  94. static transformWGS84ToMercator(position) {
  95. let mp = WMP.project(
  96. Cesium.Cartographic.fromDegrees(position.lng, position.lat, position.alt)
  97. )
  98. return new Position(mp.x, mp.y, mp.z)
  99. }
  100. /**
  101. * Transforms Mercator To WGS84
  102. * @param position
  103. * @returns {Position}
  104. */
  105. static transformMercatorToWGS84(position) {
  106. let mp = WMP.unproject(
  107. new Cesium.Cartesian3(position.lng, position.lat, position.alt)
  108. )
  109. return new Position(
  110. Cesium.Math.toDegrees(mp.longitude),
  111. Cesium.Math.toDegrees(mp.latitude),
  112. mp.height
  113. )
  114. }
  115. /**
  116. * Transforms Window To WGS84
  117. * @param position
  118. * @param viewer
  119. * @returns {Position}
  120. */
  121. static transformWindowToWGS84(position, viewer) {
  122. let scene = viewer.scene
  123. let cartesian
  124. if (scene.mode === Cesium.SceneMode.SCENE3D) {
  125. let ray = scene.camera.getPickRay(position)
  126. cartesian = scene.globe.pick(ray, scene)
  127. } else {
  128. cartesian = scene.camera.pickEllipsoid(position, Cesium.Ellipsoid.WGS84)
  129. }
  130. return this.transformCartesianToWGS84(cartesian)
  131. }
  132. /**
  133. * Transforms WGS84 To Window
  134. * @param position
  135. * @param viewer
  136. * @returns {Cartesian2}
  137. */
  138. static transformWGS84ToWindow(position, viewer) {
  139. let scene = viewer.scene
  140. return Cesium.SceneTransforms.wgs84ToWindowCoordinates(
  141. scene,
  142. this.transformWGS84ToCartesian(position)
  143. )
  144. }
  145. }
  146. export default Transform