北京54坐标和经纬度坐标转换算法(C++)

//坐标正算
lbxy(double l, double b, double *x, double *y, int l0)
{
 double sa,sb,sep,sn,sy2,st,sm,sx,hb;
 double xx,yy,hd,sd;

 //判断值的范围
 if (l > 360 || l < 0 || b > 360 || b < 0)
 {
  *x = l;
  *y = b;
  return;
 }

 l  = l-l0;
 sa = 6378245;  
 sb = 6356863.019;
 sep= 0.006738525415;
 hd = b*PI;
 hb = hd/180.0;
 st = tan(hb);
      
 sn=pow(sa,(double)2)/sqrt(pow(sa,(double)2)*pow(cos(hb),(double)2)
  +pow(sb,(double)2)*pow(sin(hb),(double)2));

 sy2=sep*pow(cos(hb),(double)2);
 sd = cos(hb)*l*PI;
 sm = sd/180.0;
 sx = 111134.861*b-(32005.78*sin(hb)+133.924*pow(sin(hb),(double)3)+0.697*pow(sin(hb),(double)5))*cos(hb);
 xx = sx+sn*st*(0.5*pow(sm,(double)2)+1.0/24.0*(5.0-pow(st,(double)2)+9.0*sy2)*pow(sm,(double)4));
 yy = sn*(sm+1.0/6.0*(1.0-pow(st,(double)2)+sy2)*pow(sm,(double)3)+1.0/120.0*(5.0-18.0*pow(st,(double)2)+pow(st,(double)4))*pow(sm,(double)5));
 *x = xx;
 *y = yy+500000;
}

//坐标反算
xylb(double l0, double x, double y, double *l, double *b)
{
 double bf,vf,nf,ynf,tf,yf2,hbf;
 double sa,sb,se2,sep2,mf;
 double w1,w2,w,w3,w4;
 double pi = 3.1415926;

 x = x/1000000.0;
 y = y - 500000.0;
 
 bf = 9.04353692458*x-0.00001007623*pow(x,2.0)-0.00074438304*pow(x,3.0)-0.00000463064*pow(x,4.0)+0.00000505846*pow(x,5.0)-0.00000016754*pow(x,6.0);
 hbf = bf * pi/ 180.0;
 sa = 6378245.0;
 sb = 6356863.019;
 se2 = 0.006693421623;
 sep2 = 0.006738525415;

 w1 = sin(hbf);
 w2 = 1.0 - se2 * pow(w1,(double)2);
 w = sqrt(w2);
 mf = sa*(1.0-se2)/pow(w,(double)3);
 w3 = cos(hbf);

 w4 = pow(sa,(double)2)*pow(w3,(double)2) + pow(sb,(double)2)*pow(w1,(double)2);
 nf = pow(sa,(double)2) / sqrt(w4);

 ynf = y/nf;
 vf = nf/mf;
 tf = tan(hbf);
 
 yf2 = sep2 * pow(w3, (double)2);

 *b = bf - 1.0/2.0 * vf * tf * (pow(ynf,(double)2)-1.0/12.0*(5.0+3.0*pow(tf,(double)2)+yf2-9.0*yf2*pow(tf,(double)2))*pow(ynf,(double)4))*180.0/pi;
 *l = 1.0/w3*ynf*(1.0-1.0/6.0*(1.0+2.0*pow(tf,(double)2)+yf2)*pow(ynf,(double)2)+1.0/120.0*(5.0+28.0*pow(tf,(double)2)+24.0*pow(tf,(double)2)+6.0*yf2+8.0*yf2*pow(tf,(double)2))*pow(ynf,(double)4))*180.0/pi;
 *l = l0 + *l;
}

 

delphi:

 

