坐标转换源代码--GPS定位程序(C--)
gps坐标转换常用方法及转换流程

GPS坐标转换常用方法及转换流程GPS(全球定位系统)坐标转换是将地球上的位置坐标从一种表示方式转换为另一种方式的过程。
这种转换是非常常见的,特别是在地图应用、导航系统和地理信息系统中。
本文将介绍常用的GPS坐标转换方法并提供详细的转换流程。
背景知识在讨论GPS坐标转换之前,首先需要了解一些背景知识。
1. GPS坐标系统GPS坐标系统是用于在地球表面定位和导航的一种坐标系统。
它由经度、纬度和海拔高度组成。
经度表示位置在东西方向上的位置,纬度表示位置在南北方向上的位置,海拔高度表示位置相对于平均海平面的高度。
2. 常用的GPS坐标系统常见的GPS坐标系统包括WGS84和GCJ02坐标系统。
•WGS84坐标系统是一种全球通用的坐标系统,由GPS系统使用。
在大多数情况下,来自GPS设备的原始坐标将使用WGS84。
•GCJ02坐标系统是中国国家测绘局制定的一种坐标系统,用于在中国境内的地图应用中。
GCJ02坐标系统是基于WGS84进行了偏移处理,以保护国家安全。
常用的GPS坐标转换方法在进行GPS坐标转换时,常用的方法包括WGS84转GCJ02和GCJ02转WGS84。
1. WGS84转GCJ02WGS84转GCJ02是将WGS84坐标转换为GCJ02坐标的过程。
由于GCJ02坐标系统在WGS84的基础上进行了偏移处理,所以需要经过一些计算来进行转换。
转换的具体步骤如下:1.将WGS84坐标的经度和纬度分别记为lng和lat。
2.如果lat在1.5以外且lng在48.5以外,则直接返回WGS84坐标。
3.否则,计算新的坐标。
具体计算公式请参考相关的算法。
4.将计算得到的新坐标作为GCJ02坐标返回。
2. GCJ02转WGS84GCJ02转WGS84是将GCJ02坐标转换为WGS84坐标的过程。
由于GCJ02坐标系统相对于WGS84进行了偏移处理,所以需要进行逆运算才能得到原始的WGS84坐标。
转换的具体步骤如下:1.将GCJ02坐标的经度和纬度分别记为lng和lat。
坐标转换源代码

#include "iostream.h"#include "math.h"#include "stdio.h"#define pi 3.1415926535897932 //圆周率void xyz_xyz(double xyz[],double xyz1[],double canshu[]);void gstyz(double blh[],double xy[],double para2[]);void blh_xyz(double blh[],double xyz[],double para1[]);double ziwuhu(double B,double a,double e2);double xyz_blh(double blh[],double xyz[],double para2[]);double huahu(double b);main(){double blh[3],xyz[3],xyz1[3],xy[2],para1[2],para2[2],canshu[7]; int i;cout<<"请输入大地坐标B,L,H,角度输入方式如下:"<<endl;cout<<"若输入的角度为30度30分30秒,对应的代码为:30.3030"<<endl;cin>>blh[0]>>blh[1]>>blh[2];cout<<endl;//将输入的角度形式转化为弧度blh[0]=huahu(blh[0]);blh[1]=huahu(blh[1]);cout<<"请输入WGS84椭球的椭球参数,长半轴以及扁率的倒数:"<<endl; cin>>para1[0]>>para1[1];cout<<endl;cout<<"请输入北京54椭球的椭球参数,长半轴以及扁率的倒数:"<<endl;cin>>para2[0]>>para2[1];cout<<endl;//调用函数,实现大地坐标向空间直角坐标系中的转换blh_xyz(blh,xyz,para1);cout<<"对应的空间直角坐标系中的坐标为:"<<endl;printf("x=%10.6f,y=%10.6f,z=%10.6f",xyz[0],xyz[1],xyz[2]);cout<<endl;cout<<"请分别输入两坐标系之间的缩放参数,旋转参数和位移参数:"<<endl;for(i=0;i<7;i++){cin>>canshu[i];}cout<<endl;//将输入的角度转换为弧度的形式canshu[1]=huahu(canshu[1]);canshu[2]=huahu(canshu[2]);canshu[3]=huahu(canshu[3]);//调用函数,实现两个空间直角坐标系之间的转换xyz_xyz(xyz,xyz1,canshu);//调用函数,将大地坐标转换为直角坐标xyz_blh(blh,xyz,para2);//调用函数,计算对应的高斯投影面上的坐标gstyz(blh,xy,para2);//输出结果printf("对应的高斯投影坐标系中的坐标为:\n");printf("x=%10.6f,y=%10.6f",xy[0],xy[1]);}//大地坐标转换为直角坐标void blh_xyz(double blh[],double xyz[],double para1[]) { double b,e2,N;b=para1[0]*(1-1/para1[1]);e2=1-b*b/(para1[0]*para1[0]);N=para1[0]/sqrt(1-e2*sin(blh[0])*sin(blh[0]));xyz[0]=(N+blh[2])*cos(blh[0])*cos(blh[1]);xyz[1]=(N+blh[2])*cos(blh[0])*sin(blh[1]);xyz[2]=(N*(1-e2)+blh[2])*sin(blh[0]);}//计算子午弧长函数double ziwuhu(double B,double a,double e2){double X,m0,m2,m4,m6,m8,q0, q2,q4,q6,q8;m0=a*(1-e2);m2=3*e2*m0/2;m4=5*e2*m2/4;m6=7*e2*m4/6;m8=9*e2*m6/8;q0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;q2=m2/2+m4/2+15*m6/32+7*m8/16;q4=m4/8+3*m6/16+7*m8/32;q6=m6/32+m8/16;q8=m8/128;X=q0*B-q2*sin(2*B)/2+q4*sin(4*B)/4-q6*sin(6*B)/6+q8*sin(8*B)/8; return X;}//坐标转换的直接解法求解经纬度double xyz_bl(double blh[],double xyz[],double para2[]){double a,b,e2,p1,r,A1,A2,A3,A4;a=para2[0];b=a*(1-1/para2[1]);e2=1-b*b/(a*a);p1=atan(xyz[2]/sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]));r=a*sqrt(1-e2)/((1-e2*sin(p1)*sin(p1))*(1-e2*sin(p1)*sin(p1)) );r=sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);A1=para2[0]*tan(p1)/r;A2=sin(p1)*sin(p1)+2*(a/r)*cos(p1)*cos(p1);A3=3*sin(p1)*sin(p1)*sin(p1)*sin(p1)+16*((a/r)*sin(p1)*sin(p1)*cos(p1 )*cos(p1)+4*(a/r)*(a/r)*cos(p1)*cos(p1)*(2-5*sin(p1)*sin(p1)));A4=5*sin(p1)*sin(p1)*sin(p1)*sin(p1)*sin(p1)*sin(p1)+48*((a/r)*sin(p1)*sin(p1)*sin(p1)*sin(p1)*cos(p1)*cos(p1)+20*(a/r)*(a/r)*sin(p1)*sin(p1)*cos(p1)*cos(p1)*(4-7*sin(p1)*sin(p1))+16*(a/r)*(a/r)*(a/r )*cos(p1)*cos(p1)*(1-7*sin(p1)*sin(p1)+8*sin(p1)*sin(p1)*sin(p1)*sin(p1)));blh[0]=atan(tan(p1)+A1*e2*(1+e2/2*(A2+e2*e2/4*(A3+A4/2))));blh[1]=atan(xyz[1]/xyz[0]);if(blh[1]<0)blh[1]+=pi;}//使用实用电算公式计算进行高斯投影正算void gstyz(double blh[],double xy[],double para2[]){double B,L,l,b,e2,t,g2,N,x1,x2,x3,y1,y2,y3;int i;B=blh[0];L=blh[1]*180/pi;//计算高斯投影带的带号for(i=0;fabs(3*i-L)>1.5;i++);cout<<"高斯投影带的带号为:"<<i<<endl;//计算经差,并用弧度的形式表示l=(L-3*i)*pi/180;b=para2[0]*(1-1/para2[1]);e2=1-b*b/(para2[0]*para2[0]);t=tan(B);g2=e2*cos(B)*cos(B)/(1-e2);N=para2[0]/sqrt(1-e2*sin(B)*sin(B));x1=N*t*cos(B)*cos(B)*l*l/2;x2=N*t*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*(5-t*t+9*g2+4*g2*g2)/24;x3=N*t*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*l*l*(61-58*t *t+t*t*t*t)/720;y1=N*cos(B)*l;y2=N*cos(B)*cos(B)*cos(B)*l*l*l*(1-t*t+g2)/6;y3=N*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*l*(5-18*t*t+t*t*t*t+1 4*g2-58*g2*t*t)/120;xy[0]=ziwuhu(B,para2[0],e2)+x1+x2+x3;xy[1]=y1+y2+y3;}//将输入的角度化为弧度的函数double huahu(double b){double b1,b2,b3;b1=(int)b;b2=(int)((b-b1)*100);b3=((b-b1)*100-b2)*100;b=(b1+b2/60+b3/3600)*pi/180;return b;}//直角坐标系转换函数void xyz_xyz(double xyz[],double xyz1[],double canshu[]) {double k,ox,oy,oz,oX,oY,oZ,a1,a2,a3,b1,b2,b3,c1,c2,c3; k=1+canshu[0];ox=canshu[1];oy=canshu[2];oz=canshu[3];oX=canshu[4];oY=canshu[5];oZ=canshu[6];//计算旋转矩阵a1=cos(oz)*cos(oy);a2=cos(ox)*sin(oz)+sin(ox)*sin(oy)*cos(oz);a3=sin(ox)*sin(oz)-cos(ox)*sin(oy)*cos(oz);b1=-cos(oy)*sin(oz);b2=cos(ox)*cos(oz)-sin(ox)*sin(oy)*sin(oz);b3=sin(ox)*cos(oz)+cos(ox)*sin(oy)*sin(oz);c1=sin(oy);c2=-sin(ox)*cos(oy);c3=cos(ox)*cos(oy);//计算在转换后直角坐标系中的坐标xyz1[0]=k*(a1*xyz[0]+a2*xyz[1]+a3*xyz[2])+oX;xyz1[1]=k*(b1*xyz[0]+b2*xyz[1]+b3*xyz[2])+oY;xyz1[2]=k*(c1*xyz[0]+c2*xyz[1]+c3*xyz[2])+oZ;}。
GPS测量中坐标系统、坐标系的转换过程

