UNPKG

vue-cesium

Version:
360 lines (357 loc) 9.19 kB
import Point from './Point.mjs'; import Pixel from './Pixel.mjs'; "use strict"; const EARTHRADIUS = 6378137; const MCBAND = [1289059486e-2, 836237787e-2, 5591021, 348198983e-2, 167804312e-2, 0]; const LLBAND = [75, 60, 45, 30, 15, 0]; const MC2LL = [ [ 1410526172116255e-23, 898305509648872e-20, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 173379812e-1 ], [ -7435856389565537e-24, 8983055097726239e-21, -0.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 1026014486e-2 ], [ -3030883460898826e-23, 898305509983578e-20, 0.30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 685681737e-2 ], [ -1981981304930552e-23, 8983055099779535e-21, 0.03278182852591, 40.31678527705744, 0.65659298677277, -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 448277706e-2 ], [ 309191371068437e-23, 8983055096812155e-21, 6995724062e-14, 23.10934304144901, -23663490511e-14, -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 25551644e-1 ], [ 2890871144776878e-24, 8983055095805407e-21, -3068298e-14, 7.47137025468032, -353937994e-14, -0.02145144861037, -1234426596e-14, 10322952773e-14, -323890364e-14, 826088.5 ] ]; const LL2MC = [ [ -0.0015702102444, 111320.7020616939, 1704480524535203, -10338987376042340, 26112667856603880, -35149669176653700, 26595700718403920, -10725012454188240, 1800819912950474, 82.5 ], [ 8277824516172526e-19, 111320.7020463578, 6477955746671607e-7, -4082003173641316e-6, 1077490566351142e-5, -1517187553151559e-5, 1205306533862167e-5, -5124939663577472e-6, 9133119359512032e-7, 67.5 ], [ 0.00337398766765, 111320.7020202162, 4481351045890365e-9, -2339375119931662e-8, 7968221547186455e-8, -1159649932797253e-7, 9723671115602145e-8, -4366194633752821e-8, 8477230501135234e-9, 52.5 ], [ 0.00220636496208, 111320.7020209128, 51751.86112841131, 3796837749470245e-9, 992013.7397791013, -122195221711287e-8, 1340652697009075e-9, -620943.6990984312, 144416.9293806241, 37.5 ], [ -3441963504368392e-19, 111320.7020576856, 278.2353980772752, 2485758690035394e-9, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5 ], [ -3218135878613132e-19, 111320.7020701615, 0.00369383431289, 823725.6402795718, 0.46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, 0.37238884252424, 7.45 ] ]; class BaiduMapMercatorProjection { // constructor () { // super() // } /** * 根据平面直角坐标计算两点间距离; * @param {Point} point1 平面直角点坐标1 * @param {Point} point2 平面直角点坐标2; * @return {Number} 返回两点间的距离 */ getDistanceByMC(point1, point2) { if (!point1 || !point2) return 0; point1 = this.inverse(point1); if (!point1) return 0; const x1 = toRadians(point1.lng); const y1 = toRadians(point1.lat); point2 = this.inverse(point2); if (!point2) return 0; const x2 = toRadians(point2.lng); const y2 = toRadians(point2.lat); return getDistance(x1, x2, y1, y2); } /** * 根据经纬度坐标计算两点间距离; * @param {Point} point1 经纬度点坐标1 * @param {Point} point2 经纬度点坐标2; * @return {Number} 返回两点间的距离 */ getDistanceByLL(point1, point2) { if (!point1 || !point2) return 0; point1.lng = getLoop(point1.lng, -180, 180); point1.lat = getRange(point1.lat, -74, 74); point2.lng = getLoop(point2.lng, -180, 180); point2.lat = getRange(point2.lat, -74, 74); const x1 = toRadians(point1.lng); const y1 = toRadians(point1.lat); const x2 = toRadians(point2.lng); const y2 = toRadians(point2.lat); return getDistance(x1, x2, y1, y2); } /** * 平面直角坐标转换成经纬度坐标; * @param {Point} point 平面直角坐标 * @return {Point} 返回经纬度坐标 */ inverse(point) { let factor; const temp = new Point(Math.abs(point.lng), Math.abs(point.lat)); for (let i = 0; i < MCBAND.length; i++) { if (temp.lat >= MCBAND[i]) { factor = MC2LL[i]; break; } } const lnglat = convertor(point, factor); return new Point(lnglat == null ? void 0 : lnglat.lng, lnglat == null ? void 0 : lnglat.lat); } /** * 经纬度坐标转换成平面直角坐标; * @param {Point} point 经纬度坐标 * @return {Point} 返回平面直角坐标 */ forward(point) { let factor; point.lng = getLoop(point.lng, -180, 180); point.lat = getRange(point.lat, -74, 74); const temp = new Point(point.lng, point.lat); for (let i = 0; i < LLBAND.length; i++) { if (temp.lat >= LLBAND[i]) { factor = LL2MC[i]; break; } } if (!factor) { for (let i = LLBAND.length - 1; i >= 0; i--) { if (temp.lat <= -LLBAND[i]) { factor = LL2MC[i]; break; } } } const mc = convertor(point, factor); return new Point(mc == null ? void 0 : mc.lng, mc == null ? void 0 : mc.lat); } /** * 经纬度变换至墨卡托坐标 * @param Point 经纬度 * @return Point 墨卡托 */ lngLatToMercator(point, curCity) { return this.forward(point); } /** * 球面到平面坐标 * @param Point 球面坐标 * @return Pixel 平面坐标 */ lngLatToPoint(point) { const mercator = this.forward(point); return new Pixel(mercator.lng, mercator.lat); } /** * 墨卡托变换至经纬度 * @param Point 墨卡托 * @returns Point 经纬度 */ mercatorToLngLat(point, curCity) { return this.inverse(point); } /** * 平面到球面坐标 * @param Pixel 平面坐标 * @returns Point 球面坐标 */ pointToLngLat(point) { const mercator = new Point(point.x, point.y); return this.inverse(mercator); } /** * 地理坐标转换至像素坐标 * @param Point 地理坐标 * @param Number 级别 * @param Point 地图中心点,注意为了保证没有误差,这里需要传递墨卡托坐标 * @param Size 地图容器大小 * @return Pixel 像素坐标 */ pointToPixel(point, zoom, mapCenter, mapSize, curCity) { if (!point) { return; } point = this.lngLatToMercator(point, curCity); mapCenter = this.lngLatToMercator(mapCenter); const zoomUnits = this.getZoomUnits(zoom); const x = Math.round((point.lng - mapCenter.lng) / zoomUnits + mapSize.width / 2); const y = Math.round((mapCenter.lat - point.lat) / zoomUnits + mapSize.height / 2); return new Pixel(x, y); } /** * 像素坐标转换至地理坐标 * @param Pixel 像素坐标 * @param Number 级别 * @param Point 地图中心点,注意为了保证没有误差,这里需要传递墨卡托坐标 * @param Size 地图容器大小 * @return Point 地理坐标 */ pixelToPoint(pixel, zoom, mapCenter, mapSize, curCity) { if (!pixel) { return; } const zoomUnits = this.getZoomUnits(zoom); const lng = mapCenter.lng + zoomUnits * (pixel.x - mapSize.width / 2); const lat = mapCenter.lat - zoomUnits * (pixel.y - mapSize.height / 2); const point = new Point(lng, lat); return this.mercatorToLngLat(point, curCity); } getZoomUnits(zoom) { return Math.pow(2, 18 - zoom); } } function convertor(fromPoint, factor) { if (!fromPoint || !factor) { return; } let x = factor[0] + factor[1] * Math.abs(fromPoint.lng); const temp = Math.abs(fromPoint.lat) / factor[9]; let y = factor[2] + factor[3] * temp + factor[4] * temp * temp + factor[5] * temp * temp * temp + factor[6] * temp * temp * temp * temp + factor[7] * temp * temp * temp * temp * temp + factor[8] * temp * temp * temp * temp * temp * temp; x *= fromPoint.lng < 0 ? -1 : 1; y *= fromPoint.lat < 0 ? -1 : 1; return new Point(x, y); } function getLoop(v, a, b) { while (v > b) { v -= b - a; } while (v < a) { v += b - a; } return v; } function getRange(v, a, b) { if (a != null) { v = Math.max(v, a); } if (b != null) { v = Math.min(v, b); } return v; } function getDistance(x1, x2, y1, y2) { return EARTHRADIUS * Math.acos(Math.sin(y1) * Math.sin(y2) + Math.cos(y1) * Math.cos(y2) * Math.cos(x2 - x1)); } function toRadians(angdeg) { return Math.PI * angdeg / 180; } function toDegrees(angrad) { return 180 * angrad / Math.PI; } export { BaiduMapMercatorProjection as default }; //# sourceMappingURL=BaiduMapMercatorProjection.mjs.map