﻿// 坐標轉換函數 created by GEO Informatics

function Transform67XY(x,y){
    var CS_TM97 = {rad:6378137,fla:1/298.257222101,org:121,sca:0.9999,fal:250000.0};
    x=x+828;
    y=y-207;
    var ak=2*CS_TM97.fla-CS_TM97.fla*CS_TM97.fla;
	var dj=ak/(1-ak);
	var fs=y/CS_TM97.sca;
	var ec=fs/(CS_TM97.rad*(1-ak/4-3*ak*ak/64-5*ak*ak*ak/256));
	var ej=(1-Math.sqrt(1-ak))/(1+Math.sqrt(1-ak));
	var cq=ec+(3*ej/2-27*Math.pow(ej,3)/32)*Math.sin(2*ec)+(21*ej*ej/16-55*Math.pow(ej,4)/32)*Math.sin(4*ec)+151*Math.pow(ej,3)/96*Math.sin(6*ec)+1097*Math.pow(ej,4)/512*Math.sin(8*ec);
	var fo=CS_TM97.rad/Math.sqrt(1-ak*Math.pow(Math.sin(cq),2));
	var fn=CS_TM97.rad*(1-ak)/Math.pow(1-ak*Math.pow(Math.sin(cq),2),1.5);
	var eb=Math.pow(Math.tan(cq),2);
	var dt=dj*Math.pow(Math.cos(cq),2);
	var ex=(x-CS_TM97.fal)/(fo*CS_TM97.sca);
	var di=CS_TM97.org/180*Math.PI+(ex-(1+2*eb+dt)*ex*ex*ex/6+(5-2*dt+28*eb-3*dt*dt+8*dj+24*eb*eb)*Math.pow(ex,5)/120)/Math.cos(cq);
	var dh=cq-(fo*Math.tan(cq)/fn)*(ex*ex/2-(5+3*eb+10*dt-4*dt*dt-9*dj)*Math.pow(ex,4)/24+(61+90*eb+298*dt+45*eb*eb-252*dj-3*dt*dt)*Math.pow(ex,6)/720);
	di=di/Math.PI*180;
	dh=dh/Math.PI*180;    
    return [di,dh];
}

function Transform97XY(x,y){
    var CS_TM97 = {rad:6378137,fla:1/298.257222101,org:121,sca:0.9999,fal:250000.0};   
    var ak=2*CS_TM97.fla-CS_TM97.fla*CS_TM97.fla;
	var dj=ak/(1-ak);
	var fs=y/CS_TM97.sca;
	var ec=fs/(CS_TM97.rad*(1-ak/4-3*ak*ak/64-5*ak*ak*ak/256));
	var ej=(1-Math.sqrt(1-ak))/(1+Math.sqrt(1-ak));
	var cq=ec+(3*ej/2-27*Math.pow(ej,3)/32)*Math.sin(2*ec)+(21*ej*ej/16-55*Math.pow(ej,4)/32)*Math.sin(4*ec)+151*Math.pow(ej,3)/96*Math.sin(6*ec)+1097*Math.pow(ej,4)/512*Math.sin(8*ec);
	var fo=CS_TM97.rad/Math.sqrt(1-ak*Math.pow(Math.sin(cq),2));
	var fn=CS_TM97.rad*(1-ak)/Math.pow(1-ak*Math.pow(Math.sin(cq),2),1.5);
	var eb=Math.pow(Math.tan(cq),2);
	var dt=dj*Math.pow(Math.cos(cq),2);
	var ex=(x-CS_TM97.fal)/(fo*CS_TM97.sca);
	var di=CS_TM97.org/180*Math.PI+(ex-(1+2*eb+dt)*ex*ex*ex/6+(5-2*dt+28*eb-3*dt*dt+8*dj+24*eb*eb)*Math.pow(ex,5)/120)/Math.cos(cq);
	var dh=cq-(fo*Math.tan(cq)/fn)*(ex*ex/2-(5+3*eb+10*dt-4*dt*dt-9*dj)*Math.pow(ex,4)/24+(61+90*eb+298*dt+45*eb*eb-252*dj-3*dt*dt)*Math.pow(ex,6)/720);
	di=di/Math.PI*180;
	dh=dh/Math.PI*180;    
    return [di,dh];
}

function WGSto67(x,y){
    var CS_TM97 = {rad:6378137,fla:1/298.257222101,org:121,sca:0.9999,fal:250000.0};
    x=x/180 * Math.PI;
    y=y/180 * Math.PI;
    var ak=2*CS_TM97.fla-CS_TM97.fla*CS_TM97.fla;
    var dj=ak/(1-ak);
    var fa=Math.pow(Math.tan(y),2);
    var fh=ak*Math.pow(Math.cos(y),2)/(1-ak);
    var ew=(x-CS_TM97.org/180*Math.PI)*Math.cos(y);
    var ft=CS_TM97.rad/Math.sqrt(1-ak*Math.pow(Math.sin(y),2));
    var fu=CS_TM97.rad*((1-ak/4-3*ak*ak/64-5*ak*ak*ak/256)*y-(3*ak/8+3*ak*ak/32+45*ak*ak*ak/1024)*Math.sin(2*y)+(15*ak*ak/256+45*ak*ak*ak/1024)*Math.sin(4*y)-(35*ak*ak*ak/3072)*Math.sin(6*y));
    x=CS_TM97.fal+CS_TM97.sca*ft*(ew+(1-fa+fh)*ew*ew*ew/6+(5-18*fa+fa*fa+72*fh-58*dj)*Math.pow(ew,5)/120);
    y=CS_TM97.sca*(fu+ft*Math.tan(y)*(ew*ew/2+(5-fa+9*fh+4*fh*fh)*Math.pow(ew,4)/24+(61-58*fa+fa*fa+600*fh-330*dj)*Math.pow(ew,6)/720));
    return [x-828,y+207];
}

function WGSto97(x,y){
    var CS_TM97 = {rad:6378137,fla:1/298.257222101,org:121,sca:0.9999,fal:250000.0};
    x=x/180 * Math.PI;
    y=y/180 * Math.PI;
    var ak=2*CS_TM97.fla-CS_TM97.fla*CS_TM97.fla;
    var dj=ak/(1-ak);
    var fa=Math.pow(Math.tan(y),2);
    var fh=ak*Math.pow(Math.cos(y),2)/(1-ak);
    var ew=(x-CS_TM97.org/180*Math.PI)*Math.cos(y);
    var ft=CS_TM97.rad/Math.sqrt(1-ak*Math.pow(Math.sin(y),2));
    var fu=CS_TM97.rad*((1-ak/4-3*ak*ak/64-5*ak*ak*ak/256)*y-(3*ak/8+3*ak*ak/32+45*ak*ak*ak/1024)*Math.sin(2*y)+(15*ak*ak/256+45*ak*ak*ak/1024)*Math.sin(4*y)-(35*ak*ak*ak/3072)*Math.sin(6*y));
    x=CS_TM97.fal+CS_TM97.sca*ft*(ew+(1-fa+fh)*ew*ew*ew/6+(5-18*fa+fa*fa+72*fh-58*dj)*Math.pow(ew,5)/120);
    y=CS_TM97.sca*(fu+ft*Math.tan(y)*(ew*ew/2+(5-fa+9*fh+4*fh*fh)*Math.pow(ew,4)/24+(61-58*fa+fa*fa+600*fh-330*dj)*Math.pow(ew,6)/720));
    return [x,y];
}