//坐标正算
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.