feiyu02
2024-05-06 9e0df95ffda0ef9f2339f7caf413b357640aea28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
 * 地图坐标相关计算
 */
 
import { map } from './index_old';
 
function _prepare4convert(lnglats) {
  var coor = [];
  var maxLength = 1000;
  var start = 0;
  var end = start + maxLength;
  while (end <= lnglats.length) {
    coor.push(lnglats.slice(start, end));
    start += maxLength;
    end += maxLength;
  }
  if (start < lnglats.length) {
    coor.push(lnglats.slice(start));
  }
  return coor;
}
 
function parse2LngLat(lnglats) {
  // 创建包含4个节点的折线及文字标注
  var path = [];
  lnglats.forEach(function (value) {
    // eslint-disable-next-line no-undef
    path.push(new AMap.LngLat(value[0], value[1]));
  });
  return path;
}
 
/**
 * 将gps经纬度转换为高德地图经纬度
 * @param {*} lnglats
 * @param {*} callback
 */
function _convertLatlng(index, coor, lnglats, callback) {
  if (index < coor.length) {
    var path = parse2LngLat(coor[index]);
    // eslint-disable-next-line no-undef
    AMap.convertFrom(path, 'gps', function (status, result) {
      if (result.info === 'ok') {
        lnglats.push.apply(lnglats, result.locations);
        _convertLatlng(index + 1, coor, lnglats, callback);
      }
    });
  } else {
    callback(lnglats);
  }
}
 
export default {
  /**
   * 根据坐标点、距离和角度,得到另一个坐标点
   * @param {*} pos
   * @param {*} distance 米
   * @param {*} angle
   */
  getLatLon: function (pos, distance, angle) {
    var Ea = 6378137; //   赤道半径
    var Eb = 6356725; //   极半径
    var dx = distance * Math.sin((angle * Math.PI) / 180);
    var dy = distance * Math.cos((angle * Math.PI) / 180);
    var ec = Eb + ((Ea - Eb) * (90.0 - pos[1])) / 90.0;
    var ed = ec * Math.cos((pos[1] * Math.PI) / 180);
    var lng = ((dx / ed + (pos[0] * Math.PI) / 180.0) * 180.0) / Math.PI;
    var lat = ((dy / ec + (pos[1] * Math.PI) / 180.0) * 180.0) / Math.PI;
    return [lng, lat];
  },
 
  /**
   * 将二维数组形式的坐标点数组转换为高德地图中 LngLat 类
   * @param {*} lnglats
   * @returns
   */
  parse2LngLat: function (lnglats) {
    // 创建包含4个节点的折线及文字标注
    var path = [];
    lnglats.forEach(function (value) {
      // eslint-disable-next-line no-undef
      path.push(new AMap.LngLat(value[0], value[1]));
    });
    return path;
  },
 
  /**
   * 将高德地图的经纬度坐标转换为图形坐标
   * @param {*} lnglats_GD
   * @returns
   */
  lngLatToGeodeticCoord: function (lnglats_GD) {
    var coors_GD = [];
 
    for (let i = 0; i < lnglats_GD.length; i++) {
      var gd = lnglats_GD[i];
      // eslint-disable-next-line no-undef
      var r = new AMap.LngLat(...gd);
      var p = map.lngLatToGeodeticCoord(r);
      // **记录转换后的3D地图图形坐标
      coors_GD.push(p);
    }
    return coors_GD;
  },
 
  convertFromGPS: function (gps, callback) {
    var coor = _prepare4convert(gps);
    _convertLatlng(0, coor, [], function (result) {
      var gd = [];
      result.forEach((r) => {
        gd.push([r.lng, r.lat]);
      });
      callback(gd);
    });
  }
};