GPS测量中坐标系统、坐标系的转换过程【摘要】GPS测量中的坐标系统和坐标系转换是利用全球定位系统(GPS)进行地理测量和定位的关键。
本文从引言开始,概述了GPS测量中坐标系统和坐标系的转换过程。
接着介绍了GPS坐标系统的概念和作用,以及常用的坐标系及其特点。
随后详细讨论了GPS坐标系统的转换方法和转换工具,帮助读者更好地理解和应用这些技术。
通过实际案例分析展示了GPS测量中坐标系统和坐标系转换的实际应用。
在总结了本文探讨的内容,并展望了未来GPS测量技术的发展方向。
通过本文的阐述,读者可以更深入地了解GPS测量中坐标系统和坐标系的转换过程,为相关领域的研究和应用提供了参考和指导。
【关键词】GPS测量、坐标系统、坐标系、转换过程、引言、GPS坐标系统、常用坐标系、特点、转换方法、转换工具、实际案例、分析、总结、未来发展、展望1. 引言1.1 GPS测量中坐标系统、坐标系的转换过程概述GPS测量中的坐标系统和坐标系转换是一项关键技术,广泛应用于各种领域。
在现代GPS测量中,我们常常需要将不同坐标系统之间的数据进行转换,以确保数据的准确性和一致性。
在这个过程中,我们需要了解GPS坐标系统的基本原理和常用的坐标系,掌握不同坐标系之间的转换方法,并使用相应的工具进行数据处理和分析。
GPS坐标系统是一种地理坐标系统,由经度、纬度和高度三个参数组成。
常用的坐标系包括WGS84、GCJ-02和BD-09等,它们各有自己的特点和适用范围。
在GPS测量中,我们需要根据具体的需求选择合适的坐标系,并进行必要的转换。
GPS坐标系转换方法包括基本的数学转换和大地测量学方法。
我们可以通过公式计算或使用专业软件来进行坐标系转换,确保数据的准确性和一致性。
一些专门的GPS坐标系转换工具也可以帮助我们快速、准确地实现坐标系转换。
通过实际案例分析,我们可以更好地理解GPS测量中坐标系统和坐标系转换的重要性和实际应用。
结合实际情况,总结经验教训,提出今后改进的方向,并展望未来发展的方向和前景。
大地坐标转换c代码

以下是一个大地坐标转换的C代码示例,它可以将经度、纬度和高程转换为笛卡尔坐标系中的x、y和z坐标。
```c#include <stdio.h>#include <math.h>#define RADIUS_EARTH 6371000.0 // 地球半径,单位为米void cartesian_coords(double longitude, double latitude, double height, double *x, double *y, double *z) {double r = RADIUS_EARTH + height; // 计算半径double sin_lat = sin(latitude * M_PI / 180.0);double cos_lat = cos(latitude * M_PI / 180.0);double sin_lon = sin(longitude * M_PI / 180.0);double cos_lon = cos(longitude * M_PI / 180.0);*x = r * cos_lon * cos_lat;*y = r * sin_lon * cos_lat;*z = r * sin_lat;}int main() {double longitude = 120.0; // 经度double latitude = 30.0; // 纬度double height = 0.0; // 高程,单位为米double x, y, z; // 笛卡尔坐标系中的x、y和z坐标cartesian_coords(longitude, latitude, height, &x, &y, &z);printf("经度:%lf\n", longitude);printf("纬度:%lf\n", latitude);printf("高程:%lf\n", height);printf("x坐标:%lf\n", x);printf("y坐标:%lf\n", y);printf("z坐标:%lf\n", z);return 0;}```该代码使用了地球半径和球面三角学公式将大地坐标转换为笛卡尔坐标系中的x、y和z坐标。
GPS坐标、火星坐标、百度坐标之间的转换--提供java版本转换代码

