??proj4是一个很好用的坐标系转换库,其丰富的坐标系类型和开发语言,让转换很方便,但是当我们只需要其中的很少坐标系相互转换,坐标量比较大的时候,就面临性能问题,鉴于在工作的使用,提取了其中的lcc和wgs84的坐标系转换,源码如下: ????????`var lccToWgs84 = function() {"use strict";var EPSLN = (typeof Number.EPSILON === ‘undefined‘) ? 1.0e-10 : Number.EPSILON;var conv = 180 / Math.PI;var HALF_PI = Math.PI / 2;var SPI = 3.14159265359;var TWO_PI = 2 * Math.PI;var a = 6378137;var b = 6356752.314245179;var e = 0.08181919084262157;var lat1 = 0.52359877559829;var lat2 = 1.04719755119659;// ?var c_lat = 33.30001;// ?var c_lon = 103.3;var long0 = 1.8029251173101;var lat0 = 0;var k0 = 1;// ?var lat1 = 30 / conv;// ?var lat2 = 60 / conv;// ?var c_lat = 33.30001;// ?var c_lon = 103.3;// ?var long0 = c_lon / conv;// ?var lat0 = c_lat / conv;var ns;var f0;var rh;var tsfnz = function(eccent, phi, sinphi) { ???var con = eccent * sinphi; ???var com = 0.5 * eccent; ???con = Math.pow(((1 - con) / (1 + con)), com); ???return(Math.tan(0.5 * (HALF_PI - phi)) / con);};var sign = function(x) { ???return x < 0 ? -1 : 1;};var msfnz = function(eccent, sinphi, cosphi) { ???var con = eccent * sinphi; ???return cosphi / (Math.sqrt(1 - con * con));};var adjust_lon = function(x) { ???return(Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));};var phi2z = function(eccent, ts) { ???var eccnth = 0.5 * eccent; ???var con, dphi; ???var phi = HALF_PI - 2 * Math.atan(ts); ???for(var i = 0; i <= 15; i++) { ???????con = eccent * Math.sin(phi); ???????dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi; ???????phi += dphi; ???????if(Math.abs(dphi) <= 0.0000000001) { ???????????return phi; ???????} ???} ???//console.log("phi2z has NoConvergence"); ???return -9999;};function init(prjstr) { ???if(prjstr.indexOf(" ") > -1) { ???????var _prjArr = prjstr.split(" "); ???????_prjArr.forEach(function(item, index, input) { ???????????if(item.indexOf("lat_0") > -1) { ???????????????lat0 = parseFloat(item.split("=")[1]) / conv; ???????????} ???????}) ???} ???var sin1 = Math.sin(lat1); ???var cos1 = Math.cos(lat1); ???var ms1 = msfnz(e, sin1, cos1); ???var ts1 = tsfnz(e, lat1, sin1); ???var sin2 = Math.sin(lat2); ???var cos2 = Math.cos(lat2); ???var ms2 = msfnz(e, sin2, cos2); ???var ts2 = tsfnz(e, lat2, sin2); ???var ts0 = tsfnz(e, lat0, Math.sin(lat0)); ???if(Math.abs(lat1 - lat2) > EPSLN) { ???????ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); ???} else { ???????ns = sin1; ???} ???if(isNaN(ns)) { ???????ns = sin1; ???} ???f0 = ms1 / (ns * Math.pow(ts1, ns)); ???rh = a * f0 * Math.pow(ts0, ns);}function projCood(lon, lat) { ???lon = lon / conv; ???lat = lat / conv; ???if(Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { ???????lat = sign(lat) * (HALF_PI - 2 * EPSLN); ???} ???var con = Math.abs(Math.abs(lat) - HALF_PI); ???var ts, rh1; ???if(con > EPSLN) { ???????ts = tsfnz(e, lat, Math.sin(lat)); ???????rh1 = a * f0 * Math.pow(ts, ns); ???} else { ???????con = lat * ns; ???????if(con <= 0) { ???????????return null; ???????} ???????rh1 = 0; ???} ???var theta = ns * adjust_lon(lon - long0); ???var nlon = (rh1 * Math.sin(theta)); ???var nlat = (rh - rh1 * Math.cos(theta)); ???return [nlon, nlat];}return { ???init: init, ???projCood: projCood};
}();`
Proj4js中lcc和wgs84坐标转换
原文地址:http://blog.51cto.com/speciallst/2070740