`

高斯坐标经纬度互相转换算法(Delphi)

阅读更多
  这个程序是根据网上找到的VC代码改写而成的Delphi库单元,经验算,比较准确,支持西安80及北京54。
  本人原创,转载请保留本人信息。http://wallimn.iteye.com
  代码及使用方法如下(javaeye的博客代码高亮竟然不支持delphi,抗议):

unit Translate;
{
经纬度坐标与高斯-克吕格投影坐标的互算。
时间:2009-05-11
博客:http://wallimn.iteye.com
转载请保留此信息
}
interface

uses Math;
type
TTranslate = class(TObject)
protected
a,f,e2,e12:double;
A1,A2,A3,A4:double;
private
L0:double; // 中央子午线经度
public
procedure BL2xy(B,L :double; var x,y :double);
procedure xy2BL(x,y :double; var B,L :double);
procedure SetL0(dL0:double);
end;

TTranslate_Krasovsky = class(TTranslate)
public
    constructor Create;
end;

TTranslate_IUGG1975=class(TTranslate)
public
    constructor Create;
end;

function Dms2Rad( Dms:double) : double ;
function Rad2Dms( Rad:double)  : double  ;

implementation
{
将度、分、秒形式转化成弧度
}
function Dms2Rad( Dms:double) : double ;
var
  Degree,Miniute,Second:Double;
  Rad:Double;
  Sign:Integer;
begin
if(Dms >= 0) then
Sign := 1
else
Sign := -1;
Dms := abs(Dms);
Degree := floor(Dms);
Miniute := floor(Dms * 100) mod 100;
Second := floor(Dms * 10000) mod 100;
Rad := Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 180.0;
result:= Rad;
end;
{
将弧度转换成度、分、秒表示形式;
转换的结果是度,
}
function Rad2Dms( Rad:double)  : double  ;
var
  Degree, Miniute, Second:double;
  Sign:integer;
begin
if(Rad >= 0)     then
Sign := 1
else
Sign := -1;
Rad := abs(Rad * 180.0 / PI);
Degree := floor(Rad);
Miniute := floor(Rad * 60) mod 60;
Second := floor(Rad * 3600) mod 60;
Result := Sign * (Degree + Miniute / 100.0 + Second / 10000.0);
  //Result:=Rad * 180/PI;
end;
{ TTranslate }
{
B,L 为以度为单位的纬度及经度
x,y 为转换结果,即投影坐标,其中y不带带号
时间:2009-05-11
博客:http://wallimn.iteye.com
}
procedure TTranslate.BL2xy(B, L: double; var x, y: double);
var
  XX, N, t, t2, m, m2, ng2:double;
  sinB, cosB:double;
begin
  B:= B*PI/180.0;
  L:= L*PI/180.0;
XX := A1 * B * 180.0 / PI + A2 * sin(2 * B) + A3 * sin(4 * B) + A4 * sin(6 * B);
sinB := sin(B);
cosB := cos(B);
t := tan(B);
t2 := t * t;
N := a / sqrt(1 - e2 * sinB * sinB);
m := cosB * (L - L0);
m2 := m * m;
ng2 := cosB * cosB * e2 / (1 - e2);
//x,y的计算公式见孔祥元等主编武汉大学出版社2002年出版的《控制测量学》
x := XX + N * t * ((0.5 + ((5 - t2 + 9 * ng2 + 4 * ng2 * ng2) / 24.0 + (61 -
58 * t2 + t2 * t2) * m2 / 720.0) * m2) * m2);
y := N * m * ( 1 + m2 * ( (1 - t2 + ng2) / 6.0 + m2 * ( 5 - 18 * t2 + t2 * t2
+ 14 * ng2 - 58 * ng2 * t2 ) / 120.0));
y := y + 500000;
end;

{
设置中央子午线的经度,以度为单位
}
procedure TTranslate.SetL0(dL0: double);
begin
  //L0:= Dms2Rad(dL0);
  L0:=dL0*PI/180.0;
end;
{
x,y 投影坐标,其中y不带带号
B,L 为转换结果,以度为单位的纬度及经度
时间:2009-05-11
博客:http://wallimn.iteye.com
}

procedure TTranslate.xy2BL(x, y: double; var B, L: double);
var
  sinB, cosB, t, t2, N ,ng2, V, yN:double;
  preB0, B0:double;
  eta:double;
begin
y := y- 500000;
B0 := x / A1;
repeat
begin
preB0 := B0;
B0 := B0 * PI / 180.0;
B0 := (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0))) / A1;
eta := abs(B0 - preB0);
end
  until(eta <= 0.000000001);
B0 := B0 * PI / 180.0;
B := Rad2Dms(B0);
sinB := sin(B0);
cosB := cos(B0);
t := tan(B0);
t2 := t * t;
N := a / sqrt(1 - e2 * sinB * sinB);
ng2 := cosB * cosB * e2 / (1 - e2);
V := sqrt(1 + ng2);
yN := y / N;
B := B0 - (yN * yN - (5 + 3 * t2 + ng2 - 9 * ng2 * t2) * yN * yN * yN * yN /
12.0 + (61 + 90 * t2 + 45 * t2 * t2) * yN * yN * yN * yN * yN * yN / 360.0)
* V * V * t / 2;
L := L0 + (yN - (1 + 2 * t2 + ng2) * yN * yN * yN / 6.0 + (5 + 28 * t2 + 24
* t2 * t2 + 6 * ng2 + 8 * ng2 * t2) * yN * yN * yN * yN * yN / 120.0) / cosB;

  //B:=Rad2Dms(B);
  //L:=Rad2Dms(L);
  B:=B*180.0/PI;
  L:=L*180.0/PI;
end;

{ TTranslate_Krasovsky }

constructor TTranslate_Krasovsky.Create;
begin
a := 6378245;
f := 298.3;
e2 := 1 - ((f - 1) / f) * ((f - 1) / f);
e12 := (f / (f - 1)) * (f / (f - 1)) - 1;
A1 := 111134.8611;
A2 := -16036.4803;
A3 := 16.8281;
A4 := -0.0220;
end;

{ TTranslate_IUGG1975 }

constructor TTranslate_IUGG1975.Create;
begin
a := 6378140;
f := 298.257;
e2 := 1 - ((f - 1) / f) * ((f - 1) / f);
e12 := (f / (f - 1)) * (f / (f - 1)) - 1;
A1 := 111133.0047;  //这几个A是什么意思?
A2 := -16038.5282;
A3 := 16.8326;
A4 := -0.0220;
end;
{
引用此库单元,具体使用方法如下:
procedure TFrmMain.Button1Click(Sender: TObject);
var
t:TTranslate;
L,B:Double;
begin
t :=TTranslate_IUGG1975.create;
t.SetL0(111);
t.xy2BL(strToFloat(edtX.text),strToFloat(edtY.text),L,B);
showmessage('L='+FloatToStr(L)+' B='+FloatToStr(B));
//运行结果:L=20,B=109.15
end;

}
end.

注:我的网络硬盘(http://wallimn.ys168.com)上放了这个转换工具,需要的请自行下载
1
0
分享到:
评论

相关推荐

    高斯坐标转换,高斯坐标转换经纬度,Visual Basic

    高斯坐标系统是一种在中国广泛使用的投影方法,它将地球表面的经纬度转换为二维平面坐标,分为多个六度带,每个带内使用不同的参数进行转换。 高斯正反算是指高斯投影坐标到经纬度的转换过程,以及经纬度到高斯坐标...

    高斯,经纬度与平面坐标系坐标转换

    4. **高斯-克吕格公式**:使用特定的数学公式将经纬度转换为高斯平面坐标。公式包括中央子午线的投影长度因子、赤道的投影长度因子以及偏移量的计算。 5. **反转换**:如果你已经有一个平面坐标,并想要找到对应的...

    高斯坐标转换,高斯坐标转换经纬度,Visual Basic源码.zip

    - 转换模块:执行高斯坐标到经纬度或经纬度到高斯坐标的转换,使用上述的数学公式。 - 输出模块:显示或保存转换后的结果。 在分析和使用这个Visual Basic源码时,确保理解每个函数和变量的作用,以及它们如何协同...

    经纬度与高斯坐标及经纬度与UTM坐标互转

    高斯坐标到经纬度转换**: - 反向执行上述步骤,从X、Y坐标反解出经度和纬度,这通常涉及到非线性方程组的求解。 **3. 经纬度到UTM坐标转换**: - 同样先确定UTM带号,然后应用横轴墨卡托投影公式,包括地球半径...

    基于C++的高斯坐标系下经纬度与大地坐标转换程序

    1. 将经纬度转换为大地坐标:通过使用大地坐标系的参数,如长半轴和扁平率,计算出对应的X和Y坐标。 2. 高斯投影:利用高斯-克吕格投影公式,将大地坐标转换为平面直角坐标,保持比例尺尽可能一致。 3. 带号和偏移...

    3种不同基准面下的高斯坐标和经纬度坐标互相转换

    本文将深入探讨三种不同基准面下的高斯坐标与经纬度坐标之间的转换方法。高斯坐标系统是一种用于平面坐标表示的数学体系,通常用于大地测量和地图制作,而经纬度坐标则是地球表面位置的标准表示方式,基于球面或椭...

    大地坐标与经纬度坐标转换

    - **墨卡托投影**:一种常用的等角投影方法,可以将经纬度转换为直角坐标。它保持了角度的准确性,但会产生面积变形。 - **UTM(Universal Transverse Mercator)投影**:全球分为60个带,每个带使用单独的墨卡托...

    54坐标转80坐标,及经纬度与高斯坐标间的转换

    本篇文章将详细讲解"54坐标转80坐标"以及"经纬度与高斯坐标间的转换"这两个核心知识点。 首先,我们要理解54坐标系统和80坐标系统。在中国,54坐标系统指的是1954年北京坐标系,它是基于苏联1942年普尔科沃大地坐标...

    高斯坐标转换,高斯坐标转换经纬度,Visual Basic源码.rar

    这里提到的"高斯坐标转换,高斯坐标转换经纬度,Visual Basic源码"是指使用Visual Basic编程语言实现的一种程序,用于进行这种坐标转换。下面我们将深入探讨高斯坐标转换的概念、其重要性以及如何使用Visual Basic进行...

    经纬度和高斯坐标转换程序(Delphi编制)

    Delphi编制的一个简单的经纬度和高斯坐标系之间变换程序。实现了6度分带和3度分带的变换,操作模式以文件作为输入输出,文件格式竖排,各列内容可从打开对话框中自行选择。右键的快捷菜单中还有一些附加功能可为你...

    高斯坐标转换,高斯坐标转换经纬度,Visual Basic源码.zip.zip

    总的来说,高斯坐标转换是一个复杂但重要的地理信息处理过程,通过Visual Basic这样的编程语言,我们可以实现自动化的转换算法,提高效率并减少人为错误。理解和掌握这个过程有助于我们在GIS项目中更好地处理和分析...

    坐标转换与经纬度转换工具.zip

    在IT领域,坐标转换与经纬度转换是GIS(地理信息系统)和导航系统中的核心概念。这些转换对于确保地理数据的准确性和一致性至关重要。下面将详细解释这些知识点。 首先,坐标转换涉及不同坐标系之间的变换。在空间...

    经纬度与直角坐标系相互转换MATLAB程序.zip_matlab 经纬度_坐标 转换_经纬度_经纬度 matlab_经纬度 坐标

    WCS-84坐标系的X,Y,Z与经纬度之间的相互转换

    经纬度与高斯坐标转换

    经纬度坐标及高斯坐标的转换代码.doc

    经纬度坐标及高斯坐标的转换代码 在GIS( Geographic Information System,地理信息系统)中,经纬度坐标和高斯坐标是两种常用的坐标系。经纬度坐标系是以地球表面的经度和纬度为坐标轴的二维坐标系,而高斯坐标系...

    经纬度坐标和xy坐标转换程序.rar

    在"经纬度坐标和xy坐标转换程序"中,可能包含了这些转换的算法和代码实现,可以帮助用户快速便捷地完成坐标间的转换。 在实际应用中,这些转换程序对于GIS数据处理、地图制作、定位服务等领域具有重要意义。比如,...

    C语言版经纬度与高斯投影相互转换函数

    本文将详细讨论“C语言版经纬度与高斯投影相互转换函数”,这是一组用于在不同坐标系之间进行转换的实用程序。我们将深入探讨C语言实现、高斯投影以及与北斗(BDS)和全球定位系统(GPS)坐标的关系。 首先,让我们...

    平面坐标与经纬度的转换

    在本例中,这个名为"MyGeocoordTranstorm"的DLL可能包含了平面坐标到经纬度,以及经纬度到平面坐标的转换算法。 转换过程涉及选择合适的椭球体模型,如北京54、西安80、WGS84和National2000。这些椭球体是地球几何...

    大地坐标与高斯坐标转换工具

    转换工具的核心功能就是将大地坐标的经纬度转换为高斯坐标,反之亦然。这个过程涉及到投影变换,其中最常见的是高斯-克吕格投影。在3度带或6度带的划分下,每个带内采用不同的投影公式,确保了在该带内投影误差较小...

    高斯坐标正反算.rar_大地坐标_平面坐标_经纬度_高斯 大地

    这个转换过程涉及到“高斯坐标正反算”,即从高斯平面坐标到大地经纬度的转换,以及从大地经纬度到高斯平面坐标的转换。下面我们将详细探讨这些概念。 首先,高斯投影是由德国数学家卡尔·弗里德里希·高斯提出的,...

Global site tag (gtag.js) - Google Analytics