当前位置:文档之家› 8高斯投影正反算 C#代码

8高斯投影正反算 C#代码

private void button1_Click(object sender, EventArgs e) {
double ee = 0; double a = 0; string tt;
try {
tt = boBox1.Items[boBox1.SelectedIndex].ToString(); } catch {
X = a0 * B - a2 / 2.0 * s2b + a4 * s4b / 4.0 - a6 / 6.0 * s6b;
pcrdCar.x = Nscnb * lp * lp / 2.0 + Nscnb * cosb * cosb * Math.Pow(lp, 4) * (5 - t * t + 9 * ita * ita + 4 * Math.Pow(ita, 4)) / 24.0
MessageBox.Show("Gauss Inverse: Choose datum error!"); return; }
if (pareTo("克氏椭球")==0)
{ a = 6378245.00; ee = Math.Sqrt(0.006693421622);
} if (pareTo("WGS-84") == 0) {
double ita = epp * Math.Cos(pcrdGeo.dLatitude); double t = Math.Tan(pcrdGeo.dLatitude); double Nscnb = N * Math.Sin(pcrdGeo.dLatitude) * Math.Cos(pcrdGeo.dLatitude); double Ncosb = N * Math.Cos(pcrdGeo.dLatitude); double cosb = Math.Cos(pcrdGeo.dLatitude);
二.代码
using System; using System.Collections.Generic; using ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
//求中央经度 int num; midlong = 0;
//带号 //默认值,需要制定分带
try {
tt = boBox3.Items[boBox3.SelectedIndex].ToString(); } catch {
MessageBox.Show("Choose 3/6 error!"); return; } if (pareTo("3度带") == 0) {
a = 6378137.00; ee = Math.Sqrt(0.00669437999013); } if (pareTo("1975国际椭球") == 0) { a = 6378140.00; ee = Math.Sqrt(0.006694384999588); } if (pareTo("2000国家大地坐标系") == 0) { a = 6378137.0; ee =Math.Sqrt(0.0066943802290); }
//求纬度 string[] temp; temp = textBox1.Text.Split(' '); double[] tempradius = new double[3];
for (int i = 0; i < 3; i++) {
tempradius[i] = Convert.ToDouble(temp[i]); }
num = Convert.ToInt32(deglon / 6 + 1); midlong = (6 * num - 3) / 180.0 * pai; } if (pareTo("6度带") == 0) { num = Convert.ToInt32((deglon + 1.5) / 3); midlong = num * 3 * pai / 180; } double lp=pcrdGeo.dLongitude - midlong;
a8 = m8 / 128.0;
s2b);
double B = pcrdGeo.dLatitude; double sb = Math.Sin(B); double cb = Math.Cos(B); double s2b = sb * cb * 2; double s4b = s2b * (1 - 2 * sb * sb) * 2; double s6b = s2b * Math.Sqrt(1 - s4b * s4b) + s4b * Math.Sutton2_Click(object sender, EventArgs e) {
double ee = 0; double a = 0; string tt; int num;
//带号
string ytext;
//利用y值求带号和中央经线
try {
tt = boBox2.Items[boBox2.SelectedIndex].ToString(); } catch {
+ Nscnb * Math.Pow(cosb, 4) * Math.Pow(lp, 6) * (61 - 58 * t * t + Math.Pow(t, 4)) / 720.0 + X;
pcrdCar.y = Ncosb * Math.Pow(lp, 1) + Ncosb * cosb * cosb * (1 - t * t + ita * ita) / 6.0 * Math.Pow(lp, 3) + Ncosb * Math.Pow(lp, 5)* Math.Pow(cosb, 4) * (5 - 18 *t*t
double N = c / Math.Sqrt(1 + epp * epp * Math.Cos(pcrdGeo.dLatitude) * Math.Cos(pcrdGeo.dLatitude));
double M = c / Math.Pow(1 + epp * epp * Math.Cos(pcrdGeo.dLatitude) * Math.Cos(pcrdGeo.dLatitude), 1.5);
高斯投影正反算程序设计
一.程序设计流程
本程序的设计思路如下: (1),程序采用 VS08 版本作为开发平台,并采用 C#语言作为开发语言,设计为 WindowsForm 窗体程序形式。 (2),程序主要的算法来自于教材。但是本程序为了更加实用,添加了更多的解算基准, 包括:WGS-84,国际椭球 1975,克氏椭球,和 2000 国家大地坐标系。 (3),程序为了更方便的读取数据和输出数据,故需要自己定义了固定的数据输入格式和 数据输出格式或形式,请老师注意查看。
MessageBox.Show("Gauss Inverse: Choose datum error!"); return; }
if (pareTo("克氏椭球") == 0) {
a = 6378245.00; ee = Math.Sqrt(0.006693421622); } if (pareTo("WGS-84") == 0) { a = 6378137.00; ee = Math.Sqrt(0.00669437999013); } if (pareTo("1975国际椭球") == 0) { a = 6378140.00; ee = Math.Sqrt(0.006694384999588); } if (pareTo("2000国家大地坐标系") == 0) { a = 6378137.0; ee =Math.Sqrt(0.0066943802290); }
const double pai = 3.1415926; double b = Math.Sqrt(a * a * (1 - ee * ee)); double c = a * a / b; double epp = Math.Sqrt((a * a - b * b) / b / b);
CRDGEODETIC pcrdGeo; CRDCARTESIAN pcrdCar; double midlong;
tempradius[i] = Convert.ToDouble(temp[i]); } pcrdGeo.dLongitude = tempradius[0] / 180.0 * pai + tempradius[1] / 180.0 / 60.0 * pai + tempradius[2] / 180 / 60.0 / 60 * pai; int deglon = Convert.ToInt32(pcrdGeo.dLongitude * 180 / pai);
}
//笛卡尔坐标 //Cartesian Coordinate public struct CRDCARTESIAN {
public double x; public double y; public double z; }
public Form1() {
InitializeComponent(); }
const double pai = 3.1415926535898; double b = Math.Sqrt(a * a * (1 - ee * ee)); double c = a * a / b; double epp = Math.Sqrt((a * a - b * b) / b / b); CRDGEODETIC pcrdGeo; CRDCARTESIAN pcrdCar; double midlong = 0;
相关主题