UNPKG

@vtx/cs-map

Version:

React components for Vortex

188 lines (179 loc) 6.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; /** * 提供了百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)、和 WGS-84 坐标系之间的转换 */ // 定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = 6378245.0; var ee = 0.00669342162296594323; /** * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02) 的转换 * 即 百度 转 谷歌、高德 * @param bd_lng_new * @param bd_lat_new * @returns {*[]} */ var bd09togcj02 = function bd09togcj02(bd_lng_new, bd_lat_new) { var bd_lng = +bd_lng_new; var bd_lat = +bd_lat_new; var x = bd_lng - 0.0065; var y = bd_lat - 0.006; var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); var gg_lng = z * Math.cos(theta); var gg_lat = z * Math.sin(theta); return [gg_lng, gg_lat]; }; /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 * 即 谷歌、高德 转 百度 * @param lng_new * @param lat_new * @returns {*[]} */ var gcj02tobd09 = function gcj02tobd09(lng_new, lat_new) { var lat = +lat_new; var lng = +lng_new; var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); var bd_lng = z * Math.cos(theta) + 0.0065; var bd_lat = z * Math.sin(theta) + 0.006; return [bd_lng, bd_lat]; }; /** * WGS-84 转 GCJ-02 * @param lng_wgs * @param lat_wgs * @returns {*[]} */ var wgs84togcj02 = function wgs84togcj02(lng_wgs, lat_wgs) { var lat = +lat_wgs; var lng = +lng_wgs; if (out_of_china(lng, lat)) { return [lng, lat]; } else { var dlat = transformlat(lng - 105.0, lat - 35.0); var dlng = transformlng(lng - 105.0, lat - 35.0); var radlat = lat / 180.0 * PI; var magic = Math.sin(radlat); magic = 1 - ee * magic * magic; var sqrtmagic = Math.sqrt(magic); dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI); dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI); var mglat = lat + dlat; var mglng = lng + dlng; return [mglng, mglat]; } }; /** * GCJ-02 转换为 WGS-84 * @param lng_gcj * @param lat_gcj * @returns {*[]} */ var gcj02towgs84 = function gcj02towgs84(lng_gcj, lat_gcj) { var lat = +lat_gcj; var lng = +lng_gcj; if (out_of_china(lng, lat)) { return [lng, lat]; } else { var dlat = transformlat(lng - 105.0, lat - 35.0); var dlng = transformlng(lng - 105.0, lat - 35.0); var radlat = lat / 180.0 * PI; var magic = Math.sin(radlat); magic = 1 - ee * magic * magic; var sqrtmagic = Math.sqrt(magic); dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI); dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI); var mglat = lat + dlat; var mglng = lng + dlng; return [lng * 2 - mglng, lat * 2 - mglat]; } }; var transformlat = function transformlat(lngTrans, latTrans) { var lat = +latTrans; var lng = +lngTrans; var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; return ret; }; var transformlng = function transformlng(lng_new, lat_new) { var lat = +lat_new; var lng = +lng_new; var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; return ret; }; /** * 判断是否在国内,不在国内则不做偏移 * @param lng_out * @param lat_out * @returns {boolean} */ var out_of_china = function out_of_china(lng_out, lat_out) { var lat = +lat_out; var lng = +lng_out; // 纬度 3.86~53.55, 经度 73.66~135.05 return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55); }; /** * 根据坐标计算里程 */ var getFlatternDistance = function getFlatternDistance(_ref) { var lon1 = _ref.lon1, lat1 = _ref.lat1, lon2 = _ref.lon2, lat2 = _ref.lat2; var DEF_PI = 3.14159265359; // PI var DEF_2PI = 6.28318530712; // 2*PI var DEF_PI180 = 0.01745329252; // PI/180.0 var DEF_R = 6370693.5; // radius of earth var ew1, ns1, ew2, ns2; var dx, dy, dew; var distance; // 角度转换为弧度 ew1 = lon1 * DEF_PI180; ns1 = lat1 * DEF_PI180; ew2 = lon2 * DEF_PI180; ns2 = lat2 * DEF_PI180; // 经度差 dew = ew1 - ew2; // 若跨东经和西经180 度,进行调整 if (dew > DEF_PI) dew = DEF_2PI - dew;else if (dew < -DEF_PI) dew = DEF_2PI + dew; dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度) dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度) // 勾股定理求斜边长 distance = Math.sqrt(dx * dx + dy * dy).toFixed(0); return distance; }; /** * 计算里程数 * @param history 坐标集合 */ var calculateMileage = function calculateMileage(history) { var mileage = 0; for (var i = 0; i < history.length - 1; i++) { mileage += parseInt(getFlatternDistance({ lon1: history[i].longitude, lat1: history[i].latitude, lon2: history[i + 1].longitude, lat2: history[i + 1].latitude })); } return mileage == 0 ? '--:--' : "".concat((mileage / 1000).toFixed(2), "\u516C\u91CC"); }; var _default = exports["default"] = { bd09togcj02: bd09togcj02, gcj02tobd09: gcj02tobd09, wgs84togcj02: wgs84togcj02, gcj02towgs84: gcj02towgs84, calculateMileage: calculateMileage }; //# sourceMappingURL=mapTool.js.map