|
发表于 2010-8-21 21:27:46
|
显示全部楼层
12楼所说正确,下面是经纬度转平面坐标的计算公式,我发布在另外一个帖子中,拷贝过来:
//
// WGS84椭球
//
//a = 6378137.0000000000;
//b = 6356752.3142;
//c = 6399593.6258;
//_a = 1.0 / 298.257223563;
//e2 = 0.0066943799013;
//e2 = (a * a - b * b) / (a * a);
//e_2 = 0.00673949674227;
//e_2 = (a * a - b * b) / (b * b);
#define v0 (6.36744914585577e+006)
#define v1 (6.39959362580000e+006)
#define v2 (-2.15650202422767e+004)
#define v3 (1.09003037983916e+002)
#define v4 (-6.12188017458933e-001)
#define v5 (-3.21444799442298e+004)
#define v6 (1.35366946123277e+002)
#define v7 (-7.09481085293974e-001)
#define v8 (4.06137292124076e-003)
#define v9 (-4.16666666666667e-002)
#define v10 (2.50000000000000e-001)
#define v11 (2.52731128372009e-003)
#define v12 (7.57013608867423e-006)
#define v13 (1.38888888888889e-003)
#define v14 (-8.33333333333333e-002)
#define v15 (1.66666666666667e-001)
#define v16 (-1.66666666666667e-001)
#define v17 (3.33333333333333e-001)
#define v18 (1.12324945943115e-003)
#define v19 (8.33333333333333e-003)
#define v20 (-1.66666666666667e-001)
#define v21 (1.96742576567650e-001)
#define v22 (4.04369805395214e-003)
#define PI (3.1415926535898)
//
// 克拉索夫斯基椭球
//
//a = 6378245.0000000000;
//b = 6356863.0187730473;
//c = 6399698.9017827110; // c = a * a / b;
//_a = 1.0 / 298.3; // "阿尔法", _a = (a - b) / a;
//e2 = 0.006693421622966; // "e的平方", e2 = (a * a - b * b) / (a * a);
//e_2 = 0.006738525414683; // "e撇的平方", e_2 = (a * a - b * b) / (b * b);
//#define v0 (6.36755849693382e+006)
//#define v1 (6.39969890178271e+006)
//#define v2 (-2.15622668479908e+004)
//#define v3 (1.08973412365022e+002)
//#define v4 (-6.11933423955361e-001)
//#define v5 (-3.21404048488872e+004)
//#define v6 (1.35330282065412e+002)
//#define v7 (-7.09186712693043e-001)
//#define v8 (4.05909878989504e-003)
//#define v9 (-4.16666666666667e-002)
//#define v10 (2.50000000000000e-001)
//#define v11 (2.52694703050613e-003)
//#define v12 (7.56795412738812e-006)
//#define v13 (1.38888888888889e-003)
//#define v14 (-8.33333333333333e-002)
//#define v15 (1.66666666666667e-001)
//#define v16 (-1.66666666666667e-001)
//#define v17 (3.33333333333333e-001)
//#define v18 (1.12308756911383e-003)
//#define v19 (8.33333333333333e-003)
//#define v20 (-1.66666666666667e-001)
//#define v21 (1.96743046049570e-001)
//#define v22 (4.04311524880980e-003)
//#define PI (3.1415926535898)
//
// 1975年国际椭球
//
//a = 6378140.0000000000;
//b = 6356755.2881575287;
//c = 6399596.6519880105;
//_a = 1.0 / 298.257;
//e2 = 0.006694384999588;
//e_2 = 0.006739501819473;
//#define v0 (6.36745213284732e+006)
//#define v1 (6.39959665198801e+006)
//#define v2 (-2.15650466399833e+004)
//#define v3 (1.09003253300390e+002)
//#define v4 (-6.12189686622048e-001)
//#define v5 (-3.21445191406919e+004)
//#define v6 (1.35367212855273e+002)
//#define v7 (-7.09483016172281e-001)
//#define v8 (4.06138704580734e-003)
//#define v9 (-4.16666666666667e-002)
//#define v10 (2.50000000000000e-001)
//#define v11 (2.52731318230238e-003)
//#define v12 (7.57014746244665e-006)
//#define v13 (1.38888888888889e-003)
//#define v14 (-8.33333333333333e-002)
//#define v15 (1.66666666666667e-001)
//#define v16 (-1.66666666666667e-001)
//#define v17 (3.33333333333333e-001)
//#define v18 (1.12325030324550e-003)
//#define v19 (8.33333333333333e-003)
//#define v20 (-1.66666666666667e-001)
//#define v21 (1.96742574120588e-001)
//#define v22 (4.04370109168380e-003)
//
// "大地坐标 --> 高斯平面坐标" 转换算法
//
// B = 输入纬度(单位度), L = 输入经度(单位度), x = 输出横坐标(单位米), y = 输出纵坐标(单位米)
//
void calculation(float B, float L, float *x, float *y)
{
float l, l2, N, w0, w1, w2, w3, w4, cosb, cosb2;
l = L - ((int)L / 6 * 6 + 3); // 求经差
B = B * PI / 180.0; // 转弧度
l = l * PI / 180.0; // 转弧度
l2 = l * l;
cosb = cos(B);
cosb2 = cosb * cosb;
N = v1 + (v2 + (v3 + v4 * cosb2) * cosb2) * cosb2;
w0 = v5 + (v6 + (v7 + v8 * cosb2) * cosb2) * cosb2;
w1 = v9 + (v10 + (v11 + v12 * cosb2) * cosb2) * cosb2;
w2 = v13 + (v14 + v15 * cosb2) * cosb2;
w3 = v16 + (v17 + v18 * cosb2) * cosb2;
w4 = v19 + (v20 + (v21 + v22 * cosb2) * cosb2) * cosb2;
*y = v0 * B + (w0 + (0.5 + (w1 + w2 * l2) * l2) * l2 * N) * cosb * sin(B);
*x = (1.0 + (w3 + w4 * l2) * l2) * l * N * cosb;
*x += 500000.0;
}
计算精度:float, 最大误差 < 1米。double, 最大误差 < 1毫米。 |
|