兰伯特投影简介参见百科搜索:
兰伯特投影在气象数据的处理中,是比较常用的投影坐标系,根据不同区域、范围进行投影。
proj4是专业的坐标转换类库,有各种语言版本的,C++,java,js,python版等,可以很方便的将坐标从一个坐标系转换到另一个坐标系。
在前端使用的时候,应用场景需要转换大量的坐标,就会发现使用proj4js存在性能问题,查看了一下proj4js的源代码,发现类库每次调用初始化很多不相关的类型,对象等,所以,在基础上,进行了提取。
转换代码及说明

//初始化常用的变量,直接换算成弧度,提升计算性能
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 long0 = 1.8029251173101;
var lat0 = 0;
var k0 = 1;
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;}
}
return -9999;
};     //根据proj4的坐标系描述字符串,解析其中的参数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];}//兰伯特坐标转经纬度坐标function inverseProj(x1, y1) {var rh1, con, ts;var lat, lon;var x = x1 / k0;var y = (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;}var theta = 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) {return null;}} else {lat = -HALF_PI;}lon = adjust_lon(theta / ns + long0);return [lon * conv, conv * lat];}

对于在应用中的其他坐标系转换,同样能够在其中进行代码提取。

分享proj4js中经纬度和兰伯特投影的转换代码相关推荐

  1. Python-cartopy兰伯特投影绘制场图

    在学习画图的过程中,看了许多大佬的绘图代码收益匪浅.在巨人的肩膀上继续前进,分享这一次的画图.多数没有注释,原理可能需要额外找别的帖子进行查阅. 再次之前,anaconda安装cartopy包也遇到了 ...

  2. 计算兰伯特投影数据到其他空间参考的地理范围

    问题:  在实现动态投影得时候未考虑兰伯特这种投影, 导致投影得数据过少, 数据有缺失 分析: 常用投影计算是将一个投影得box范围计算到另外一个投影得box上, 直接使用box得四个点计算, 但是兰 ...

  3. lambert(兰伯特)投影 应用工具_全息投影技术,在哪些场地可以用到

    全息投影技术,也称为虚拟成像技术,应该是大家都熟悉的.它不仅能产生立体的空中视觉,还能使视觉与人互动,产生震撼的效果.它有广泛的应用场景,可以根据不同的应用环境灵活改变,新起典给你介绍全息投影技术在哪 ...

  4. Shader学习2——兰伯特

    本以为写个兰伯特很简单,但是仔细考虑了一下,不光要受场景中光源影响,还需要受环境光影响,然后发现单个pass通道只能实现单光源.因此前期我们都只考虑单平行光. 兰伯特:漫反射颜色 = 光源颜色 x 材 ...

  5. Shader学习3——半兰伯特

    半兰伯特其实就是把暗的地方提亮了一些,在数值上就是获取到的光源强度* 0.5 + 0.5,也就是原来是0的会变成0.5,原来是1的还是1. 半兰伯特:漫反射颜色 = 光源颜色 x 材质的漫反射颜色 x ...

  6. 【Unity Shader】(2)半兰伯特模型 构建光照

    在unity的Shader中使用半兰伯特模型来构建光照 在认识半兰伯特模型之前,建议查看一下我之前的兰伯特模型构建光照 兰伯特光照模型 半兰伯特光照模型 由于兰伯特模型的计算公式仅截取了[0,1]的光 ...

  7. Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...

  8. Lambert (兰伯特)光照模型

    Lambert (兰伯特)光照模型 是光源照射到物体表面后,向四面八方反射,产生的漫反射效果.这是一种理想的漫反射光照模型.如下图:这个是顶点函数处理后的该光照模型,因此看起来像素不够平滑. 漫反射 ...

  9. 兰伯特(Lambert)方程的求解算法1

    本文针对兰伯特方程给出具体的算法,并不打算给出详细的过程.各位读者可参照此算法及相应的代码进行编程计算. 介绍 见下图,仅考虑中心天体C的万有引力,飞行器从P1P_1P1​点飞行到P2P_2P2​点, ...

最新文章

  1. 上海浦发银行总行信息科技部大数据专家陈春宝:大数据与机器学习重塑零售银行业务...
  2. 开发一个简单的工具,导出github仓库所有issue列表
  3. Asp.Net Core 2.1+的视图缓存(响应缓存)
  4. reload vue 重新加载_vue面试,谈下router拦截
  5. c++与unreal 的uc脚本交互
  6. IDEA中Maven项目导入依赖包,出现红线波浪线
  7. 【分布式架构】企业级分布式应用服务EDAS使用攻略(上篇)
  8. 《程序员代码面试指南》第一章:栈与队列
  9. 基于java的药品库房管理系统
  10. ZOJ 3551 Bloodsucker 题解
  11. POJ-2632:Crashing Robots(C++实现详细代码)
  12. juqery addClass方法失效问题
  13. 肠道重要菌属——另枝菌属(Alistipes),调节炎症情绪等的潜力菌
  14. 所有域名都需要实名认证吗?域名实名认证有什么好处?
  15. “一键GHOST”傻瓜式系统备份与恢复
  16. sqlplus报错ORA-12547: TNS:lost contact解决
  17. java中Scanner,Randon,ArrayList
  18. 智能照明控制系统在城市夜景照明工程中的应用
  19. linux常用的简单命令(三)tar、scp、df/du、ps、free、top、netstat、tcpdump、kill、reboot/halt/poweroff、shutdown
  20. 【Origin双y轴】三条曲线,其中两条曲线共用一个y轴

热门文章

  1. 从零开始写一个小米便签
  2. 原理+实战|7天带你学会GAN,生活从此乐无限
  3. rsa加解密 --- jsencrypt.min.js --- 支持长字符串分段加解密
  4. Spring Boot入门教程(四十六): @Async
  5. php实用吗,php实用小窍门
  6. 【git生成私钥】git@gitlab.dfc.com: Permission denied (publickey).问题解决
  7. 姜数学模型——包饺子案例
  8. 拿什么来保障程序员的工作?
  9. java ftp 被动模式_ftp 主动模式与被动模式
  10. canvas绘图工具