tool.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //防抖debounce代码:
  2. export function debounce(fn, delay = 500) {
  3. var timeout = null; // 创建一个标记用来存放定时器的返回值
  4. return function(e) {
  5. // 每当用户输入的时候把前一个 setTimeout clear 掉
  6. clearTimeout(timeout);
  7. // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
  8. timeout = setTimeout(() => {
  9. fn.apply(this, arguments);
  10. }, delay);
  11. };
  12. }
  13. // 时间戳转换
  14. export function timestampToDate(timestamp) {
  15. // 定义日期格式对应的映射
  16. const date = new Date(timestamp);
  17. const year = date.getFullYear();
  18. const month = String(date.getMonth() + 1).padStart(2, '0');
  19. const day = String(date.getDate()).padStart(2, '0');
  20. const hours = String(date.getHours()).padStart(2, '0');
  21. const minutes = String(date.getMinutes()).padStart(2, '0');
  22. const seconds = String(date.getSeconds()).padStart(2, '0');
  23. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  24. }
  25. // 返回两个经纬度之间的距离 单位米
  26. const earthDistance = function(location1, location2) {
  27. const lat1 = parseFloat(location1.lat);
  28. const lng1 = parseFloat(location1.lng);
  29. const lat2 = parseFloat(location2.lat);
  30. const lng2 = parseFloat(location2.lng);
  31. const EARTH_RADIUS = 6378137.0; //单位M
  32. const PI = Math.PI;
  33. function getRad(d) {
  34. return d * PI / 180.0;
  35. }
  36. let f = getRad((lat1 + lat2) / 2);
  37. let g = getRad((lat1 - lat2) / 2);
  38. let l = getRad((lng1 - lng2) / 2);
  39. let sg = Math.sin(g);
  40. let sl = Math.sin(l);
  41. let sf = Math.sin(f);
  42. let s, c, w, r, d, h1, h2;
  43. let a = EARTH_RADIUS;
  44. let fl = 1 / 298.257;
  45. sg = sg * sg;
  46. sl = sl * sl;
  47. sf = sf * sf;
  48. s = sg * (1 - sl) + (1 - sf) * sl;
  49. c = (1 - sg) * (1 - sl) + sf * sl;
  50. w = Math.atan(Math.sqrt(s / c));
  51. r = Math.sqrt(s * c) / w;
  52. d = 2 * w * a;
  53. h1 = (3 * r - 1) / 2 / c;
  54. h2 = (3 * r + 1) / 2 / s;
  55. return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));
  56. };
  57. //rpx转换px px=rpx * (屏幕宽度 / 750)
  58. export const rpxTopx = function(rpx) {
  59. let width = uni.getWindowInfo().screenWidth
  60. let px = rpx * (width / 750);
  61. return px
  62. }
  63. /**
  64. * 腾讯经纬度转百度地图经纬度
  65. * @param {Object} lng
  66. * @param {Object} lat
  67. */
  68. export function qqMapTransBMap(lng, lat) {
  69. let x_pi = (3.14159265358979324 * 3000.0) / 180.0
  70. let x = lng
  71. let y = lat
  72. let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi)
  73. let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi)
  74. let lngs = z * Math.cos(theta) + 0.0065
  75. let lats = z * Math.sin(theta) + 0.006
  76. return {
  77. lng: lngs,
  78. lat: lats,
  79. }
  80. }
  81. /**
  82. * 百度地图经纬度转腾讯地图经纬度
  83. * @param {Object} lng
  84. * @param {Object} lat
  85. */
  86. export function bMapTransQQMap(lng, lat) {
  87. let x_pi = (3.14159265358979324 * 3000.0) / 180.0
  88. let x = lng - 0.0065
  89. let y = lat - 0.006
  90. let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi)
  91. let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi)
  92. let lngs = z * Math.cos(theta)
  93. let lats = z * Math.sin(theta)
  94. return {
  95. lng: lngs,
  96. lat: lats,
  97. }
  98. }
  99. /**
  100. * 将百度坐标(DB-09)转为GCJ-02(火星坐标):
  101. */
  102. export function transformFromBaiduToGCJ(latitude, longitude) {
  103. var xPi = 3.14159265358979323846264338327950288 * 3000.0 / 180.0;
  104. var x = longitude - 0.0065;
  105. var y = latitude - 0.006;
  106. var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi);
  107. var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi);
  108. var a_latitude = z * Math.sin(theta);
  109. var a_longitude = z * Math.cos(theta);
  110. return {
  111. latitude: a_latitude,
  112. longitude: a_longitude
  113. };
  114. }
  115. /**
  116. * 判断经纬度是否超出中国境内
  117. */
  118. function isLocationOutOfChina(latitude, longitude) {
  119. if (longitude < 72.004 || longitude > 137.8347 || latitude < 0.8293 || latitude > 55.8271)
  120. return true;
  121. return false;
  122. }
  123. function transformLatWithXY(x, y) {
  124. var pi = 3.14159265358979324;
  125. var lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
  126. lat += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  127. lat += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  128. lat += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  129. return lat;
  130. }
  131. function transformLonWithXY(x, y) {
  132. var pi = 3.14159265358979324;
  133. var lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
  134. lon += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  135. lon += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  136. lon += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
  137. return lon;
  138. }
  139. /**
  140. * 谷歌地图经纬度转gcj02经纬度
  141. * @param {Object} lng
  142. * @param {Object} lat
  143. */
  144. export function transformFromWGSToGCJ(latitude, longitude) {
  145. var lat = "";
  146. var lon = "";
  147. var ee = 0.00669342162296594323;
  148. var a = 6378245.0;
  149. var pi = 3.14159265358979324;
  150. if (isLocationOutOfChina(latitude, longitude)) {
  151. lat = latitude;
  152. lon = longitude;
  153. } else {
  154. var adjustLat = transformLatWithXY(longitude - 105.0, latitude - 35.0);
  155. var adjustLon = transformLonWithXY(longitude - 105.0, latitude - 35.0);
  156. var radLat = latitude / 180.0 * pi;
  157. var magic = Math.sin(radLat);
  158. magic = 1 - ee * magic * magic;
  159. var sqrtMagic = Math.sqrt(magic);
  160. adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  161. adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  162. latitude = latitude + adjustLat;
  163. longitude = longitude + adjustLon;
  164. }
  165. return {
  166. latitude: latitude,
  167. longitude: longitude
  168. };
  169. }