/** * 地图坐标相关计算 */ 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); }); } };