jar 坐标系转换工具_Proj4js中lcc和wgs84坐标转换

这篇博客介绍了如何利用Proj4js库中的lccToWgs84函数进行经纬度坐标转换。文章提供了一个简化版的坐标转换源码,包括坐标系定义、转换公式和初始化过程,适用于需要快速高效处理大量lcc和wgs84坐标转换的场景。
摘要由CSDN通过智能技术生成

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

};

}();`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值