learning_cesium/js/utils/mapUtil.js

107 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
var PI = 3.14159265358979324;
const a = 6378245.0;
const ee = 0.00669342162296594323;
var mapZbConvert = {
// 百度坐标bd09II转火星坐标GCJ02
baiduTomars: function (baidu_point) {
var mars_point = { x: 0, y: 0 };
var x = baidu_point.x - 0.0065;
var y = baidu_point.y - 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);
mars_point.x = z * Math.cos(theta);
mars_point.y = z * Math.sin(theta);
return mars_point;
},
// 火星坐标系GCJ02转地球坐标系WGS84
transformGCJ2WGS: function (gcjLat, gcjLon) {
let d = this.delta(gcjLat, gcjLon)
return {
'lat': gcjLat - d.lat,
'lon': gcjLon - d.lon
}
},
delta: function (lat, lon) {
let a = 6378245.0 // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
let ee = 0.00669342162296594323 // ee: 椭球的偏心率。
let dLat = this.transformLat(lon - 105.0, lat - 35.0)
let dLon = this.transformLon(lon - 105.0, lat - 35.0)
let radLat = lat / 180.0 * PI
let magic = Math.sin(radLat)
magic = 1 - ee * magic * magic
let sqrtMagic = Math.sqrt(magic)
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI)
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI)
return {
'lat': dLat,
'lon': dLon
}
},
transformLat: function (x, y) {
let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))
ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0
ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0
ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0
return ret
},
transformLon: function (x, y) {
let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))
ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0
ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0
ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0
return ret
},
// 经纬度转墨卡托
lonlatTomercator: function (lonlat) {
var mercator = { x: 0, y: 0 };
var x = lonlat.x * 20037508.34 / 180;
var y = Math.log(Math.tan((90 + lonlat.y) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
// mercator.x = x * parseFloat('0.597171361602');
// mercator.y = y * parseFloat('0.593350031602');
mercator.x = x;
mercator.y = y;
return mercator;
},
// 墨卡托转 经纬度
mercatorTolonlat: function (mercator) {
var lonlat = { x: 0, y: 0 };
var x = mercator.x / 20037508.34 * 180;
var y = mercator.y / 20037508.34 * 180;
y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2);
// lonlat.x = x / parseFloat('0.597171361602');
// lonlat.y = y / parseFloat('0.604060871602');
lonlat.x = x;
lonlat.y = y;
return lonlat;
},
wgs84togcj02(lng, lat) {
lat = +lat;
lng = +lng;
if (out_of_china(lng, lat)) {
return [lng, lat]
} else {
let dlat = this.transformLat(lng - 105.0, lat - 35.0);
let dlng = this.transformLon(lng - 105.0, lat - 35.0);
let radlat = lat / 180.0 * PI;
let magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
let sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
let mglat = lat + dlat;
let mglng = lng + dlng;
return [mglng, mglat]
}
}
}
function out_of_china(lng, lat) {
lat = +lat;
lng = +lng;
// 纬度3.86~53.55,经度73.66~135.05
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
}