日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

proj4经纬度bl转换xy_分享proj4js中经纬度和兰伯特投影的转换代码

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 proj4经纬度bl转换xy_分享proj4js中经纬度和兰伯特投影的转换代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

蘭伯特投影簡介參見百科搜索:

蘭伯特投影在氣象數據的處理中,是比較常用的投影坐標系,根據不同區域、范圍進行投影。

proj4是專業的坐標轉換類庫,有各種語言版本的,C++,java,js,python版等,可以很方便的將坐標從一個坐標系轉換到另一個坐標系。

在前端使用的時候,應用場景需要轉換大量的坐標,就會發現使用proj4js存在性能問題,查看了一下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?

};

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;

}

}

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,?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)?{

returnnull;

}

rh1?=?0;

}

vartheta?=?ns?*?adjust_lon(lon?-?long0);

varnlon?=?(rh1?*?Math.sin(theta));

varnlat?=?(rh?-?rh1?*?Math.cos(theta));

return[nlon,?nlat];

}

//蘭伯特坐標轉經緯度坐標

functioninverseProj(x1,?y1)?{

varrh1,?con,?ts;

varlat,?lon;

varx?=?x1?/?k0;

vary?=?(rh?-?y1?/?k0);

if(ns?>?0)?{

rh1?=?Math.sqrt(x?*?x?+?y?*?y);

con?=?1;

}else{

rh1?=?-Math.sqrt(x?*?x?+?y?*?y);

con?=?-1;

}

vartheta?=?0;

if(rh1?!==?0)?{

theta?=?Math.atan2((con?*?x),?(con?*?y));

}

if((rh1?!==?0)?||?(ns?>?0))?{

con?=?1?/?ns;

ts?=?Math.pow((rh1?/?(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];

}

對于在應用中的其他坐標系轉換,同樣能夠在其中進行代碼提取。

總結

以上是生活随笔為你收集整理的proj4经纬度bl转换xy_分享proj4js中经纬度和兰伯特投影的转换代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。