GPS坐标、⽕星坐标、百度坐标之间的转换--提供java版本转换代码参考⽂章:1、国内⼏种常⽤坐标系说明(1)名词解释坐标系统:⽤于定位的系统,就跟⼆维笛卡尔坐标系统⼀样,⼀个点使⽤(x,y),就能确定该点在笛卡尔坐标系统中的唯⼀位置。
这⾥讲的坐标系统,相对于笛卡尔坐标系统,要复杂许多,但作⽤却都是⼀样,主要⽤于定位,也就是精确地定位地表上的⼀点。
地理坐标系统:WGS84就是⼀种地理坐标系统。
地理坐标坐标是对地球进⾏简单⼏何建模,⽐如将地球看成⼀个球体或者类球体,然后再将地表上点投影到该球⾯上形成的坐标就是地理坐标系统。
WGS84就是定义了如何将地球抽象成球体或者类球体的规则。
或者简单地来说,WGS84就是⼀堆参数,⽤于建⽴球体或者类球体,来近似地球。
投影坐标系统:由于地球是⼀个球状,所以⼀般将其某个区域投影在平⾯上,形成的坐标系称为投影坐标系。
(2)⼏种坐标说明WG-S84: 地理坐标系统,GPS仪器记录的经纬度信息,Google Earth采⽤,Google Map中国范围外使⽤,⾼德地图中国范围外使⽤。
GCJ-02: 投影坐标系统,⽕星坐标系,中国国家测绘局制定的坐标系统,由WGS-84加密后的坐标。
Google中国和搜搜地图,arcgis地图,⾼德地图BD-09: 投影坐标系统,百度坐标,GCJ-02加密后的坐标系,只适⽤于百度地图(在国内是不允许直接⽤WGS84坐标系标注的,必须经过加密后才能⽤。
必须⾄少使⽤GCJ-02坐标系,或者使⽤在GCJ-02加密后再进⾏加密的坐标系,如百度坐标系)其他:搜狗地图:搜狗坐标系,图吧:图吧坐标等,估计也是在GCJ02基础上加密⽽成的,这⾥暂不涉及(3)转换⽅法1.可以通过嗲⽤直接的算法来转换(本⽂主要介绍该⽅法)2.可以通过Web API来转换3.可以通过第三⽅SDK API来转换2、下⾯给出前⾯3种坐标转换java算法package org.jeecg.modules.wangge.utils;/****/public class GPSConverterUtils {public static final String BAIDU_LBS_TYPE = "bd09ll";public static double pi = 3.1415926535897932384626;public static double a = 6378245.0;public static double ee = 0.00669342162296594323;/*** 84 to ⽕星坐标系 (GCJ-02)* @param lat* @param lon*/public static GPS gps84_To_Gcj02(double lat, double lon) {if (outOfChina(lat, lon)){return null;}double dLat = transformLat(lon - 105.0, lat - 35.0);double dLon = transformLon(lon - 105.0, lat - 35.0);double radLat = lat / 180.0 * pi;double magic = Math.sin(radLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);double mgLat = lat + dLat;double mgLon = lon + dLon;return new GPS(mgLat, mgLon);}/*** * ⽕星坐标系 (GCJ-02) to 84* * @param lon * @param lat * @return*/public static GPS gcj_To_Gps84(double lat, double lon) {GPS gps = transform(lat, lon);double lontitude = lon * 2 - gps.getLon();double latitude = lat * 2 - gps.getLat();return new GPS(latitude, lontitude);}/*** 将 GCJ-02 坐标转换成 BD-09 坐标** @param gg_lat* @param gg_lon*/public static GPS gcj02_To_Bd09(double gg_lat, double gg_lon) {double x = gg_lon, y = gg_lat;double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);double bd_lon = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return new GPS(bd_lat, bd_lon);}/*** * 将 BD-09 坐标转换成GCJ-02 坐标 ** * @param* bd_lat * @param bd_lon * @return*/public static GPS bd09_To_Gcj02(double bd_lat, double bd_lon) {double x = bd_lon - 0.0065;double y = bd_lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);double gg_lon = z * Math.cos(theta);double gg_lat = z * Math.sin(theta);return new GPS(gg_lat, gg_lon);}/*** (BD-09)-->84* @param bd_lat* @param bd_lon* @return*/public static GPS bd09_To_Gps84(double bd_lat, double bd_lon) {GPS gcj02 = bd09_To_Gcj02(bd_lat, bd_lon);GPS map84 = gcj_To_Gps84(gcj02.getLat(),gcj02.getLon());return map84;}/*** is or not outOfChina* @param lat* @param lon* @return*/public static boolean outOfChina(double lat, double lon) {if (lon < 72.004 || lon > 137.8347)return true;if (lat < 0.8293 || lat > 55.8271)return true;return false;}public static GPS transform(double lat, double lon) {if (outOfChina(lat, lon)) {return new GPS(lat, lon);}double dLat = transformLat(lon - 105.0, lat - 35.0);double dLon = transformLon(lon - 105.0, lat - 35.0);double radLat = lat / 180.0 * pi;double magic = Math.sin(radLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);double mgLat = lat + dLat;double mgLon = lon + dLon;return new GPS(mgLat, mgLon);}public static double transformLat(double x, double y) {double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;return ret;}public static double transformLon(double x, double y) {double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1* Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0* pi)) * 2.0 / 3.0;return ret;}}package org.jeecg.modules.wangge.utils;public class GPS {private double lat;private double lon;public GPS(double lat, double lon) {t = lat;this.lon = lon;}public double getLat() {return lat;}public void setLat(double lat) {t = lat;}public double getLon() {return lon;}public void setLon(double lon) {this.lon = lon;}public String toString() {return "lat:" + lat + "," + "lon:" + lon;}}3、代码验证和调试坐标系的转换和验证,⼀定要在实际平台下进⾏⽐对和验证。
坐标转换源代码--GPS定位程序(C++)