unit   Unit10;  
  interface  
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls,   Buttons,   ExtCtrls;  
  type  
      TForm10   =   class(TForm)  
          RadioGroup1:   TRadioGroup;  
          GroupBox1:   TGroupBox;  
          Label1:   TLabel;  
          Label2:   TLabel;  
          Label3:   TLabel;  
          Label4:   TLabel;  
          Label5:   TLabel;  
          Label6:   TLabel;  
          Label7:   TLabel;  
          Label8:   TLabel;  
          Label9:   TLabel;  
          Label10:   TLabel;  
          Label11:   TLabel;  
          Label12:   TLabel;  
          Edit1:   TEdit;  
          Edit2:   TEdit;  
          Edit3:   TEdit;  
          Edit4:   TEdit;  
          Edit5:   TEdit;  
          Edit6:   TEdit;  
          Edit7:   TEdit;  
          Edit8:   TEdit;  
          Edit9:   TEdit;  
          Edit10:   TEdit;  
          Button1:   TButton;  
          Button2:   TButton;  
          Button3:   TButton;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   FormShow(Sender:   TObject);  
          procedure   RadioGroup1Click(Sender:   TObject);  
          function   fc(data1:double;cs:integer):double;  
          procedure   calsub1();  
          procedure   calsub2();  
          procedure   calsub3();  
          procedure   calsub4();  
          procedure   calsub5(xzid:integer);  
          procedure   Button2Click(Sender:   TObject);  
          procedure   Button3Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
  var  
      Form10:   TForm10;  
      ///全局变量  
  var   x,y,bb,w:double;  
  var   x1,b,p,p1,p2,t,f,n,p3,p4,p5,m:double;  
  var   x2,yyy,p6:double;  
  var   k,l1,l2,l3,b1,b2,b3,xs,ks,ys,kk:double;  
  var   jh,xzb,kzb,yzb,l1zb,l2zb,l3zb,b1zb,b2zb,b3zb:string;  
  //  
  implementation  
  {$R   *.DFM}  
  function   TForm10.fc(data1:double;cs:integer):double;  
  var   i:integer;  
          fhz:double;  
  begin  
      //计算方次(乘方)  
        fhz:=1.0;  
        for   i:=1   to   cs   do  
            fhz:=fhz*data1;  
        fc:=fhz;  
  end;  
  procedure   TForm10.calsub1();  
  begin  
  //sub1  
        x1:=111134.8611*b-16036.4803*sin(2*b*bb);  
        x1:=x1+16.8281*sin(4*b*bb);  
        x1:=x1-0.022*sin(6*b*bb);  
        x1:=x1+0.00003*sin(8*b*bb);  
  end;  
  procedure   TForm10.calsub2();  
  begin  
  //sub2  
        p:=1/180*3.1415926;  
        p1:=n*sin(b*bb)*cos(b*bb)*p*p/2;  
        p2:=(5-t*t+9*f+4*sqr(f))*n*sqr(p)*sqr(p)*sin(b*bb)*(cos(b*bb)*sqr(cos(b*bb)))/24;  
        p3:=(61-58*fc(t,6))*n*fc(p,6)*sin(b*bb)*fc(cos(b*bb),5)/720;  
        p4:=n*cos(b*bb)*p+(1-sqr(t)+f)*n*fc(cos(b*bb),3)*fc(p,3)/6;  
        p5:=(5-18*sqr(t)+fc(t,4)+14*f-58*sqr(t)*f)*n*fc(cos(b*bb),5)*fc(p,5)/120;  
  end;  
  procedure   TForm10.calsub3();  
  begin  
  //sub3  
        w:=sqrt(1-0.006693421623*sqr(sin(b*bb)));  
        m:=6378245*0.9933065784/fc(w,3);  
  end;  
  procedure   TForm10.calsub4();  
  begin  
  //sub4  
        n:=6378245/w;  
        f:=0.006738524515*sqr(cos(b*bb));  
        t:=sin(b*bb)/cos(b*bb);  
  end;  
  procedure   TForm10.calsub5(xzid:integer);  
  var   l,lb,zz:single;  
  begin  
  //sub5  
      bb:=3.1415926/180;  
      if   xzid=3   then             //由经纬度计算三、六带坐标  
          begin  
              b:=b1+b2/60+b3/3600;  
              l:=l1+l2/60+l3/3600;  
              if   l<0   then  
                  l:=l+3  
              else  
                  l:=l-3;  
              calsub1;  
              calsub3;  
              calsub4;  
              calsub2;  
              x:=x1+p1+p2+p3;  
              y:=p4+p5+500000;  
              xs:=int(x*100+0.5)/100;  
              ks:=int((l1+3)/6+0.5);  
              ys:=int(y*100+0.5)/100;  
              kk:=int(l1/3+0.5);  
            end;  
      if   (xzid=1)   or   (xzid=2)   then         //由三、六带坐标计算   经纬度  
          begin  
              xs:=x;  
              ks:=k;  
              ys:=y;  
          end;  
      y:=y-500000;  
      b:=x/111134.8611;  
      calsub1;  
      x2:=x-x1;  
      b1:=b;  
      while   abs(x2)>=0.001   do  
      begin  
          calsub3;  
          b:=b+x2*(180/3.1415926)/m;  
          calsub1;     //调用calsub1后,返回x1的值  
          x2:=x-x1;  
          b1:=b;  
      end;  
      calsub4;       //调用calsub4后,返回n,f,t的值  
      p1:=t*sqr(y)/(m*n*2);  
      p2:=(5+3*sqr(t)+f-9*f*sqr(t))*t*fc(y,4)/(24*m*fc(n,3));  
      yyy:=fc(y,6)/(720*m*fc(n,5));  
      p3:=(61+90*sqr(t)+45*fc(t,4))*t*yyy;  
      p4:=y/(n*cos(b*bb));  
      p5:=(1+2*sqr(t)+f)*fc(y,3)/(6*fc(n,3)*cos(b*bb));  
      p6:=(5+28*sqr(t)+2*4*fc(t,4)+6*f+8*f*sqr(t))*fc(y,5)/(120*fc(n,5)*cos(b*bb));  
      b:=b1-(p1-p2+p3)*180/3.1415926;  
      l:=(p4-p5+p6)*180/3.1415926;  
      zz:=l;  
      if   l>0   then  
            l:=l-3  
      else  
            l:=l+3;  
      calsub1;  
      calsub3;  
      calsub4;  
      calsub2;  
      x:=int((x1+p1+p2+p3)*100+0.5)/100;  
      y:=int((p4+p5+500000)*100+0.5)/100;  
      if   (xzid=1)   or   (xzid=2)   then  
      begin  
            l1:=int(l);  
            b1:=int(b);  
            lb:=(l-l1)*60;  
            bb:=(b-b1)*60;  
            l2:=int(lb);  
            b2:=int(bb);  
            l3:=(lb-l2)*60;  
            b3:=(bb-b2)*60;  
            l3:=int(l3*100+0.5)/100;  
            b3:=int(b3*100+0.5)/100;  
            if   (xzid=1)   and   (zz<0)   then  
                  l1:=l1+(k-1)*3;  
            if   (xzid=1)   and   (zz>=0)   then  
                  l1:=l1+(k+1)*3;  
            if   (xzid=2)   and   (zz<0)   then  
                  l1:=l1+(k-1)*6;  
            if   (xzid=2)   and   (zz>=0)   then  
                  l1:=l1+(k)*6;  
            if   xzid=1   then  
                  kk:=int((l1+3)/6+0.5);  
            if   xzid=2   then  
                  kk:=int(l1/3+0.5);  
      end;  
  end;  

 

