//注意这是从WGS84坐标系到高斯投影的转化,百度地图用的经纬度坐标并非是高斯WGS84,但是WGS84是世界通用的坐标系,一般国外都是用这个表示的,经过测试,其精确度还是可以的。
#include "iostream"
#include "math.h"
using namespace std;
struct PingMian
{
double x;
double y;
double z;
};
struct WGS84
{
double longitude;//经度
double latitude;//纬度
double height;//高度
};
void GeodeticToCartesian(PingMian& pingmian, const WGS84& wgs84)
{
double b;//纬度度数
double L;//经度度数
double L0;//中央经线度数
double L1;//L - L0
double t;//tanB
double m;//ltanB
double N;//卯酉圈曲率半径
double q2;
double X;// 高斯平面纵坐标
double Y;// 高斯平面横坐标
double s;// 赤道至纬度B的经线弧长
double f; // 参考椭球体扁率
double e2;// 椭球第一偏心率
double a; // 参考椭球体长半轴
//
double a1;
double a2;
double a3;
double a4;
double b1;
double b2;
double b3;
double b4;
double c0;
double c1;
double c2;
double c3;
//
int Datum, prjno, zonewide;
double IPI;
//
Datum = 84;// 投影基准面类型:北京54基准面为54,西安80基准面为80,WGS84基准面为84
prjno = 0;// 投影带号
zonewide = 3;
IPI = 0.0174532925199433333333; // 3.1415926535898/180.0
b = wgs84.latitude; //纬度
L = wgs84.longitude;//经度
if (zonewide == 6)
{
prjno = trunc(L / zonewide) + 1;
L0 = prjno * zonewide - 3;
}
else
{
prjno = trunc((L - 1.5) / 3) + 1;
L0 = prjno * 3;
}
if (Datum == 54)
{
a = 6378245;
f = 1 / 298.3;
}
else if (Datum == 84)
{
a = 6378137;
f = 1 / 298.257223563;
}
//
L0 = L0 * IPI;
L = L * IPI;
b = b * IPI;
e2 = 2 * f - f * f; // (a*a-b*b)/(a*a);
L1 = L - L0;
t = tan(b);
m = L1 * cos(b);
N = a / sqrt(1 - e2 * sin(b) * sin(b));
q2 = e2 / (1 - e2) * cos(b) * cos(b);
a1 = 1 + 3 / 4 * e2 + 45 / 64 * e2 * e2 + 175 / 256 * e2 * e2 * e2 + 11025 /
16384 * e2 * e2 * e2 * e2 + 43659 / 65536 * e2 * e2 * e2 * e2 * e2;
a2 = 3 / 4 * e2 + 15 / 16 * e2 * e2 + 525 / 512 * e2 * e2 * e2 + 2205 /
2048 * e2 * e2 * e2 * e2 + 72765 / 65536 * e2 * e2 * e2 * e2 * e2;
a3 = 15 / 64 * e2 * e2 + 105 / 256 * e2 * e2 * e2 + 2205 / 4096 * e2 * e2 *
e2 * e2 + 10359 / 16384 * e2 * e2 * e2 * e2 * e2;
a4 = 35 / 512 * e2 * e2 * e2 + 315 / 2048 * e2 * e2 * e2 * e2 + 31185 /
13072 * e2 * e2 * e2 * e2 * e2;
b1 = a1 * a * (1 - e2);
b2 = -1 / 2 * a2 * a * (1 - e2);
b3 = 1 / 4 * a3 * a * (1 - e2);
b4 = -1 / 6 * a4 * a * (1 - e2);
c0 = b1;
c1 = 2 * b2 + 4 * b3 + 6 * b4;
c2 = -(8 * b3 + 32 * b4);
c3 = 32 * b4;
s = c0 * b + cos(b) * (c1 * sin(b) + c2 * sin(b) * sin(b) * sin(b) + c3 * sin
(b) * sin(b) * sin(b) * sin(b) * sin(b));
X = s + 1 / 2 * N * t * m * m + 1 / 24 * (5 - t * t + 9 * q2 + 4 * q2 * q2)
* N * t * m * m * m * m + 1 / 720 * (61 - 58 * t * t + t * t * t * t)
* N * t * m * m * m * m * m * m;
Y = N * m + 1 / 6 * (1 - t * t + q2) * N * m * m * m + 1 / 120 *
(5 - 18 * t * t + t * t * t * t - 14 * q2 - 58 * q2 * t * t)
* N * m * m * m * m * m;
Y = Y + 1000000 * prjno + 500000;
pingmian.x = X;
pingmian.y = Y;
pingmian.z = 0;
}
int main(void)
{
PingMian pingmian, pingmian2;
WGS84 wgs84, wgs84t;
wgs84.latitude = 39.924135;//纬度
wgs84.longitude = 116.40337;//经度
GeodeticToCartesian(pingmian, wgs84);
wgs84t.latitude = 40.000341;//纬度
wgs84t.longitude = 116.52899;//经度
GeodeticToCartesian(pingmian2, wgs84t);
printf("故宫博物院X = %f ; Y = %f;\r\n", pingmian.x, pingmian.y);
printf("北京工人体育场X = %f; Y = %f;\r\n", pingmian2.x, pingmian2.y);
system("pause");
return 0;
}