Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

CoordTransform.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /**
  2. * @Author: Caven
  3. * @Date: 2021-01-31 20:40:25
  4. */
  5. const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0
  6. const PI = 3.1415926535897932384626
  7. const RADIUS = 6378245.0
  8. const EE = 0.00669342162296594323
  9. class CoordTransform {
  10. /**
  11. * BD-09 To GCJ-02
  12. * @param lng
  13. * @param lat
  14. * @returns {number[]}
  15. */
  16. static BD09ToGCJ02(lng, lat) {
  17. let x = +lng - 0.0065
  18. let y = +lat - 0.006
  19. let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR)
  20. let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR)
  21. let gg_lng = z * Math.cos(theta)
  22. let gg_lat = z * Math.sin(theta)
  23. return [gg_lng, gg_lat]
  24. }
  25. /**
  26. * GCJ-02 To BD-09
  27. * @param lng
  28. * @param lat
  29. * @returns {number[]}
  30. * @constructor
  31. */
  32. static GCJ02ToBD09(lng, lat) {
  33. lat = +lat
  34. lng = +lng
  35. let z =
  36. Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * BD_FACTOR)
  37. let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR)
  38. let bd_lng = z * Math.cos(theta) + 0.0065
  39. let bd_lat = z * Math.sin(theta) + 0.006
  40. return [bd_lng, bd_lat]
  41. }
  42. /**
  43. * WGS-84 To GCJ-02
  44. * @param lng
  45. * @param lat
  46. * @returns {number[]}
  47. */
  48. static WGS84ToGCJ02(lng, lat) {
  49. lat = +lat
  50. lng = +lng
  51. if (this.out_of_china(lng, lat)) {
  52. return [lng, lat]
  53. } else {
  54. let d = this.delta(lng, lat)
  55. return [lng + d[0], lat + d[1]]
  56. }
  57. }
  58. /**
  59. * GCJ-02 To WGS-84
  60. * @param lng
  61. * @param lat
  62. * @returns {number[]}
  63. * @constructor
  64. */
  65. static GCJ02ToWGS84(lng, lat) {
  66. lat = +lat
  67. lng = +lng
  68. if (this.out_of_china(lng, lat)) {
  69. return [lng, lat]
  70. } else {
  71. let d = this.delta(lng, lat)
  72. let mgLng = lng + d[0]
  73. let mgLat = lat + d[1]
  74. return [lng * 2 - mgLng, lat * 2 - mgLat]
  75. }
  76. }
  77. /**
  78. *
  79. * @param lng
  80. * @param lat
  81. * @returns {number[]}
  82. */
  83. static delta(lng, lat) {
  84. let dLng = this.transformLng(lng - 105, lat - 35)
  85. let dLat = this.transformLat(lng - 105, lat - 35)
  86. const radLat = (lat / 180) * PI
  87. let magic = Math.sin(radLat)
  88. magic = 1 - EE * magic * magic
  89. const sqrtMagic = Math.sqrt(magic)
  90. dLng = (dLng * 180) / ((RADIUS / sqrtMagic) * Math.cos(radLat) * PI)
  91. dLat = (dLat * 180) / (((RADIUS * (1 - EE)) / (magic * sqrtMagic)) * PI)
  92. return [dLng, dLat]
  93. }
  94. /**
  95. *
  96. * @param lng
  97. * @param lat
  98. * @returns {number}
  99. */
  100. static transformLng(lng, lat) {
  101. lat = +lat
  102. lng = +lng
  103. let ret =
  104. 300.0 +
  105. lng +
  106. 2.0 * lat +
  107. 0.1 * lng * lng +
  108. 0.1 * lng * lat +
  109. 0.1 * Math.sqrt(Math.abs(lng))
  110. ret +=
  111. ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
  112. 2.0) /
  113. 3.0
  114. ret +=
  115. ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) /
  116. 3.0
  117. ret +=
  118. ((150.0 * Math.sin((lng / 12.0) * PI) +
  119. 300.0 * Math.sin((lng / 30.0) * PI)) *
  120. 2.0) /
  121. 3.0
  122. return ret
  123. }
  124. /**
  125. *
  126. * @param lng
  127. * @param lat
  128. * @returns {number}
  129. */
  130. static transformLat(lng, lat) {
  131. lat = +lat
  132. lng = +lng
  133. let ret =
  134. -100.0 +
  135. 2.0 * lng +
  136. 3.0 * lat +
  137. 0.2 * lat * lat +
  138. 0.1 * lng * lat +
  139. 0.2 * Math.sqrt(Math.abs(lng))
  140. ret +=
  141. ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
  142. 2.0) /
  143. 3.0
  144. ret +=
  145. ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) /
  146. 3.0
  147. ret +=
  148. ((160.0 * Math.sin((lat / 12.0) * PI) +
  149. 320 * Math.sin((lat * PI) / 30.0)) *
  150. 2.0) /
  151. 3.0
  152. return ret
  153. }
  154. /**
  155. *
  156. * @param lng
  157. * @param lat
  158. * @returns {boolean}
  159. */
  160. static out_of_china(lng, lat) {
  161. lat = +lat
  162. lng = +lng
  163. return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)
  164. }
  165. }
  166. export default CoordTransform