Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

Transform.js 3.4KB

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