#include "stdlib.h"
//WGS-84椭球体参数
const double a=6378137.0;//长半轴
const double flattening=1/298.257223563;//扁率
const double delta=0.0000001;
typedef struct tagCRDCARTESIAN{
pct->upping=pctp->range*sin(pctp->elevation);
}
double x;
double y;
double z;
}CRDCARTESIAN;
typedef CRDCARTESIAN *PCRDCARTESIAN;
//笛卡尔坐标系
typedef struct tagCRDGEODETIC{
double longitude;
double latitude;
}CRDTOPOCENTRICPOLAR;
typedef CRDTOPOCENTRICPOLAR *PCRDTOPOCENTRICPOLAR;
//站心地平坐标系(极坐标形式)
//由笛卡尔坐标转换为大地坐标
void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDC尔坐标
void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,
double dSemiMajorAxis, double dFlattening)
{
double e2;//第一偏心率的平方
坐标转换源代码

坐标转换源代码// Convert.cpp : implementation file//#include stdafx.h椣据畬敤尠坐标转换.h#include Convert.h#include Converting.h#include zbxtsz.h#include gybl.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////// ////////// CConvert dialogCConvert::CConvert(CWnd* pParent /*=NULL*/): CDialog(CConvert::IDD, pParent){//{{AFX_DATA_INIT(CConvert)m_s21 = -1;m_s22 = -1;m_s23 = -1;m_s24 = -1;m_s25 = -1;m_s26 = -1;m_s27 = -1;m_New_Zyzwx = 0.0;m_Zyzwx = 0.0;//}}AFX_DATA_INIT}void CConvert::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CConvert)DDX_Control(pDX, IDC_NEW_Zyzwx, m_C_New_Zyzwx);DDX_Control(pDX, IDC_Zyzwx, m_C_Zyzwx);DDX_Control(pDX, IDC_ZBXT, m_Zbxt);DDX_Control(pDX, IDC_New_ZBXT, m_New_Zbxt);DDX_Control(pDX, IDC_Txfs1, m_Txfs1);DDX_Control(pDX, IDC_a21, m_c21);DDX_Control(pDX, IDC_a22, m_c22);DDX_Control(pDX, IDC_a23, m_c23);DDX_Control(pDX, IDC_a24, m_c24);DDX_Control(pDX, IDC_a25, m_c25);DDX_Control(pDX, IDC_a26, m_c26);DDX_Control(pDX, IDC_a27, m_c27);DDX_Radio(pDX, IDC_a21, m_s21);DDX_Radio(pDX, IDC_a22, m_s22);DDX_Radio(pDX, IDC_a23, m_s23);DDX_Radio(pDX, IDC_a24, m_s24);DDX_Radio(pDX, IDC_a25, m_s25);DDX_Radio(pDX, IDC_a26, m_s26);DDX_Radio(pDX, IDC_a27, m_s27);DDX_Text(pDX, IDC_NEW_Zyzwx, m_New_Zyzwx);DDX_Text(pDX, IDC_Zyzwx, m_Zyzwx);DDX_Control(pDX, IDC_Grid1, m_Grid1);DDX_Control(pDX, IDC_Grid2, m_Grid2);DDX_Control(pDX, IDC_Grid3, m_Grid3);DDX_Control(pDX, IDC_Grid4, m_Grid4);DDX_Control(pDX, IDC_Grid5, m_Grid5);DDX_Control(pDX, IDC_Grid6, m_Grid6);DDX_Control(pDX, IDC_Grid7, m_Grid7);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CConvert, CDialog)//{{AFX_MSG_MAP(CConvert)ON_BN_CLICKED(IDC_Dyzbxt, OnDyzbxt)ON_BN_CLICKED(IDC_Txfs1, OnTxfs1)ON_BN_CLICKED(IDC_Txfs2, OnTxfs2)ON_BN_CLICKED(IDC_Txfs3, OnTxfs3)ON_BN_CLICKED(IDC_Txfs4, OnTxfs4)ON_BN_CLICKED(IDC_a21, Ona21)ON_BN_CLICKED(IDC_a22, Ona22)ON_BN_CLICKED(IDC_a23, Ona23)ON_BN_CLICKED(IDC_a24, Ona24)ON_BN_CLICKED(IDC_a25, Ona25)ON_BN_CLICKED(IDC_a26, Ona26)ON_BN_CLICKED(IDC_a27, Ona27)ON_CBN_SELCHANGE(IDC_New_ZBXT, OnSelchangeNewZBXT)ON_CBN_SELCHANGE(IDC_ZBXT, OnSelchangeZbxt)ON_BN_CLICKED(ID_Insert, OnInsert)ON_BN_CLICKED(ID_Delete, OnDelete)ON_BN_CLICKED(ID_change, Onchange)ON_BN_CLICKED(ID_Input, OnInput)ON_BN_CLICKED(ID_Output, OnOutput)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////// ////////// CConvert message handlersvoid CConvert::OnDyzbxt(){CZbxtSz dlg;dlg.DoModal();int i,j;i=m_Zbxt.GetCount();for (j=0;j{ m_Zbxt.DeleteString(0);m_New_Zbxt.DeleteString(0);}GyBl.Zbxt_work= GyBl.Zbxt_head;while (GyBl.Zbxt_work!=NULL){m_Zbxt.AddString(GyBl.Zbxt_work->XtName);m_New_Zbxt.AddString(GyBl.Zbxt_work->XtName);GyBl.Zbxt_work=GyBl.Zbxt_work->next;}SzzbxtName();}BOOL CConvert::OnInitDialog(){int i;k_mode=1;CDialog::OnInitDialog();CString sHeading;?慥楤杮?张?序号|点号 | 转换前 X 坐标 | 转换前); 换后标 Y 坐 | X | Y 坐标转换后坐标转m_Grid1.SetFormatString ( sHeading);|度纬 | 号点| 序号?慥楤杮?张?经度 | 转换后 X 坐标 | 转换后 Y 坐标 );m_Grid2.SetFormatString ( sHeading);?慥楤杮?张?序号| 点号 | X 坐标 | Y坐标 | 纬度 | 经度 ); m_Grid3.SetFormatString ( sHeading);?慥楤杮?张?序号| 点号 | B | L | H |X|Y|Z);m_Grid4.SetFormatString ( sHeading);?慥楤杮?张?序号| 点号 | X | Y | Z |B|L|H);m_Grid5.SetFormatString ( sHeading);for( i = 1; i < 8; i++ ){ m_Grid4.SetColWidth(i,1500);m_Grid5.SetColWidth(i,1500);}?慥楤杮?张?序号| 点号 | 转换前 X 坐标 | 转换前 Y 坐标 | 转换后 X 坐标 | 转换后 Y 坐标 );m_Grid6.SetFormatString ( sHeading);?慥楤杮?张?序号| 点号 | 转换前 X 坐标 | 转换前 Y 坐标 | 转换前 Z 坐标 | 转换后 X 坐标 | 转换后 Y 坐标 |转换前 Y 坐标 );m_Grid7.SetFormatString ( sHeading);m_Grid1.SetAllowUserResizing(1);m_Grid2.SetAllowUserResizing(1);m_Grid3.SetAllowUserResizing(1);m_Grid4.SetAllowUserResizing(1);m_Grid5.SetAllowUserResizing(1);m_Grid6.SetAllowUserResizing(1);m_Grid7.SetAllowUserResizing(1);m_Txfs1.SetCheck(1);Szzhfs();GyBl.Zbxt_work= GyBl.Zbxt_head;while (GyBl.Zbxt_work!=NULL)m_Zbxt.AddString(GyBl.Zbxt_work->XtName);m_New_Zbxt.AddString(GyBl.Zbxt_work->XtName);GyBl.Zbxt_work=GyBl.Zbxt_work->next;}SzzbxtName();ReadData();return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE}void CConvert::OnTxfs1(){GyBl.WorkData.Mode=1;Szzhfs();}void CConvert::OnTxfs2(){GyBl.WorkData.Mode=2;Szzhfs();}void CConvert::OnTxfs3(){GyBl.WorkData.Mode=3;Szzhfs();}void CConvert::OnTxfs4(){GyBl.WorkData.Mode=4;Szzhfs();}void CConvert::Szzhfs(){m_c21.EnableWindow(GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2); m_c22.EnableWindow(GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2); m_c23.EnableWindow(GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2); m_c24.EnableWindow(GyBl.WorkData.Mode==3);m_c25.EnableWindow(GyBl.WorkData.Mode==3);m_c26.EnableWindow(GyBl.WorkData.Mode==4);m_c27.EnableWindow(GyBl.WorkData.Mode==4);Szzbxt();}CConvert::Szzbxt(){m_Zbxt.EnableWindow( ((GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2)& &(GyBl.WorkData.Ys[1]+GyBl.WorkData.Ys[2]+GyBl.WorkData.Ys[3]>=1)) || ( (GyBl.WorkData.Mode==3)&&(GyBl.WorkData.Ys[4]+GyBl.WorkData.Ys[5])));m_New_Zbxt.EnableWindow( (GyBl.WorkData.Mode==1||GyBl.WorkData.Mode== 2)&&(GyBl.WorkData.Ys[1]==1) );m_C_New_Zyzwx.EnableWindow( ((GyBl.WorkData.Mode==1||GyBl.WorkData.Mo de==2)&&(GyBl.WorkData.Ys[1]==1)) &&(!strcmp(GyBl.WorkData.New_Zbx?瑘潭敤尬系统保留)) );?晩?瑳捲灭???潗歲慄慴娮硢?瑘潭敤尬系统保留)==0){m_C_Zyzwx.EnableWindow((GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2) &&((GyBl.WorkData.Ys[1]==1||GyBl.WorkData.Ys[3]==1||GyBl.WorkData.Ys[2] ==1) ));}elsem_C_Zyzwx.EnableWindow(FALSE);m_c21.SetCheck(GyBl.WorkData.Ys[1]==1);m_c22.SetCheck(GyBl.WorkData.Ys[2]==1);m_c23.SetCheck(GyBl.WorkData.Ys[3]==1);m_c24.SetCheck(GyBl.WorkData.Ys[4]==1);m_c25.SetCheck(GyBl.WorkData.Ys[5]==1);m_c26.SetCheck(GyBl.WorkData.Ys[6]==1);m_c27.SetCheck(GyBl.WorkData.Ys[7]==1);Szinput();}void CConvert::Ona21(){GyBl.WorkData.Ys[1]=1;if (GyBl.WorkData.Ys[1]==1){GyBl.WorkData.Ys[2]=GyBl.WorkData.Ys[3]=0;}Szzbxt();}void CConvert::Ona22(){GyBl.WorkData.Ys[2]=1;if (GyBl.WorkData.Ys[2]==1){GyBl.WorkData.Ys[1]=GyBl.WorkData.Ys[3]=0;}Szzbxt();}void CConvert::Ona23(){GyBl.WorkData.Ys[3]=1;if (GyBl.WorkData.Ys[3]==1){GyBl.WorkData.Ys[1]=GyBl.WorkData.Ys[2]=0;}Szzbxt();}void CConvert::Ona24(){GyBl.WorkData.Ys[4]=1;if (GyBl.WorkData.Ys[4]==1) GyBl.WorkData.Ys[5]=0; Szzbxt();}void CConvert::Ona25(){GyBl.WorkData.Ys[5]=1;if (GyBl.WorkData.Ys[5]==1) GyBl.WorkData.Ys[4]=0;Szzbxt();}void CConvert::Ona26(){GyBl.WorkData.Ys[6]=1;if (GyBl.WorkData.Ys[6]==1) GyBl.WorkData.Ys[7]=0;Szzbxt();}void CConvert::Ona27(){GyBl.WorkData.Ys[7]=1;if (GyBl.WorkData.Ys[7]==1) GyBl.WorkData.Ys[6]=0;Szzbxt();}CConvert::SzzbxtName(){int i;i=0;GyBl.Zbxt_work= GyBl.Zbxt_head;while (GyBl.Zbxt_work!=NULL){ i++;if (strcmp(GyBl.Zbxt_work->XtName,GyBl.WorkData.Zbxt.XtName)==0) break;GyBl.Zbxt_work=GyBl.Zbxt_work->next;}if (GyBl.Zbxt_work==NULL){i++;GyBl.NewZbxt();strcpy(GyBl.Zbxt_work->XtName,GyBl.WorkData.Zbxt.XtName);strcpy(GyBl.Zbxt_work->Xtmode,GyBl.WorkData.Zbxt.Xtmode);GyBl.Zbxt_work->Ra=GyBl.WorkData.Zbxt.Ra;GyBl.Zbxt_work->Bl=GyBl.WorkData.Zbxt.Bl;GyBl.Zbxt_work->Bl_num=GyBl.WorkData.Zbxt.Bl_num;GyBl.Zbxt_work->Zyzwx=GyBl.WorkData.Zbxt.Zyzwx;GyBl.Zbxt_work->Tyg=GyBl.WorkData.Zbxt.Tyg;GyBl.Zbxt_work->Xp=GyBl.WorkData.Zbxt.Xp;GyBl.Zbxt_work->Yp=GyBl.WorkData.Zbxt.Yp;m_Zbxt.AddString(GyBl.Zbxt_work->XtName);}m_Zbxt.SetCurSel(i-1);strcpy(GyBl.WorkData.Zbxt.Xtmode,GyBl.Zbxt_work->Xtmode);GyBl.WorkData.Zbxt.Ra=GyBl.Zbxt_work->Ra;GyBl.WorkData.Zbxt.Bl=GyBl.Zbxt_work->Bl;GyBl.WorkData.Zbxt.Bl_num=GyBl.Zbxt_work->Bl_num;GyBl.WorkData.Zbxt.Zyzwx=GyBl.Zbxt_work->Zyzwx;GyBl.WorkData.Zbxt.Tyg=GyBl.Zbxt_work->Tyg;GyBl.WorkData.Zbxt.Xp=GyBl.Zbxt_work->Xp;GyBl.WorkData.Zbxt.Yp=GyBl.Zbxt_work->Yp;m_Zyzwx=GyBl.WorkData.Zbxt.Zyzwx;i=0;GyBl.Zbxt_work= GyBl.Zbxt_head;while (GyBl.Zbxt_work!=NULL){ i++;if(strcmp(GyBl.Zbxt_work->XtName,GyBl.WorkData.New_Zbxt.XtName)==0) break;GyBl.Zbxt_work=GyBl.Zbxt_work->next;}if (GyBl.Zbxt_work==NULL){i++;GyBl.NewZbxt();strcpy(GyBl.Zbxt_work->XtName,GyBl.WorkData.New_Zbxt.XtName); strcpy(GyBl.Zbxt_work->Xtmode,GyBl.WorkData.New_Zbxt.Xtmode); GyBl.Zbxt_work->Ra=GyBl.WorkData.New_Zbxt.Ra;GyBl.Zbxt_work->Bl=GyBl.WorkData.New_Zbxt.Bl;GyBl.Zbxt_work->Bl_num=GyBl.WorkData.New_Zbxt.Bl_num;GyBl.Zbxt_work->Zyzwx=GyBl.WorkData.New_Zbxt.Zyzwx;GyBl.Zbxt_work->Tyg=GyBl.WorkData.New_Zbxt.Tyg;GyBl.Zbxt_work->Xp=GyBl.WorkData.New_Zbxt.Xp;GyBl.Zbxt_work->Yp=GyBl.WorkData.New_Zbxt.Yp;m_New_Zbxt.AddString(GyBl.Zbxt_work->XtName);}m_New_Zbxt.SetCurSel(i-1);strcpy(GyBl.WorkData.New_Zbxt.Xtmode,GyBl.Zbxt_work->Xtmode); GyBl.WorkData.New_Zbxt.Ra=GyBl.Zbxt_work->Ra;GyBl.WorkData.New_Zbxt.Bl=GyBl.Zbxt_work->Bl;GyBl.WorkData.New_Zbxt.Bl_num=GyBl.Zbxt_work->Bl_num; GyBl.WorkData.New_Zbxt.Zyzwx=GyBl.Zbxt_work->Zyzwx; GyBl.WorkData.New_Zbxt.Tyg=GyBl.Zbxt_work->Tyg;GyBl.WorkData.New_Zbxt.Xp=GyBl.Zbxt_work->Xp;GyBl.WorkData.New_Zbxt.Yp=GyBl.Zbxt_work->Yp;m_New_Zyzwx=GyBl.WorkData.New_Zbxt.Zyzwx;CWnd::UpdateData(FALSE);Szzbxt();}void CConvert::OnSelchangeNewZBXT(){CString str;m_New_Zbxt.GetLBText(m_New_Zbxt.GetCurSel(),str);strcpy(GyBl.WorkData.New_Zbxt.XtName,str);SzzbxtName();}void CConvert::OnSelchangeZbxt(){CString str;m_Zbxt.GetLBText(m_Zbxt.GetCurSel(),str);strcpy(GyBl.WorkData.Zbxt.XtName,str);SzzbxtName();}CConvert::Szinput(){m_Grid1.ShowWindow(FALSE);m_Grid2.ShowWindow(FALSE);m_Grid3.ShowWindow(FALSE);m_Grid4.ShowWindow(FALSE);m_Grid5.ShowWindow(FALSE);m_Grid6.ShowWindow(FALSE);m_Grid7.ShowWindow(FALSE);if (GyBl.WorkData.Mode==1||GyBl.WorkData.Mode==2){m_Grid1.ShowWindow(GyBl.WorkData.Ys[1]==1);m_Grid2.ShowWindow(GyBl.WorkData.Ys[2]==1);m_Grid3.ShowWindow(GyBl.WorkData.Ys[3]==1);if(GyBl.WorkData.Ys[1]==1) k_mode=1;if(GyBl.WorkData.Ys[2]==1) k_mode=2;if(GyBl.WorkData.Ys[3]==1) k_mode=3;}if (GyBl.WorkData.Mode==3){m_Grid4.ShowWindow(GyBl.WorkData.Ys[4]==1);m_Grid5.ShowWindow(GyBl.WorkData.Ys[5]==1);if(GyBl.WorkData.Ys[4]==1) k_mode=4;if(GyBl.WorkData.Ys[5]==1) k_mode=5;}if (GyBl.WorkData.Mode==4){m_Grid6.ShowWindow(GyBl.WorkData.Ys[6]==1);m_Grid7.ShowWindow(GyBl.WorkData.Ys[7]==1);if(GyBl.WorkData.Ys[6]==1) k_mode=6;if(GyBl.WorkData.Ys[7]==1) k_mode=7;}}BEGIN_EVENTSINK_MAP(CConvert, CDialog)//{{AFX_EVENTSINK_MAP(CConvert)ON_EVENT(CConvert, IDC_Grid1, -600 /* Click */, OnClickGrid1, VTS_NONE) ON_EVENT(CConvert, IDC_Grid2, -600 /* Click */, OnClickGrid1, VTS_NONE) ON_EVENT(CConvert, IDC_Grid3, -600 /* Click */, OnClickGrid1, VTS_NONE) ON_EVENT(CConvert, IDC_Grid4, -600 /* Click */, OnClickGrid1, VTS_NONE) ON_EVENT(CConvert, IDC_Grid5, -600 /* Click */, OnClickGrid1, VTS_NONE) ON_EVENT(CConvert, IDC_Grid1, 71 /* EnterCell */, OnEnterCellGrid1, VTS_NONE)ON_EVENT(CConvert, IDC_Grid2, 71 /* EnterCell */, OnEnterCellGrid1, VTS_NONE)ON_EVENT(CConvert, IDC_Grid3, 71 /* EnterCell */, OnEnterCellGrid1, VTS_NONE)ON_EVENT(CConvert, IDC_Grid4, 71 /* EnterCell */, OnEnterCellGrid1, VTS_NONE)ON_EVENT(CConvert, IDC_Grid5, 71 /* EnterCell */, OnEnterCellGrid1, VTS_NONE)ON_EVENT(CConvert, IDC_Grid1, -603 /* KeyPress */, OnKeyPressGrid1, VTS_PI2)ON_EVENT(CConvert, IDC_Grid2, -603 /* KeyPress */, OnKeyPressGrid1, VTS_PI2)ON_EVENT(CConvert, IDC_Grid3, -603 /* KeyPress */, OnKeyPressGrid1, VTS_PI2)ON_EVENT(CConvert, IDC_Grid4, -603 /* KeyPress */, OnKeyPressGrid1, VTS_PI2)ON_EVENT(CConvert, IDC_Grid5, -603 /* KeyPress */, OnKeyPressGrid1, VTS_PI2)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CConvert::OnClickGrid1(){TransferValue (FALSE);}void CConvert::OnEnterCellGrid1(){TransferValue (FALSE);}void CConvert::OnKeyPressGrid1(short FAR* KeyAscii){switch (k_mode){case 1:m_Grid=&m_Grid1;break;case 2:m_Grid=&m_Grid2;break;case 3:m_Grid=&m_Grid3;break;case 4:m_Grid=&m_Grid4;break;case 5:m_Grid=&m_Grid5;break;}switch ( (int) * KeyAscii) {case VK_BACK : //Backspace - delete the last character m_GridData .Delete (m_GridData .GetLength ()-1,1);break;case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '0':m_GridData = m_GridData + (TCHAR *) KeyAscii; break;case '.':if ((m_GridData.Find('.')==-1))m_GridData = m_GridData + (TCHAR *) KeyAscii;break;case '-':if (m_GridData==\)m_GridData = m_GridData + (TCHAR *) KeyAscii;break;default :if (m_Grid->GetCol()==1)m_GridData = m_GridData + (TCHAR*) KeyAscii;break;}TransferValue (TRUE);}BOOL CConvert::TransferValue(BOOL ToGrid){CString sText;switch (k_mode){case 1:m_Grid=&m_Grid1;break;case 2:m_Grid=&m_Grid2;break;case 3:m_Grid=&m_Grid3;break;case 4:m_Grid=&m_Grid4;break;case 5:m_Grid=&m_Grid5;break;}if (ToGrid){ //Transfer value to Grid from Edit Boxswitch (k_mode){case 1:case 2:case 3:if (m_Grid->GetCol()<4) m_Grid->SetText(m_GridData); break;case 4:case 5:if (m_Grid->GetCol()<5) m_Grid->SetText(m_GridData); break;}} else {m_GridData = m_Grid->GetText ();m_Grid->SetBackColorSel(RGB(0,255,255));m_Grid->SetForeColor(RGB(255,0,0));}return TRUE;}void CConvert::OnInsert(){int i,j,k;CString str;switch (k_mode){case 1:m_Grid=&m_Grid1;break;case 2:m_Grid=&m_Grid2;break;case 3:m_Grid=&m_Grid3;break;case 4:m_Grid=&m_Grid4;break;case 5:m_Grid=&m_Grid5;break;}switch (k_mode){case 1:case 2:case 3:i=m_Grid->GetRow();m_Grid->SetRows(m_Grid->GetRows()+1);for (j=m_Grid->GetRows()-1;j>i+1;j--){for (k=1;k<=5;k++){m_Grid->SetCol(k); m_Grid->SetRow(j-1);str=m_Grid->GetText();m_Grid->SetRow(j);m_Grid->SetText(str);}}str=\;m_Grid->SetCol(1);m_Grid->SetRow(i+1);m_Grid->SetText(str); m_Grid->SetCol(2);m_Grid->SetText(str); m_Grid->SetCol(3);m_Grid->SetText(str);m_Grid->SetCol(4);m_Grid->SetText(str);m_Grid->SetCol(5);m_Grid->SetText(str);break;case 4:case 5:i=m_Grid->GetRow();m_Grid->SetRows(m_Grid->GetRows()+1);for (j=m_Grid->GetRows()-1;j>i+1;j--){for (k=1;k<=7;k++){m_Grid->SetCol(k); m_Grid->SetRow(j-1);str=m_Grid->GetText();m_Grid->SetRow(j);m_Grid->SetText(str);}}str=\;m_Grid->SetCol(1);m_Grid->SetRow(i+1);m_Grid->SetText(str); m_Grid->SetCol(2);m_Grid->SetText(str); m_Grid->SetCol(3);m_Grid->SetText(str);m_Grid->SetCol(4);m_Grid->SetText(str);m_Grid->SetCol(5);m_Grid->SetText(str);m_Grid->SetCol(6);m_Grid->SetText(str);m_Grid->SetCol(7);m_Grid->SetText(str);break;}}void CConvert::OnDelete(){int i,j,k;CString str;switch (k_mode){case 1:m_Grid=&m_Grid1;break;case 2:m_Grid=&m_Grid2;break;case 3:m_Grid=&m_Grid3;break;case 4:m_Grid=&m_Grid4;break;case 5:m_Grid=&m_Grid5;break;}switch (k_mode){case 1:case 2:case 3:i=m_Grid->GetRow();if (i==0) break;m_Grid->SetCol(1); m_Grid->SetRow(i); str=m_Grid->GetText();瑳?确认删除 +str;if (AfxMessageBox(str,MB_YESNO)==IDYES){for (j=i+1;jGetRows();j++){for (k=1;k<=5;k++){m_Grid->SetCol(k); m_Grid->SetRow(j);str=m_Grid->GetText();m_Grid->SetRow(j-1);m_Grid->SetText(str);}}m_Grid->SetRows(m_Grid->GetRows()-1);}break;case 4:case 5:i=m_Grid->GetRow();if (i==0) break;m_Grid->SetCol(1); m_Grid->SetRow(i); str=m_Grid->GetText();瑳?确认删除 +str;if (AfxMessageBox(str,MB_YESNO)==IDYES){for (j=i+1;jGetRows();j++){for (k=1;k<=7;k++){m_Grid->SetCol(k); m_Grid->SetRow(j); str=m_Grid->GetText();m_Grid->SetRow(j-1); m_Grid->SetText(str);}}m_Grid->SetRows(m_Grid->GetRows()-1);}break;}}void CConvert::OnOK(){// TODO: Add extra validation hereWriteData();CDialog::OnOK();}double CConvert::CallL0(double l,int mode){double d0,l0;d0=l*180.0/PI;// double xxx;l0=0;if (mode==0) GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;else GyBl.Zbxt_work= &GyBl.WorkData.New_Zbxt; //中央子午线计算椠?猨牴浣?祇求娮硢彴潷歲?瑘潭敤尬自定义坐标系统)==0){l0=GyBl.Zbxt_work->Zyzwx;l0=Deg(l0);// xxx=GyBl.Zbxt_work->Yp;}else{// xxx=500000.000;{// int tt;// 3度 6度计算CWnd::UpdateData(TRUE);if (mode==0)l0=m_Zyzwx;else l0=m_New_Zyzwx;}}l0=l0 *PI/180;//vSetSystem(WorkSpaceData.Zbxt.Ra,1/WorkSpaceData.Zbxt.Bl,0,l0,0,xxx,1 );return l0;}double CConvert::Deg(double a2){double d;double du,fen,miao;double nn;if (a2<0) { nn=-1;a2=-a2;} else nn=1;du=floor(a2); fen=floor((a2-du)*100);miao=((a2-du)*100-fen)*100;if (miao>=60) { fen++;miao=0;if (fen>=60) { fen=0;du++;}}d=du+fen/60+miao/3600;d=d*nn;return(d);}double CConvert::Dfm(double a2){double d;double du,fen,miao;double nn;if (a2<0) { nn=-1;a2=-a2;} else nn=1;du=floor(a2);fen=floor((a2-du)*60);miao=((a2-du)*60-fen)*60;if ((miao+0.00001)>=60) { fen++;miao=0;if (fen>=60) { fen=0;du++;}}d=du+fen/100+miao/10000;d=d*nn;return(d);}void CConvert::ReadData(){int i,j,k;char buf[100];double xx;m_Grid1.SetRows(1);m_Grid2.SetRows(1);m_Grid3.SetRows(1);m_Grid4.SetRows(1);m_Grid5.SetRows(1);m_Grid6.SetRows(1);m_Grid7.SetRows(1);FILE *in;in =fopen (data,+);if (in!=NULL){//m_Grid1fread(&j,sizeof(int),1,in);m_Grid1.SetRows(j);for (i=0;i<J-1;I++){m_Grid1.SetRow(i+1);for (k=1;k<=5;k++){if (k==1) fread(buf,20,1,in);else { fread(&xx,sizeof(double),1,in);if (xx!=0) sprintf(buf,%.3f,xx); else strcpy(buf,\);}m_Grid1.SetCol(k); m_Grid1.SetText(buf);}}//m_Grid2fread(&j,sizeof(int),1,in);m_Grid2.SetRows(j);for (i=0;i<J-1;I++){m_Grid2.SetRow(i+1);for (k=1;k<=5;k++){if (k==1) fread(buf,20,1,in);else { fread(&xx,sizeof(double),1,in); if (xx!=0){if (k<=3)sprintf(buf,%.8f,xx);elsesprintf(buf,%.3f,xx);}else strcpy(buf,\);}m_Grid2.SetCol(k); m_Grid2.SetText(buf); }}//m_Grid3fread(&j,sizeof(int),1,in);m_Grid3.SetRows(j);for (i=0;i<J-1;I++){m_Grid3.SetRow(i+1);for (k=1;k<=5;k++){if (k==1) fread(buf,20,1,in);else { fread(&xx,sizeof(double),1,in); if (xx!=0){if (k<=3)sprintf(buf,%.3f,xx);elsesprintf(buf,%.8f,xx);}else strcpy(buf,\);}m_Grid3.SetCol(k); m_Grid3.SetText(buf); }}//m_Grid4fread(&j,sizeof(int),1,in);m_Grid4.SetRows(j);for (i=0;i<J-1;I++){m_Grid4.SetRow(i+1);for (k=1;k<=7;k++){if (k==1) fread(buf,20,1,in);else { fread(&xx,sizeof(double),1,in); if (xx!=0){if (k<=3)sprintf(buf,%.8f,xx);elsesprintf(buf,%.3f,xx);}else strcpy(buf,\);}m_Grid4.SetCol(k); m_Grid4.SetText(buf); }}//m_Grid5fread(&j,sizeof(int),1,in);m_Grid5.SetRows(j);for (i=0;i<J-1;I++){m_Grid5.SetRow(i+1);for (k=1;k<=7;k++){if (k==1) fread(buf,20,1,in);else { fread(&xx,sizeof(double),1,in); if (xx!=0){if ((k<=4)||(k==7))sprintf(buf,%.3f,xx);elsesprintf(buf,%.8f,xx);}else strcpy(buf,\);}m_Grid5.SetCol(k); m_Grid5.SetText(buf); }}fclose(in);}}void CConvert::WriteData(){int i,j,k;CString str;double xx;FILE *in;in =fopen (data,w+);//m_Grid1j=m_Grid1.GetRows();fwrite(&j,sizeof(int),1,in);for (i=0;i<J-1;I++){m_Grid1.SetRow(i+1);for (k=1;k<=5;k++){m_Grid1.SetCol(k); str=m_Grid1.GetText(); xx=atof(str);if (k==1) fwrite(str,20,1,in);else fwrite(&xx,sizeof(double),1,in); }}//m_Grid2j=m_Grid2.GetRows();fwrite(&j,sizeof(int),1,in);for (i=0;i<J-1;I++){m_Grid2.SetRow(i+1);for (k=1;k<=5;k++){m_Grid2.SetCol(k); str=m_Grid2.GetText(); xx=atof(str);if (k==1) fwrite(str,20,1,in);else fwrite(&xx,sizeof(double),1,in); }}//m_Grid3j=m_Grid3.GetRows();fwrite(&j,sizeof(int),1,in);for (i=0;i<J-1;I++){m_Grid3.SetRow(i+1);for (k=1;k<=5;k++){m_Grid3.SetCol(k); str=m_Grid3.GetText(); xx=atof(str);if (k==1) fwrite(str,20,1,in);else fwrite(&xx,sizeof(double),1,in); }}//m_Grid4j=m_Grid4.GetRows();fwrite(&j,sizeof(int),1,in);for (i=0;i<J-1;I++){m_Grid4.SetRow(i+1);for (k=1;k<=7;k++){m_Grid4.SetCol(k); str=m_Grid4.GetText(); xx=atof(str);if (k==1) fwrite(str,20,1,in);else fwrite(&xx,sizeof(double),1,in); }}//m_Grid5j=m_Grid5.GetRows();fwrite(&j,sizeof(int),1,in);for (i=0;i<J-1;I++){m_Grid5.SetRow(i+1);for (k=1;k<=7;k++){m_Grid5.SetCol(k); str=m_Grid5.GetText();xx=atof(str);if (k==1) fwrite(str,20,1,in);else fwrite(&xx,sizeof(double),1,in);}}fclose(in);}void CConvert::Changejs(){CString str;double L0,L1;// double yyy,yyy1;double x1,y1,z1,x2,y2;double b1,l1,h1;//,b2,l2;int i,j;double MM;if (GyBl.WorkData.Mode==2)MM=0.9996;elseMM=1;switch (k_mode){case 1:L0=CallL0(0,0);j=m_Grid1.GetRows();for (i=0;i<J-1;I++){m_Grid1.SetRow(i+1);m_Grid1.SetCol(2); str=m_Grid1.GetText();x1=atof(str);m_Grid1.SetCol(3); str=m_Grid1.GetText();y1=atof(str);GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L0, GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg);Converting.XYBL(x1,y1,&b1,&l1);L1=CallL0(l1,1);GyBl.Zbxt_work= &GyBl.WorkData.New_Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L1,GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg); Converting.BLXY(b1,l1,&x2,&y2);m_Grid1.SetCol(4);str.Format(%.3f,x2);m_Grid1.SetText(str);m_Grid1.SetCol(5);str.Format(%.3f,y2);m_Grid1.SetText(str);}break;case 2:j=m_Grid2.GetRows();for (i=0;i<J-1;I++){m_Grid2.SetRow(i+1);m_Grid2.SetCol(2); str=m_Grid2.GetText();b1=Deg(atof(str));m_Grid2.SetCol(3); str=m_Grid2.GetText();l1=Deg(atof(str));L1=CallL0(l1,0);//转换为幅度GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L1,GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg); Converting.BLXY(b1*PI/180,l1*PI/180,&x2,&y2);m_Grid2.SetCol(4); str.Format(%.3f,x2);m_Grid2.SetText(str);m_Grid2.SetCol(5);str.Format(%.3f,y2);m_Grid2.SetText(str);}break;case 3:L0=CallL0(0,0);j=m_Grid3.GetRows();for (i=0;i<J-1;I++){m_Grid3.SetRow(i+1);m_Grid3.SetCol(2); str=m_Grid3.GetText();x1=atof(str);m_Grid3.SetCol(3); str=m_Grid3.GetText();y1=atof(str);GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L0,GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg); Converting.XYBL(x1,y1,&b1,&l1);m_Grid3.SetCol(4);str.Format(%.8f,Dfm(b1*180/PI));m_Grid3.SetText(str);m_Grid3.SetCol(5);str.Format(%.8f,Dfm(l1*180/PI));m_Grid3.SetText(str);}break;case 4:L0=CallL0(0,0);j=m_Grid4.GetRows();for (i=0;i<J-1;I++){m_Grid4.SetRow(i+1);m_Grid4.SetCol(2); str=m_Grid4.GetText();b1=atof(str);m_Grid4.SetCol(3); str=m_Grid4.GetText();l1=atof(str);m_Grid4.SetCol(4); str=m_Grid4.GetText();h1=atof(str);GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L0,GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg); Converting.BLHXYZ(Deg(b1)*PI/180,Deg(l1)*PI/180,h1,&x1,&y1,&z1);m_Grid4.SetCol(5);str.Format(%.3f,x1);m_Grid4.SetText(str);m_Grid4.SetCol(6);str.Format(%.3f,y1);m_Grid4.SetText(str);m_Grid4.SetCol(7);str.Format(%.3f,z1);m_Grid4.SetText(str);}break;case 5:L0=CallL0(0,0);j=m_Grid5.GetRows();for (i=0;i<J-1;I++){m_Grid5.SetRow(i+1);m_Grid5.SetCol(2); str=m_Grid5.GetText();x1=atof(str);m_Grid5.SetCol(3); str=m_Grid5.GetText();y1=atof(str);m_Grid5.SetCol(4); str=m_Grid5.GetText();z1=atof(str);GyBl.Zbxt_work= &GyBl.WorkData.Zbxt;// 长半径扁率中央纬度经度 Y 正家 X 增加比例投影高Converting.vSetSystem(GyBl.Zbxt_work->Ra,GyBl.Zbxt_work->Bl,0,L0,GyBl.Zbxt_work->Xp,GyBl.Zbxt_work->Yp,MM,GyBl.Zbxt_work->Tyg);Converting.XYZBLH(x1,y1,z1,&b1,&l1,&h1);m_Grid5.SetCol(5);str.Format(%.8f,Dfm(b1*180/PI));m_Grid5.SetText(str);m_Grid5.SetCol(6);str.Format(%.8f,Dfm(l1*180/PI));m_Grid5.SetText(str);m_Grid5.SetCol(7); str.Format(%.3f,h1);m_Grid5.SetText(str);}break;}}void CConvert::Onchange(){Changejs();}void CConvert::OnInput(){// int i,j,k;char buf[255],*po;// double xx;CFileDialog dlgFile(TRUE, *, NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, ????????导入数据 (*.*)|*.*||, NULL);if ( dlgFile.DoModal() != IDOK ) return ;// RET=main(dlgFile.GetPathName());FILE *in;switch (k_mode){case 1:break;case 2:m_Grid2.SetRows(1);in=fopen(dlgFile.GetPathName(),+);if (in==NULL) break;while (!feof(in)){if (fgets(buf,254,in)==NULL) break;if (strlen(buf)>10){。
使用GPS测绘技术进行坐标转换的操作步骤

使用GPS测绘技术进行坐标转换的操作步骤随着科技的发展,GPS(全球定位系统)已经成为现代测绘工作中不可或缺的工具。
它能够在地球上的任何一个角落确定位置,并提供高精度的坐标数据。
坐标转换是GPS测绘技术中一个重要的环节,本文将介绍使用GPS进行坐标转换的操作步骤。
第一步:确定目标坐标系和参考椭球体模型在进行坐标转换之前,我们首先需要确定目标坐标系和参考椭球体模型。
常用的目标坐标系有WGS84、GCJ-02等,而参考椭球体模型则通常选用WGS84参考椭球体。
第二步:收集原始数据在进行坐标转换之前,我们需要先收集到要转换的坐标数据。
这些原始数据可以通过GPS设备、导航软件、地理信息系统等方式获取。
第三步:数据预处理收集到的原始数据可能存在一定的误差和不精确性,因此在进行坐标转换之前,我们需要对数据进行预处理。
这包括进行数据清理、筛选、校正等工作,以提高测量精度。
第四步:选择合适的坐标转换方法根据所需的转换精度和实际情况,我们需要选择合适的坐标转换方法。
常用的转换方法有三参数转换、七参数转换、Molodensky转换等。
选择适当的转换方法是保证坐标转换结果准确性的关键。
第五步:进行坐标转换计算在确定了转换方法之后,我们就可以进行坐标转换的计算了。
根据所选转换方法的不同,我们需要进行相应的数学计算和推导,将原始坐标转换为目标坐标。
第六步:验证转换结果完成坐标转换之后,我们需要对结果进行验证,以确保转换的准确性。
可以通过比对转换后的坐标与已知坐标进行对照,或者进行误差分析等方法,判断转换结果的可靠性。
第七步:修正和优化在验证过程中,如果发现了转换结果的问题,我们需要对原始数据和转换方法进行修正和优化。
这可能包括重新收集数据、调整转换参数、选择其他转换方法等操作。
通过以上步骤,我们可以完成对GPS测绘数据的坐标转换工作。
GPS测绘技术的应用广泛,无论是地理信息系统、导航软件,还是工程测量领域,都需要进行坐标转换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
坐标转换源代码--GPS定位程序(C++)GPS数据处理中为了满足不同的需要,处理的数据要进行坐标转换,得到在不同坐标系统下的结果,下面是笛卡尔坐标系,大地坐标系,站心地平坐标系(线型和极坐标形式)之间的转换源代码:头文件:#ifndef _COORDCOVERT_H#define _COORDCOVERT_H#include "stdlib.h"//WGS-84椭球体参数const double a=6378137.0;//长半轴const double flattening=1/298.257223563;//扁率const double delta=0.0000001;typedef struct tagCRDCARTESIAN{double x;double y;double z;}CRDCARTESIAN;typedef CRDCARTESIAN *PCRDCARTESIAN;//笛卡尔坐标系typedef struct tagCRDGEODETIC{double longitude;double latitude;double height;}CRDGEODETIC;typedef CRDGEODETIC *PCRDGEODETIC;//大地坐标系typedef struct tagCRDTOPOCENTRIC{double northing;double easting;double upping;}CRDTOPOCENTRIC;typedef CRDTOPOCENTRIC *PCRDTOPOCENTRIC; //站心地平坐标系(线坐标形式)typedef struct tagCRDTOPOCENTRICPOLAR{ double range;double azimuth;double elevation;}CRDTOPOCENTRICPOLAR;typedef CRDTOPOCENTRICPOLAR *PCRDTOPOCENTRICPOLAR;//站心地平坐标系(极坐标形式)//由笛卡尔坐标转换为大地坐标void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc, double dSemiMajorAxis, double dFlattening);//pcg:指向所转换出的大地坐标的指针;//pcc:指向待转换的笛卡尔坐标的指针;//dSemiMajorAxis:参考椭球的长半轴;//dFlattening:参考椭球的扁率。
//由大地坐标转换为笛卡尔坐标void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg, double dSemiMajorAxis, double dFlattening);//pcc:指向所转换出的笛卡尔坐标的指针;//pcg:指向待转换的大地坐标的指针;//dSemiMajorAxis:参考椭球的长半轴;//dFlattening:参考椭球的扁率。
//由笛卡尔坐标转换为站心地平坐标void CartesianToTopocentric (PCRDTOPOCENTRIC pct,PCRDCARTESIAN pcc,PCRDCARTESIAN pccCenter,double dSemiMajorAxis,double dFlattening);//pct:指向所转换出的站心地平坐标的指针;//pcc:指向待转换的笛卡尔坐标的指针;//pccCenter:指向站心的笛卡尔坐标的指针;//dSemiMajorAxis:参考椭球的长半轴;//dFlattening:参考椭球的扁率。
//由站心地平直角坐标转换为站心地平极坐标void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp, PCRDTOPOCENTRIC pct);//pctp:指向所转换出的站心地平极坐标的指针;//pct:指向待转换的站心地平坐标的指针;//由站心地平极坐标转换为站心地平直角坐标void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,PCRDTOPOCENTRICPOLAR pctp);//pct:指向所转换的站心地平坐标的指针;//pctp:指向待转换的站心地平极坐标的指针;#endif源文件:#include "CoordCovert.h"#include "math.h"void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc, double dSemiMajorAxis, double dFlattening){double e2;//第一偏心率的平方e2=2*dFlattening-dFlattening*dFlattening;pcg->longitude=atan(pcc->y/pcc->x);double W,N,N1=0,B,B1;B1=atan(pcc->z/sqrt(pcc->x*pcc->x+pcc->y*pcc->y));while(1){W=sqrt(1-e2*sin(B1)*sin(B1));N1=dSemiMajorAxis/W;B=atan((pcc->z+N1*e2*sin(B1))/sqrt(pcc->x*pcc->x+pcc->y*pcc->y));if(fabs(B-B1)<delta)break;elseB1=B;}pcg->latitude=B;N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude)); pcg->height=sqrt(pcc->x*pcc->x+pcc->y*pcc->y)/cos(B)-N;}//由大地坐标转换为笛卡尔坐标void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg, double dSemiMajorAxis, double dFlattening){double e2;//第一偏心率的平方double N;//卯酉圈半径e2=2*dFlattening-dFlattening*dFlattening;N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude));pcc->x=(N+pcg->height)*cos(pcg->latitude)*cos(pcg->longitude); pcc->y=(N+pcg->height)*cos(pcg->latitude)*sin(pcg->longitude); pcc->z=(N*(1-e2)+pcg->height)*sin(pcg->latitude);}//由笛卡尔坐标转换为站心地平坐标void CartesianToTopocentric (PCRDTOPOCENTRIC pct, PCRDCARTESIAN pcc,PCRDCARTESIAN pccCenter,double dSemiMajorAxis,double dFlattening){double dx,dy,dz;dx=pcc->x-pccCenter->x;dy=pcc->y-pccCenter->y;dz=pcc->z-pccCenter->z;PCRDGEODETIC pd;pd=(PCRDGEODETIC)malloc(sizeof(CRDGEODETIC));CartesianToGeodetic (pd,pccCenter,dSemiMajorAxis,dFlattening);pct->northing=-sin(pd->latitude)*cos(pd->longitude)*dx-sin(pd->latitude)*sin(pd->longitude)*dy+cos(pd->latitude)*dz;pct->easting=-sin(pd->longitude)*dx+cos(pd->longitude)*dy;pct->upping=cos(pd->latitude)*cos(pd->longitude)*dx+cos(pd->latitude)*sin(pd->longitude)*dy+sin(pd->latitude)*dz;free(pd);}//由站心地平直角坐标转换为站心地平极坐标void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp, PCRDTOPOCENTRIC pct){pctp->range=sqrt(pct->northing*pct->northing+pct->easting*pct->easting+pct->upping*pct->upping);pctp->azimuth=atan(pct->easting/pct->northing);pctp->elevation=asin(pct->upping/pctp->range);}//由站心地平极坐标转换为站心地平直角坐标void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct, PCRDTOPOCENTRICPOLAR pctp){pct->northing=pctp->range*cos(pctp->elevation)*cos(pctp->azimuth); pct->easting=pctp->range*cos(pctp->elevation)*sin(pctp->azimuth); pct->upping=pctp->range*sin(pctp->elevation);}。