procedure   TForm10.Button1Click(Sender:   TObject);  
  //var   a1,a2,a3:integer;  
  begin  
  //计算  
    case     radiogroup1.ItemIndex     of  
        0:     begin  
                //   input  
                      xzb:=trim(edit1.Text);  
                      kzb:=copy(trim(edit2.Text),1,2);  
                      yzb:=copy(trim(edit2.Text),3,length(trim(edit2.Text))-2);  
                      x:=strtofloat(xzb);  
                      y:=strtofloat(yzb);  
                      k:=strtofloat(kzb);  
   
          //calculate  
                      calsub5(1);       //三度带时,调用calsub5过程  
   
            //   output  
                      edit3.Text:=floattostr(x);  
                      edit4.Text:=trim(floattostr(kk))+floattostr(y);  
                      edit5.Text:=floattostr(l1);     //经度的度  
                      edit6.Text:=floattostr(l2);     //经度的分  
                      edit7.Text:=floattostr(l3);     //经度的秒  
                      edit8.Text:=floattostr(b1);     //纬度的度  
                      edit9.Text:=floattostr(b2);     //纬度的分  
                      edit10.Text:=floattostr(b3);   //纬度的秒  
                end;  
        1:     begin  
                      xzb:=trim(edit3.Text);  
                      kzb:=copy(trim(edit4.Text),1,2);  
                      yzb:=copy(trim(edit4.Text),3,length(trim(edit4.Text))-2);  
                      x:=strtofloat(xzb);  
                      y:=strtofloat(yzb);  
                      k:=strtofloat(kzb);  
        //calculate  
                      calsub5(2);     //六度带时,调用calsub5  
   
            //   output  
                      edit1.Text:=floattostr(x);  
                      edit2.Text:=trim(floattostr(kk))+floattostr(y);  
                      edit5.Text:=floattostr(l1);       //经度的度  
                      edit6.Text:=floattostr(l2);       //经度的分  
                      edit7.Text:=floattostr(l3);       //经度的秒  
                      edit8.Text:=floattostr(b1);       //纬度的度  
                      edit9.Text:=floattostr(b2);       //纬度的分  
                      edit10.Text:=floattostr(b3);     //纬度的秒  
                end;  
        2:     begin  
                      l1zb:=trim(edit5.Text);  
                      l2zb:=trim(edit6.Text);  
                      l3zb:=trim(edit7.Text);  
                      b1zb:=trim(edit8.Text);  
                      b2zb:=trim(edit9.Text);  
                      b3zb:=trim(edit10.Text);  
                      l1:=strtoint(l1zb);  
                      l2:=strtoint(l2zb);  
                      l3:=strtoint(l3zb);  
                      b1:=strtoint(b1zb);  
                      b2:=strtoint(b2zb);  
                      b3:=strtoint(b3zb);  
            //calculute  
                      calsub5(3);  
            //   output  
                      edit1.Text:=floattostr(x);  
                      edit2.Text:=trim(floattostr(kk))+floattostr(y);  
                      edit3.Text:=floattostr(xs);  
                      edit4.Text:=trim(floattostr(ks))+floattostr(ys);  
                end;  
    end;  
  end;  
  procedure   TForm10.FormShow(Sender:   TObject);  
  begin  
  //初始化  
      radiogroup1.ItemIndex:=0;  
      edit1.Text:='';  
      edit2.Text:='';  
      edit3.Text:='';  
      edit4.Text:='';  
      edit5.Text:='';  
      edit6.Text:='';  
      edit7.Text:='';  
      edit8.Text:='';  
      edit9.Text:='';  
      edit10.Text:='';  
      edit1.Enabled:=true;  
      edit2.Enabled:=true;  
      edit3.Enabled:=false;  
      edit4.Enabled:=false;  
      edit5.Enabled:=false;  
      edit6.Enabled:=false;  
      edit7.Enabled:=false;  
      edit8.Enabled:=false;  
      edit9.Enabled:=false;  
      edit10.Enabled:=false;  
      edit1.SetFocus;  
  end;  
  procedure   TForm10.RadioGroup1Click(Sender:   TObject);  
  begin  
  //选择项  
        case   radiogroup1.ItemIndex   of  
              0:   begin  
                        edit1.Text:='';  
                        edit2.Text:='';  
                        edit3.Text:='';  
                        edit4.Text:='';  
                        edit5.Text:='';  
                        edit6.Text:='';  
                        edit7.Text:='';  
                        edit8.Text:='';  
                        edit9.Text:='';  
                        edit10.Text:='';  
   
                        edit1.Enabled:=true;  
                        edit2.Enabled:=true;  
   
                        edit3.Enabled:=false;  
                        edit4.Enabled:=false;  
                        edit5.Enabled:=false;  
                        edit6.Enabled:=false;  
                        edit7.Enabled:=false;  
                        edit8.Enabled:=false;  
                        edit9.Enabled:=false;  
                        edit10.Enabled:=false;  
                        edit1.SetFocus;  
                    end;  
              1:   begin  
                        edit1.Text:='';  
                        edit2.Text:='';  
                        edit3.Text:='';  
                        edit4.Text:='';  
                        edit5.Text:='';  
                        edit6.Text:='';  
                        edit7.Text:='';  
                        edit8.Text:='';  
                        edit9.Text:='';  
                        edit10.Text:='';  
                        edit3.Enabled:=true;  
                        edit4.Enabled:=true;  
                        edit1.Enabled:=false;  
                        edit2.Enabled:=false;  
                        edit5.Enabled:=false;  
                        edit6.Enabled:=false;  
                        edit7.Enabled:=false;  
                        edit8.Enabled:=false;  
                        edit9.Enabled:=false;  
                        edit10.Enabled:=false;  
                        edit3.SetFocus;  
                    end;  
              2:   begin  
                        edit1.Text:='';  
                        edit2.Text:='';  
                        edit3.Text:='';  
                        edit4.Text:='';  
                        edit5.Text:='';  
                        edit6.Text:='';  
                        edit7.Text:='';  
                        edit8.Text:='';  
                        edit9.Text:='';  
                        edit10.Text:='';  
   
                        edit1.Enabled:=false;  
                        edit2.Enabled:=false;  
                        edit3.Enabled:=false;  
                        edit4.Enabled:=false;  
   
                        edit5.Enabled:=true;  
                        edit6.Enabled:=true;  
                        edit7.Enabled:=true;  
                        edit8.Enabled:=true;  
                        edit9.Enabled:=true;  
                        edit10.Enabled:=true;  
                        edit5.SetFocus;  
                    end;  
        end;  
  end;  
   
  procedure   TForm10.Button2Click(Sender:   TObject);  
  begin  
    close;  
  end;  
  procedure   Tform10.Button3Click(Sender:   TObject);  
  begin  
      edit1.Text:='';  
      edit2.Text:='';  
      edit3.Text:='';  
      edit4.Text:='';  
      edit5.Text:='';  
      edit6.Text:='';  
      edit7.Text:='';  
      edit8.Text:='';  
      edit9.Text:='';  
      edit10.Text:='';  
      case   radiogroup1.ItemIndex   of  
          0:   edit1.SetFocus;  
          1:   edit3.SetFocus;  
          2:   edit5.SetFocus;  
      end;  
  end;  
  end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值