js兰伯特和经纬度转换(提取自proj4js)
技术交流群:665060698
proj4是一个非常有用的坐标转换类库,有各种语言版本的,C++,java,js,python版等,可以很方便的将坐标从一个坐标系转换到另一个
坐标系。
在网页端使用的时候,转换大量的坐标时,发现存在性能有问题,就查看了一下proj4js的源代码,发现初始化很多不相关的类型,对象等,
基于现有的项目,就进行相关代码的提取,以下是提取的兰伯特和经纬度坐标的转换,简略代码说明如下:
//初始化常用的变量,直接换算成弧度,提升计算性能varEPSLN=(typeofNumber.EPSILON==='undefined')?1.0e-10:Number.EPSILON;varconv=180/Math.PI;varHALF_PI=Math.PI/2;varSPI=3.14159265359;varTWO_PI=2*Math.PI;vara=6378137;varb=6356752.314245179;vare=0.08181919084262157;varlat1=0.52359877559829;varlat2=1.04719755119659;varlong0=1.8029251173101;varlat0=0;vark0=1;varns;varf0;varrh;//常用的转换参数,直接提取引用vartsfnz=function(eccent,phi,sinphi){varcon=eccent*sinphi;varcom=0.5*eccent;con=Math.pow(((1-con)/(1+con)),com);return(Math.tan(0.5*(HALF_PI-phi))/con);};varsign=function(x){returnx<0?-1:1;};varmsfnz=function(eccent,sinphi,cosphi){varcon=eccent*sinphi;returncosphi/(Math.sqrt(1-con*con));};varadjust_lon=function(x){return(Math.abs(x)<=SPI)?x:(x-(sign(x)*TWO_PI));};varphi2z=function(eccent,ts){vareccnth=0.5*eccent;varcon,dphi;varphi=HALF_PI-2*Math.atan(ts);for(vari=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){returnphi;}}//console.log("phi2zhasNoConvergence");return-9999;};//根据proj4的坐标系描述字符串,解析其中的参数functioninit(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;}})}varsin1=Math.sin(lat1);varcos1=Math.cos(lat1);varms1=msfnz(e,sin1,cos1);varts1=tsfnz(e,lat1,sin1);varsin2=Math.sin(lat2);varcos2=Math.cos(lat2);varms2=msfnz(e,sin2,cos2);varts2=tsfnz(e,lat2,sin2);varts0=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);}//经纬度坐标转兰伯特坐标functionprojCood(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);}varcon=Math.abs(Math.abs(lat)-HALF_PI);varts,rh2;if(con>EPSLN){ts=tsfnz(e,lat,Math.sin(lat));rh2=a*f0*Math.pow(ts,ns);}else{con=lat*ns;if(con<=0){returnnull;}rh2=0;}vartheta=ns*adjust_lon(lon-long0);varnlon=(rh2*Math.sin(theta));varnlat=(rh-rh2*Math.cos(theta));return[nlon,nlat];}//兰伯特坐标转经纬度坐标functioninverseProj(x1,y1){varrh2,con,ts;varlat,lon;varx=x1/k0;vary=(rh-y1/k0);if(ns>0){rh2=Math.sqrt(x*x+y*y);con=1;}else{rh2=-Math.sqrt(x*x+y*y);con=-1;}vartheta=0;if(rh2!==0){theta=Math.atan2((con*x),(con*y));}if((rh2!==0)||(ns>0)){con=1/ns;ts=Math.pow((rh2/(a*f0)),con);lat=phi2z(e,ts);if(lat===-9999){returnnull;}}else{lat=-HALF_PI;}lon=adjust_lon(theta/ns+long0);return[lon*conv,conv*lat];}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。