坐标转换源代码--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测绘技术的应用广泛,无论是地理信息系统、导航软件,还是工程测量领域,都需要进行坐标转换。
GPS编码格式及C语言解码
GPS编码格式及C语⾔解码有关磁偏⾓和地图定位的问题:地图的⽅向:上北、下南、左西、右东是⼤多数地图的⽅向,但这可不是通⽤原则,如果地图上有⽅向标,可以通过⽅向标了解到这些。
地磁极是接近南极和北极的,但并不和南极、北极重合,⼀个约在北纬72°、 西经96°处;⼀个约在南纬70°、东经150°处。
磁北极距地理北极⼤约相差1500km。
现在磁北极的位置在加拿⼤北⽅,在⼀天中磁北极的位置也是不停的变动,它的轨迹⼤致为⼀椭圆形,磁北极平均每天向北以40m。
⽬前磁北极正在逐渐离开加拿⼤,⼤约于2005年进⼊俄罗斯境内。
东经25度地区,磁偏⾓在1-2度之间;北纬25度以上地区,磁偏⾓⼤于2度;若在西经低纬度地区,磁偏⾓是5-20度;西经45度以上,磁偏⾓为25-50度。
在我国,正常情况下,磁偏⾓最⼤可达6度,⼀般情况为2-3度。
在我国除部分磁⼒异常的地⽅外,⼀般磁偏⾓都是西偏。
磁偏⾓还是不断有规律变化的,地图上的磁偏⾓只是测图时的磁偏⾓(磁北⽐真北偏左,加上磁偏⾓;磁北⽐真北偏右,减去磁偏⾓;在我国⼀般是加上)。
使⽤地图本⾝所注的磁偏⾓要注意出版年限,地图太⽼误差较⼤。
GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释$GPGGA例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息字段1:UTC 时间,hhmmss.sss,时分秒格式字段2:纬度ddmm.mmmm,度分格式(前导位数不⾜则补0)字段3:纬度N(北纬)或S(南纬)字段4:经度dddmm.mmmm,度分格式(前导位数不⾜则补0)字段5:经度E(东经)或W(西经)字段6:GPS状态,0=未定位,1=⾮差分定位,2=差分定位,3=⽆效PPS,6=正在估算字段7:正在使⽤的卫星数量(00 - 12)(前导位数不⾜则补0)字段8:HDOP⽔平精度因⼦(0.5 - 99.9)字段9:海拔⾼度(-9999.9 - 99999.9)字段10:地球椭球⾯相对⼤地⽔准⾯的⾼度字段11:差分时间(从最近⼀次接收到差分信号开始的秒数,如果不是差分定位将为空)字段12:差分站ID号0000 - 1023(前导位数不⾜则补0,如果不是差分定位将为空)字段13:校验值$GPGLL例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息字段1:纬度ddmm.mmmm,度分格式(前导位数不⾜则补0)字段2:纬度N(北纬)或S(南纬)字段3:经度dddmm.mmmm,度分格式(前导位数不⾜则补0)字段4:经度E(东经)或W(西经)字段5:UTC时间,hhmmss.sss格式字段6:状态,A=定位,V=未定位字段7:校验值$GPGSA例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息字段1:定位模式,A=⾃动⼿动2D/3D,M=⼿动2D/3D字段2:定位类型,1=未定位,2=2D定位,3=3D定位字段3:PRN码(伪随机噪声码),第1信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段4:PRN码(伪随机噪声码),第2信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段5:PRN码(伪随机噪声码),第3信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段6:PRN码(伪随机噪声码),第4信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段7:PRN码(伪随机噪声码),第5信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段8:PRN码(伪随机噪声码),第6信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段9:PRN码(伪随机噪声码),第7信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段10:PRN码(伪随机噪声码),第8信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段11:PRN码(伪随机噪声码),第9信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段12:PRN码(伪随机噪声码),第10信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段13:PRN码(伪随机噪声码),第11信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段14:PRN码(伪随机噪声码),第12信道正在使⽤的卫星PRN码编号(00)(前导位数不⾜则补0)字段15:PDOP综合位置精度因⼦(0.5 - 99.9) 字段16:HDOP⽔平精度因⼦(0.5 - 99.9)字段17:VDOP垂直精度因⼦(0.5 - 99.9)字段18:校验值$GPGSV例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息字段1:本次GSV语句的总数⽬(1 - 3)字段2:本条GSV语句是本次GSV语句的第⼏条(1 - 3)字段3:当前可见卫星总数(00 - 12)(前导位数不⾜则补0)字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不⾜则补0)字段5:卫星仰⾓(00 - 90)度(前导位数不⾜则补0)字段6:卫星⽅位⾓(00 - 359)度(前导位数不⾜则补0)字段7:信噪⽐(00-99)dbHz字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不⾜则补0)字段9:卫星仰⾓(00 - 90)度(前导位数不⾜则补0)字段10:卫星⽅位⾓(00 - 359)度(前导位数不⾜则补0)字段11:信噪⽐(00-99)dbHz字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不⾜则补0)字段13:卫星仰⾓(00 - 90)度(前导位数不⾜则补0)字段14:卫星⽅位⾓(00 - 359)度(前导位数不⾜则补0)字段15:信噪⽐(00-99)dbHz字段16:校验值$GPRMC例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最⼩定位信息 字段1:UTC时间,hhmmss.sss格式字段2:状态,A=定位,V=未定位字段3:纬度ddmm.mmmm,度分格式(前导位数不⾜则补0)字段4:纬度N(北纬)或S(南纬)字段5:经度dddmm.mmmm,度分格式(前导位数不⾜则补0)字段6:经度E(东经)或W(西经)字段7:速度,节,Knots字段8:⽅位⾓,度字段9:UTC⽇期,DDMMYY格式字段10:磁偏⾓,(000 - 180)度(前导位数不⾜则补0)字段11:磁偏⾓⽅向,E=东W=西字段16:校验值$GPVTG例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地⾯速度信息字段1:运动⾓度,000 - 359,(前导位数不⾜则补0)字段2:T=真北参照系字段3:运动⾓度,000 - 359,(前导位数不⾜则补0)字段4:M=磁北参照系字段5:⽔平运动速度(0.00)(前导位数不⾜则补0)字段6:N=节,Knots字段7:⽔平运动速度(0.00)(前导位数不⾜则补0)字段8:K=公⾥/时,km/h字段9:校验值GPS编码格式及C语⾔解码GPS接收机只要处于⼯作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串⼝传送到计算机中。
GPS卫星位置计算(C语言)
#include <stdio.h>#include <math.h>#include <stdlib.h>#define bGM84 3.986005e14#define bOMEGAE84 7.2921151467e-5void main(){long double roota=0.515365263176E+04; //轨道长半轴的平方根(根号a)long double toe=0.720000000000E+04; //观测时刻toelong double m0=-0.290282040486E+00; //参考时刻toe的平近点角long double e=0.678421219345E-02; //轨道偏心率elong double delta_n=0.451411660250E-08;//卫星的摄动改正数△nlong double smallomega=-0.258419417299E+01;//近地点角距ωlong double cus=0.912137329578E-05;//纬度幅角正弦调和项改正的振幅(弧度)long double cuc=0.189989805222E-06;//纬度幅角余弦调和项改正的振幅(弧度)long double crs=0.406250000000E+01;//轨道半径的余弦调和项改正的振幅(m)long double crc=0.201875000000E+03;//轨道半径的正弦调和项改正的振幅(m)long double cis=0.949949026108E-07;//轨道倾角的余弦调和项改正的振幅(弧度)long double cic=0.130385160446E-07;//轨道倾角的正弦调和项改正的振幅(弧度)long double idot=-0.253939149013E-09;//轨道倾角变化率Ilong double i0=0.958512160302E+00; //轨道倾角(弧度)long double bigomega0=-0.137835982556E+01;//升交点赤经long double earthrate=bOMEGAE84; //地球自转的速率welong double bigomegadot=-0.856928551657e-08;long double t=0.720000000000E+04; //加入卫星钟差改正的归化时间long double A;long double n0=0,n,tk;long double mk,ek,tak,ik,omegak,phik,uk,rk;long double corr_u,corr_r,corr_i;long double xpk,ypk,xk,yk,zk;int i;printf("输入的数据:\n");printf("√a=%e \n",roota);printf("toe=%e \n",toe);printf("e=%e \n",e);printf("i0=%e \n",i0);printf("ω=%e \n",smallomega);printf("△n=%e \n",delta_n);printf("Ω0=%e \n",bigomega0);printf("I=%e \n",idot);printf("Cuc=%e \n",cuc);printf("Cus=%e \n",cus);printf("Crc=%e \n",crc);printf("Crs=%e \n",crs);printf("Cic=%e \n",cic);printf("Cis=%e \n",cis);printf("\n\n输出的结果为:\n",e);A=roota*roota;n0=sqrt(bGM84/(A*A*A));//平均角速度n0printf("n0=%.10lf \n",n0);tk=t-toe;//相对于参考时刻toe的归化时间tkprintf("tk=%.10lf \n",tk);n=n0+delta_n;//加摄动改正后的卫星平均角速度printf(" n=%.10lf \n",n);mk=m0+n*tk;//卫星平近点角printf("mk=%.10lf \n",mk);ek=mk;for(i=0;i<10;i++) ek=mk+e*sin(ek);//利用迭代法求偏近点角ekprintf("ek=%.10lf \n",ek);tak=atan2(sqrt(1.0-e*e)*sin(ek)/cos(ek)-e);//真近点角Vk的计算printf("Vk=%.10lf \n",tak);phik=tak+smallomega;//升交距角φk的计算printf("φk=%.10lf \n",phik);corr_u=cus*sin(2.0*phik)+cuc*cos(2.0*phik);//升交距角u的摄动改正δu printf("δu=%.10lf \n",corr_u);corr_r=crs*sin(2.0*phik)+crc*cos(2.0*phik);//卫星矢量r的摄动改正δr printf("δr=%.10lf \n",corr_r);corr_i=cis*sin(2.0*phik)+cic*cos(2.0*phik);//轨道倾角i的摄动改正δi printf("δi=%.10lf \n",corr_i);uk=phik+corr_u;//升交距角uprintf("uk=%.10lf \n",uk);rk=A*(1.0-e*cos(ek))+corr_r;//卫星矢量rprintf("rk=%.10lf \n",rk);ik=i0+idot*tk+corr_i;//轨道倾角iprintf("ik=%.10lf \n",ik);xpk=rk*cos(uk);//卫星在轨道平面坐标系的坐标ypk=rk*sin(uk);printf("xpk=%.10lf \n",xpk);printf("ypk=%.10lf \n",ypk);omegak=bigomega0+(bigomegadot-earthrate)*tk-earthrate*toe;//升交点经度Ωk的计算printf("Ωk=%.10lf \n\n",omegak);xk=xpk*cos(omegak)-ypk*sin(omegak)*cos(ik);//地心固定坐标系的直角坐标yk=xpk*sin(omegak)+ypk*cos(omegak)*cos(ik);zk=ypk*sin(ik);printf("Xk=%.4lf \n",xk);printf("Yk=%.4lf \n",yk);printf("Zk=%.4lf \n",zk);}。
gps坐标怎么转换
GPS坐标的转换方法1. 介绍GPS(Global Positioning System)全球定位系统是一种由美国提供的导航系统,通过一系列卫星和地面设施确定地球上的位置。
GPS坐标是一种用于标识地理位置的方式,由纬度(Latitude)和经度(Longitude)组成。
在实际应用中,我们可能需要将GPS坐标转换为其他常见的坐标系,如百度坐标系、火星坐标系等。
本文将介绍几种常见的GPS坐标转换方法。
2. WGS84坐标系WGS84坐标系是最广泛使用的GPS坐标系统,它是由全球卫星定位系统所采用的基准系统。
WGS84坐标系下的纬度范围是-90到90,经度范围是-180到180。
3. 百度坐标系百度坐标系是由百度地图采用的一种地理坐标系统。
与WGS84坐标系相比,百度坐标系使用的是BD-09偏移算法,将GPS坐标进行了适量的平移和旋转。
在百度坐标系下,纬度和经度的范围与WGS84坐标系相同。
4. 火星坐标系火星坐标系,也称为国测局坐标系(GCJ-02),是中国国家测绘局在保护国家安全的目的下对GPS数据进行了加密偏移处理的结果。
火星坐标系下的纬度和经度范围与WGS84坐标系相同。
5. GPS坐标转百度坐标将GPS坐标转换为百度坐标可以通过使用百度地图提供的开放API接口实现。
这些API接口可以将GPS坐标作为输入,返回对应的百度坐标。
具体实现方法可以参考百度地图开发者文档中的相关说明。
6. GPS坐标转火星坐标将GPS坐标转换为火星坐标可以使用国测局坐标加密算法实现。
这个算法可以对WGS84坐标进行加密处理,得到火星坐标系下的坐标。
目前有许多开源库可以用于实现此功能,如百度地图的coordtransform库。
7. 火星坐标转GPS坐标将火星坐标转换为GPS坐标可以使用逆加密算法进行。
逆加密算法可以将火星坐标系下的坐标还原为WGS84坐标系下的坐标。
同样,许多开源库可以用于实现此功能。
8. 总结GPS坐标的转换是地理信息处理中的常见问题。
关于手持GPS接收机坐标转换
手持GPS接收机坐标转换GPS卫星星历是以WGS-84大地坐标系为根据而建立的,所以手持式GPS使用的坐标系统是WGS-84坐标系统。
目前,市面上出售的手持GPS所使用的坐标系统基本都是WGS-84坐标系统,而我们使用的地图资源大部分都属于1954年北京坐标系或1980年西安国家大地坐标系。
不同的坐标系统给我们的使用带来了困难,于是就出现了如何把WGS-84坐标转换到1954北京坐标系或1980西安国家大地坐标系上来的问题。
大家知道,不同坐标系之间存在着平移和旋转的关系,要使手持GPS所测量的数据转换为自己需要的坐标,必须求出两个坐标系(WGS-84和北京54坐标系或西安80坐标系)之间的转换参数。
因此,如果您最后希望得到的不是WGS-84坐标系数据,必须进行坐标转换,输入相应的坐标转换参数。
只要用户计算出五个转换参数(D X、DY、DZ、DA、DF)并按提示输入GPS中,即可在GPS仪器上自动进行坐标转换,得出该点对应的北京54坐标系(或西安80坐标系)的坐标值。
下面以北京54坐标系为例,求手持GPS接收机坐标转换五个参数的方法。
一.收集应用区域内高等级控制点资料在应用手持GPS接收机取土的区域内(如一个县)找出三个(或以上)分布均匀的等级点(精度越高越好)或GPS“B”级网网点,点位最好是周围无电磁波干扰,视野开阔,卫星信号强。
到当地的测绘管理部门(如:本地测绘局、测绘院)抄取这些点的北京54坐标系的高斯平面直角坐标(x、y),高程h 和WGS-84坐标系的大地经纬度(B、L),大地高H。
二.求坐标转换参数将上述获得的控制点的坐标数据提供给技术支持单位北京合众思壮公司各地分公司相关负责人求解出坐标转换参数,或者获取转换软件自己进行转换。
转换参数求出后按提示输入手持型GPS中。
只需经过这样一次设置,以后所有在该区域内测土时GPS所读出的坐标就为该点的北京54坐标值了。
三.参数检验DX、DY、DZ、DA、DF五个转换参数求出后,必须按提示分别输入手持GPS中,同时输入测区中央子午线经度。
坐标转换与VC编程
目录第一章绪论 (1)第一节坐标系统概述 (1)第二节Visual C++ 概述 (2)第二章坐标转换原理 (5)第一节常用坐标系统 (5)第二节常用的坐标转换方法 (6)空间大地直角坐标系与大地坐标系之间的转换 (6)大地坐标与高斯平面坐标系之间的转换 (7)高斯投影正算公式 (8)高斯投影反算公式 (9)不同空间大地直角坐标系之间的转换 (10)不同平面直角坐标系之间的转换 (12)第三章坐标转换在VC中的实现 (13)第一节坐标类(CCoordinate) (13)语汇表 (17)致谢 (17)第一章绪论随着现代科技的发展,计算机的广泛应用,GPS卫星定位技术、地理信息系统(GIS)以及遥感技术(RS)的不断成熟与发展,我们的测事业也正发生着翻天覆地的变化。
从传统的人工野外测量到现代高科技自动化数字成图,测绘科学经历了一次又一次的变革,然而在不同时期的测绘成果却也不尽相同。
尤其在我国,由于历史的原因,我们曾更换过几次大地坐标系统,因此要利用前人的测绘成果,就得进行坐标转换,坐标转换的精度将直接影响我们对先前测绘成果的利用。
在GPS卫星定位技术广泛应用的今天,由于世界各国所使用的椭球参数不同,在不同地区进行GPS测量也将涉及到不同坐标系统的转换,因而坐标转换在现代测量中已为一个值得研究的问题。
第一节坐标系统概述众所周知,我们所居住的地球是一个不规则的椭球体,百余年来不少科学家为研究地球椭球而奋斗,他们根据各自收集到的资料,曾先后推算出不同的地球椭球参数值a和α。
但是由于当时人们所用资料的局限性,所推算得到的结果只能表征某个国家或某个大陆的大地水准面形状,都还不能完善地接近整个地球的形状和大小,还不是总地球椭球。
所以现如今绝大多数的国家还只能沿用这些古老的椭球,经过定位后作为各自的参考椭球。
我国旧中国使用的是海福特椭球,解放后使用克拉索夫斯基椭球,费除了南京大地原点,使用前苏联原点,即我们常说的1954年北京坐标系;1980年又建立了国家大地坐标系,采用IAG-75的椭球参数,原点位于西安(即我们常说的全国80坐标系)。
关于GPS坐标转换(转)
关于GPS坐标转换(转)关于GPS坐标转换(转)(一)说到转换,我不得不先提几个概念:1. 84坐标系――美国的GPS就用这个坐标系,也就是说我们从GPS接收过来的地心大地坐标就是在这个坐标系下的;2. 54坐标系――中国常用的坐标系,一般来说,我们就是要得到该坐标系下的平面直角坐标;3. 地心大地坐标――就是经纬度表示的大地位置数据(B、L、H);4. 地心直角坐标--是以地心为原点,但表示方式采样直角坐标(X、Y、Z);5. 平面直角坐标――不用多解释了,就是我们平常用来表示位置的坐标(x、y、z);6. 椭球参数――地心大地坐标转换到地心直角坐标需要使用的参数;7. 七参数――不同椭球系下的地心直角坐标互换所使用到的参数;8. 投影参数――同一椭球系下,地心大地坐标转换为平面直角坐标所使用的参数;9. 四参数――同一椭球系下,不同平面坐标系之间的转换所使用的参数。
有了以上概念,只要知道转换过程就OK了。
下面我就不罗嗦了,直接用方向线来说明过程,其中我以常用的北京54坐标系作为目标坐标系:从GPS中接收到84坐标系下的地心大地坐标↓使用84坐标系的椭球参数转换为84坐标系下的地心直角坐标↓使用七参数转换为54坐标系下的地心直角坐标↓使用54坐标系的椭球参数转换为54坐标系下的地心大地坐标↓使用投影参数转换为54坐标系下的平面直角坐标↓使用四参数转换为其它区域坐标系下的平面直角坐标(二)下面说一下84坐标系下的地心大地坐标如何使用84坐标系的椭球参数转换为84坐标系下的地心直角坐标。
先来看看84坐标系的椭球参数:椭圆长半径A:6378137.000000椭圆短半径B:6356752.314245179497根据椭圆长短半径,我们很容易就能算出椭圆第一偏心率e1,计算公式如下:e1 =sqrt(A×A-B×B)/ A;注意这里sqrt是开方的意思。
OK,上面我们通过一个简单的公式就计算出了椭圆的第一偏心率e1,下面,我们就利用这个参数把地心大地坐标转换为地心直角坐标。
坐标转换GPS
求解转换参数和高程拟合参数:一.求解转换参数使用菜单【辅助】-【计算】-【转换参数】,进入“求解转换参数”视图:求解转换参数注意:小于3个已知点,只能作固定差改正;大于等于3个已知点,则可作平面拟合;大于等于6个已知点,则可作曲面拟合。
而作平面拟合或曲面拟合时,必须在求转换参数前预先进入【设置】→【高程拟合】菜单,用左、右键选择平面拟合或曲面拟合模式。
[具体参看附录3.设置高程拟合模式说明]添加计算点■“新建”按钮(按“0”键):新建一个求解转换参数转换文件;执行该功能,弹出“是否新建解算数据库文件”对话框,根据需要选择“YES”或“NO”■“文件”按钮(按“7”键):执行该功能,则弹出下拉菜单,按相应数字键执行相应功能●提取当前记录:提取当前碎部记录文件中要参与转换参数解算的点(碎部采集点和控制点坐标相关联)●提取记录点:提取碎部记录文件中要参与转换参数解算的点(碎部采集点和控制点坐标相关联),弹出“选择碎部记录文件”对话框,选择碎部记录文件确定即可●转换文件另存为:求解转换参数转换文件改名存盘●读取转换文件:打开求解转换参数转换文件●添加到水准点库:将求解转换参数点的高程残差作为“高程异常点”调入到水准点库中,以便求高程以合参数■“解算”按钮(按“2”键):计算转换参数■“切换”按钮(按“1”键):控制该点是否参与求参数;先选择点,再执行该功能。
如果点前打勾,则该点参与求参数;如果点前打叉,则该点不参与求参数。
★判断该点是否要参与求参数条件:1、求解转换参数的点至少大于22、先使所有的点参与求转换参数解算;再看各个点的残差,若残差大,则该点不参与求参数■“结果”按钮(按“6”键):弹出“转换参数设置”对话框,查看求出的转换参数■“应用”按钮(按“4”键):启用转换参数,可以使用菜单【设置】-【参数】-【平面转换】,查看“平面转换”对话框中“启用”前的方框已经打勾■“加点”按钮(按“3”键):弹出“添加计算转换参数的点”的对话框,添加点■“编辑”按钮(按“5”键):如果点的坐标有问题,选择该点,执行该功能,弹出“编辑”对话框,修改该点坐标■解算结束后,按“ESC”键退出“求解转换参数”对话框,随后弹出“是否更新采集数据”对话框,若要更新,选择“YES”,若数据量很大,可以选择“NO”,在数据导出前,执行菜单【文件】-【数据更新】即可。
NEMA格式 GPS数据提取解析 坐标转换等 源码
GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn fromGPS数据解析数据拆分\坐标转换\显示线路图\源代码逐条读取gps数据然后进行拆分解析,坐标转换,绘制线路。
很好的示例多多交流学习。
本程序是基于VC++ 建立的单文档工程。
废话少说,直接上代码//获取子字符串个数int GetSubStrCount(CString str,char cFlag){cFlag = ',';int i = 0;BOOL isHas = FALSE;for (int iStart = -1; -1 != (iStart = str.Find(cFlag,iStart+1)) ; i++){isHas = TRUE;}if (!isHas){return 0;}else{return i+1;}}//获取子字符串// i 序号0CString GetSubStr(CString str,int i,char cFlag){cFlag = ',';int iStart = -1;int iEnd = 0;int j = 0;int iStrCount;iStrCount = GetSubStrCount(str,cFlag);if (i>iStrCount -1 || i<0){str = "";return str;}else{//do nothing}if (i == iStrCount-1){i = iStrCount;for (;j<i-1;j++){iStart = str.Find(cFlag , iStart+1);}return str.Mid(iStart+1 , str.GetLength()-iStart-1);}else{//do nothing}for (; j<i; j++){iStart = str.Find(cFlag , iStart+1);}iEnd = str.Find(cFlag , iStart+1);return str.Mid(iStart+1 , iEnd-iStart-1);}//数据解析CString CGpsDataView::Analyzing(CString str){CString subStr[20];char cFlag = ',';int j = GetSubStrCount(str,cFlag); //得到该行的子字符串个数CStdioFile wFile;wFile.Open("save.txt",CFile::modeCreate | CFile::modeWrite | CFile::typeText);//将数据写入文件for (int i=0;i<j;i++){subStr[i] = GetSubStr(str,i,cFlag); }//GPGGA数据if (subStr[0] == "$GPGGA"){CoordCovert(subStr[2],subStr[4]);//提取时间subStr[1].Insert(2,':');subStr[1].Insert(5,':');subStr[1].Insert(0," UTC时间:");//提取纬度if (subStr[3] == 'N'){subStr[2].Insert(11,"分");subStr[2].Insert(2,"度");subStr[2].Insert(0," 北纬");}else if (subStr[3] == 'S'){subStr[2].Insert(11,"分");subStr[2].Insert(2,"度");subStr[2].Insert(0," 南纬");}//提取经度if (subStr[5] == 'E'){subStr[4].Insert(12,"分");subStr[4].Insert(3,"度");subStr[4].Insert(0," 东经");}else if (subStr[5] == 'W'){subStr[4].Insert(12,"分");subStr[4].Insert(3,"度");subStr[4].Insert(0," 西经");}//判断GPS状态CString GpsState;if (subStr[6] == '0'){GpsState = " GPS状态:无定位.";}else if (subStr[6] == '1'){GpsState = " GPS状态:无差分校正定位.";}else if (subStr[6] == '2'){GpsState = " GPS状态:差分校正定位.";}else if (subStr[6] == '9'){GpsState = " GPS状态:用星历计算定位.";}//提取卫星数subStr[7].Insert(0," 卫星数:");//提取平面位置精度因子subStr[8].Insert(0," 平面位置精度因子:");//天线海拔高度subStr[9].Insert(strlen(subStr[9]),subStr[10]);subStr[9].Insert(0," 天线海拔高度:");//海平面分离度subStr[11].Insert(strlen(subStr[11]),subStr[12]);subStr[11].Insert(0," 海平面分离度:");subStr[0] += subStr[1];subStr[0] += subStr[2];subStr[0] += subStr[4];subStr[0] += GpsState;subStr[0] += subStr[7];subStr[0] += subStr[8];subStr[0] += subStr[9];subStr[0] += subStr[11];//////////////////////////////////////MessageBox(subStr[0]);wFile.WriteString(subStr[0]);//将数据写入文件}//GPZDA数据else if (subStr[0] == "$GPZDA"){//提取时间subStr[1].Insert(2,':');subStr[1].Insert(5,':');subStr[1].Insert(0," UTC时间:");//提取日期subStr[2].Insert(strlen(subStr[2]),"日");subStr[2].Insert(0,"月");subStr[2].Insert(0,subStr[3]);subStr[2].Insert(0,"年");subStr[2].Insert(0,subStr[4]);subStr[2].Insert(0,' ');//当地时域描述subStr[5].Insert(strlen(subStr[5]),"小时");if (strlen(subStr[6]) > 3){subStr[6] = subStr[6].Left(2);}else{subStr[6] = '0';}subStr[6] += "分";subStr[6].Insert(0,subStr[5]);subStr[6].Insert(0," 当地时域:");subStr[0] += subStr[1];subStr[0] += subStr[2];subStr[0] += subStr[6];//////////////////////////////MessageBox(subStr[0]);wFile.WriteString(subStr[0]);//将数据写入文件}//GPGSA数据else if (subStr[0] == "$GPGSA"){//卫星捕获模式,以及定位模式CString CatchLocation;if (subStr[1] == 'M'){if (subStr[2] == '1'){CatchLocation = " 手动捕获卫星,未定位!";}else if (subStr[2] == '2'){CatchLocation = " 手动捕获卫星,2D定位!";}else if (subStr[2] == '3'){CatchLocation = " 手动捕获卫星,3D定位!";}}else if (subStr[1] == 'A'){if (subStr[2] == '1'){CatchLocation =" 自动捕获卫星,未定位!";}else if (subStr[2] == '2'){CatchLocation =" 自动捕获卫星,2D定位!";}else if (subStr[2] == '3'){CatchLocation =" 自动捕获卫星,3D定位!";}}//各卫星定位结果subStr[3].Insert(0," 各卫星定位结果:");subStr[3] += ' ';subStr[4].Insert(0,subStr[3]);subStr[4] += ' ';subStr[5].Insert(0,subStr[4]);subStr[5] += ' ';subStr[6].Insert(0,subStr[5]);subStr[6] += ' ';subStr[7].Insert(0,subStr[6]);subStr[7] += ' ';subStr[8].Insert(0,subStr[7]);subStr[8] += ' ';subStr[9].Insert(0,subStr[8]);subStr[9] += ' ';subStr[10].Insert(0,subStr[9]);subStr[10] += ' ';subStr[11].Insert(0,subStr[10]);subStr[11] += ' ';subStr[12].Insert(0,subStr[11]);subStr[12] += ' ';subStr[13].Insert(0,subStr[12]);subStr[13] += ' ';subStr[14].Insert(0,subStr[13]);subStr[14] += ' ';//空间(三维)位置精度因子subStr[15].Insert(0," 空间(三维)位置精度因子:");//平面位置精度因子subStr[16].Insert(0," 平面位置精度因子:");//高度位置精度因子subStr[17] = subStr[17].Left(3);subStr[17].Insert(0," 高度位置精度因子:");subStr[0] += CatchLocation;subStr[0] += subStr[14];subStr[0] += subStr[15];subStr[0] += subStr[16];subStr[0] += subStr[17];/////////////////////////////MessageBox(subStr[0]);wFile.WriteString(subStr[0]);//将数据写入文件}//GPGSV数据else if (subStr[0] == "$GPGSV"){///////////////////////////MessageBox(subStr[0]);//卫星编号、卫星仰角(0~90度)、卫星方位角(0~359度)、信噪比subStr[4].Insert(0,"卫星编号:");subStr[5].Insert(0," 仰角:");subStr[6].Insert(0," 方位角:");subStr[7].Insert(0," 信噪比:");subStr[4] += subStr[5];subStr[4] += subStr[6];subStr[4] += subStr[7];///////////////////MessageBox(subStr[4]);subStr[8].Insert(0,"卫星编号:");subStr[9].Insert(0," 仰角:");subStr[10].Insert(0," 方位角:");subStr[11].Insert(0," 信噪比:");subStr[8] += subStr[9];subStr[8] += subStr[10];subStr[8] += subStr[11];////////////////////////MessageBox(subStr[8]);subStr[12].Insert(0,"卫星编号:");subStr[13].Insert(0," 仰角:");subStr[14].Insert(0," 方位角:");subStr[15].Insert(0," 信噪比:");subStr[12] += subStr[13];subStr[12] += subStr[14];subStr[12] += subStr[15];/////////////////////MessageBox(subStr[12]);subStr[16].Insert(0,"卫星编号:");subStr[17].Insert(0," 仰角:");subStr[18].Insert(0," 方位角:");if (strlen(subStr[19]) > 3){subStr[19] = subStr[19].Left(2);}else{subStr[19] = '0';}subStr[19].Insert(0," 信噪比:");subStr[16] += subStr[17];subStr[16] += subStr[18];subStr[16] += subStr[19];/////////////////////////////////MessageBox(subStr[16]);wFile.WriteString(subStr[16]);//将数据写入文件}return str;}//读取文件数据并解析void CGpsDataView::OnFileRead(){// TODO: 在此添加命令处理程序代码CStdioFile myFile;CString oneLine;char cFlag = ',';CString subStr[20];//读取GPS数据文件if(!myFile.Open(("gps.txt"),CFile::modeRead | CFile::typeText)){AfxMessageBox(_T("打开文件错误!"));return;}else{/*do nothing*/}while (myFile.ReadString(oneLine))//读一行{//////////MessageBox(oneLine);int j = GetSubStrCount(oneLine,cFlag); //得到该行的子字符串个数//校验if(CheckNum(oneLine)){////////////MessageBox(_T("数据校验...接收正确!..."));for (int i=0;i<j;i++){subStr[i] = GetSubStr(oneLine,i,cFlag);//MessageBox(subStr[i]);}Analyzing(oneLine); //解析}else{AfxMessageBox(_T("数据校验..接收错误!..."));}}myFile.Close();}//*********************************************************************************** ************//坐标转换//度分秒--弧度double Dms2Rad(double Dms){double Degree, Miniute;double Second;int Sign;double Rad;if(Dms >= 0){Sign = 1;}else{Sign = -1;}Dms = fabs(Dms); //绝对值Degree = floor(Dms); // 取度floor(2.800)= 2.0000Miniute = floor(fmod(Dms * 100.0, 100.0)); //fmod 计算余数Second = fmod(Dms * 10000.0, 100.0);Rad = Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 180.0;return Rad;}double Rad2Dms(double Rad){double Degree, Miniute;double Second;int Sign;double Dms;if(Rad >= 0){Sign = 1;}else{Sign = -1;}Rad = fabs(Rad * 180.0 / PI);Degree = floor(Rad);Miniute = floor(fmod(Rad * 60.0, 60.0));Second = fmod(Rad * 3600.0, 60.0);Dms = Sign * (Degree + Miniute / 100.0 + Second / 10000.0);return Dms;}//正算公式bool GpsPoint::BL2xy(){//大地测量学基础(吕志平乔书波北京:测绘出版社2010.03)double X; //由赤道至纬度为B的子午线弧长(P106 5-41)double N; //椭球的卯酉圈曲率半径double t;double t2;double m;double m2;double ng2;double cosB;double sinB;X = 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);//P156 (6-63公式)x = X + 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 += 500000;return true;}//反算公式bool GpsPoint::xy2BL(){double sinB;double cosB;double t;double t2;double N; //椭球的卯酉圈曲率半径double ng2;double V;double yN;double preB0;double B0;double eta;//y -= 500000;B0 = x / A1;do{preB0 = B0;B0 = B0 * PI / 180.0;B0 = (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0))) / A1;eta = fabs(B0 - preB0);}while(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;return true;}//设置中央子午线bool GpsPoint::SetL0(double dL0){L0 = Dms2Rad(dL0);return true;}//将度分秒经纬度转换为弧度后再转换为平面坐标bool GpsPoint::SetBL(double dB, double dL){B = Dms2Rad(dB);L = Dms2Rad(dL);BL2xy();return true;}bool GpsPoint::GetBL(double *dB, double *dL){*dB = Rad2Dms(B);*dL = Rad2Dms(L);return true;}//将平面坐标转换为(弧度)经纬度bool GpsPoint::Setxy(double dx, double dy){x = dx;y = dy;xy2BL();return true;}bool GpsPoint::Getxy(double *dx, double *dy){*dx = x;*dy = y;return true;}GpsPoint_Krasovsky::GpsPoint_Krasovsky(){a = 6378245; //长半径f = 298.3; //扁率的倒数(扁率:(a-b)/a)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;}//*************坐标转换bool CGpsDataView::CoordCovert(CString latitude, CString longitude){double bbb = atof(latitude);double lll = atof(longitude);//度分格式转换为度分秒格式bbb = Dm2Dms(bbb);lll = Dm2Dms(lll);double MyL0 ; //中央子午线double MyB = bbb ; //33 d 44 m 55.6666 sdouble MyL = lll ; //3度带,109 d 22 m 33.4444 s//计算当地中央子午线,3度带MyL0 = fabs(MyL);MyL0 = floor(MyL);MyL0 = 3 * floor(MyL0 / 3 );GpsPoint_Krasovsky MyPrj;MyPrj.SetL0(MyL0);MyPrj.SetBL(MyB, MyL);double OutMyX;double OutMyY;OutMyX = MyPrj.x; //正算结果:坐标xOutMyY = MyPrj.y; //结果:坐标yCString strTemp1;CString strTemp2;CString strTemp3;CString strTemp4;strTemp1.Format("%f",OutMyX);strTemp2.Format("%f",OutMyY);strTemp1.Insert(0,"x = ");strTemp2.Insert(0," , y = ");strTemp2.Insert(0,strTemp1);strTemp2.Insert(0," 坐标转换: ");strTemp3.Format("%f12",MyB);strTemp4.Format("%f12",MyL);strTemp3.Insert(0,"B = ");strTemp4.Insert(0," L = ");strTemp4.Insert(0,strTemp3);strTemp2.Insert(0,strTemp4);//MessageBox(strTemp2);DrawPoint(MyPrj.x,MyPrj.y);return true;}//================================== //度分格式转换为度分秒格式double CGpsDataView::Dm2Dms(double Dm){double Dms;double temp;temp = Dm - floor(Dm);temp = (temp * 60) / 100;Dm = floor(Dm);Dm += temp;Dm = Dm /100;Dms = Dm;return Dms;}//*************绘制线路显示出路线int count1=0;bool bFirst = true;double xTemp;double yTemp;void CGpsDataView::DrawPoint(double X, double Y){Sleep(100);//X = (X - floor(X))*100;//Y = (Y - floor(Y))*100;if (bFirst){xTemp=X;yTemp=Y;bFirst=false;}CDC *pDC=GetDC();CPen pen(PS_SOLID,3,RGB(255,20,20));CPen *pOldPen;CBrush *pOldBrush;CBrush *pBrush=CBrush::FromHandle( (HBRUSH)GetStockObject(NULL_BRUSH) );pOldPen=pDC->SelectObject(&pen);pOldBrush=pDC->SelectObject(pBrush);int a=(int)(100.0-(X-xTemp)*800.0);int b=(int)(100.0+(Y-yTemp)*800.0);//绘制点显示路径pDC->Ellipse(a,b,a+5,b+5);//计数count1=count1+1;pDC->SelectObject( pOldBrush );pDC->SelectObject( pOldPen );CString str;str.Format("%.1f,%.1f,%d,%d,%d",X-xTemp,Y-yTemp,a,b,count1);pDC->TextOut(10,10,str);}。
使用GPS数据进行坐标转换与纠正的操作方法
使用GPS数据进行坐标转换与纠正的操作方法GPS(全球卫星定位系统)是一项先进的技术,它利用卫星信号来确定地球上任何点的精确位置。
在现代导航和定位系统中,GPS已经成为一种标配。
然而,在使用GPS数据时,我们有时需要将坐标进行转换和纠正,以便更好地满足实际需求。
本文将介绍使用GPS数据进行坐标转换和纠正的操作方法。
1. 数据收集首先,我们需要收集GPS数据。
可以通过不同的设备和方法获取GPS数据,如GPS接收器、智能手机、车载导航系统等。
无论使用何种方法,确保数据的准确性和完整性非常重要。
在使用设备进行数据收集时,确保设备处于开启状态,并且可以接收到足够的卫星信号。
2. 坐标转换在进行坐标转换之前,我们需要确定数据的初始坐标系统。
地球上有多种不同的坐标系统,如WGS 84、GCJ-02和BD-09等。
根据实际需求和使用场景,选择合适的初始坐标系统。
然后,我们可以利用不同的工具和软件进行坐标转换。
有许多免费和商业化的软件供我们选择,如ArcGIS、Google Earth和在线坐标转换工具等。
根据具体情况选择最适合的工具,并按照工具的操作流程进行具体的坐标转换。
3. 数据纠正在数据收集和处理过程中,可能会出现误差和偏差。
这些误差和偏差可能来自各种原因,如设备精度、大气条件、信号遮挡等。
为了纠正这些误差和偏差,我们可以采用一些常用的方法。
首先,可以利用差分GPS技术来提高测量的精度。
差分GPS技术通过同时接收参考站和移动站的GPS信号,计算两者之间的差异,从而纠正误差。
此外,还可以利用地面控制点来进行数据纠正。
地面控制点是已知位置的点,在数据处理过程中,我们可以将GPS数据与地面控制点进行比对,从而补偿误差和偏差。
4. 软件应用除了传统的软件工具,还可以利用一些特殊的软件应用来进行坐标转换和纠正。
例如,可以使用GIS软件进行坐标转换和纠正,并结合地图数据进行可视化展示。
此外,还可以利用基于云计算的在线软件,实现大规模的坐标转换和纠正操作。
GPS数据解析数据拆分坐标转换显示线路图源代码
view plaincopy to clipboardprint?1. GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from2.3.4. GPS数据解析5.6. 数据拆分 \坐标转换 \显示线路图\源代码7.8. 逐条读取gps数据然后进行拆分解析,坐标转换,绘制线路。
很好的示例多多交流学习。
9.10.11.12. 本程序是基于VC++ 建立的单文档工程。
13.14.15.16. 废话少说,直接上代码17.18.19.20. //获取子字符串个数21.22. i nt GetSubStrCount(CString str,char cFlag)23.24. {25.26. cFlag = ',';27.28. int i = 0;29.30. BOOL isHas = FALSE;31.32.33.34. for (int iStart = -1; -1 != (iStart = str.Find(cFlag,iStart+1)) ; i++)35.36. {37.38. isHas = TRUE;39.40. }41.42.43.44. if (!isHas)45.46. {47.48. return 0;49.50. }51.52. else53.54. {55.56. return i+1;57.58. }59.60. }61.62.63.64. //获取子字符串65.66. // i 序号 067.68. C String GetSubStr(CString str,int i,char cFlag)69.70. {71.72. cFlag = ',';73.74. int iStart = -1;75.76. int iEnd = 0;77.78. int j = 0;79.80. int iStrCount;81.82.83.84. iStrCount = GetSubStrCount(str,cFlag);85.86.87.88. if (i>iStrCount -1 || i<0)89.90. {91.92. str = "";93.94. return str;95.96. }97.98. else99.100. {101.102. //do nothing104. }105.106.107.108. if (i == iStrCount-1)109.110. {111.112. i = iStrCount;113.114.115.116. for (;j<i-1;j++)117.118. {119.120. iStart = str.Find(cFlag , iStart+1);121.122. }123.124.125.126. return str.Mid(iStart+1 , str.GetLength()-iStart-1); 127.128. }129.130. else131.132. {133.134. //do nothing135.136. }137.139.140. for (; j<i; j++)141.142. {143.144. iStart = str.Find(cFlag , iStart+1);145.146. }147.148.149.150. iEnd = str.Find(cFlag , iStart+1);151.152. return str.Mid(iStart+1 , iEnd-iStart-1);153.154. }155.156.157.158. //数据解析159.160. CString CGpsDataView::Analyzing(CString str)161.162. {163.164. CString subStr[20];165.166. char cFlag = ',';167.168. int j = GetSubStrCount(str,cFlag); //得到该行的子字符串个数169.170. CStdioFile wFile;171.172. wFile.Open("save.txt",CFile::modeCreate | CFile::modeWrite | CFil e::typeText);//将数据写入文件173.174.175.176. for (int i=0;i<j;i++)177.178. {179.180. subStr[i] = GetSubStr(str,i,cFlag); 181.182. }183.184.185.186. //GPGGA数据187.188. if (subStr[0] == "$GPGGA")189.190. {191.192. CoordCovert(subStr[2],subStr[4]);193.194. //提取时间195.196. subStr[1].Insert(2,':');197.198. subStr[1].Insert(5,':');199.200. subStr[1].Insert(0," UTC时间:");201.202.203.204. //提取纬度205.206. if (subStr[3] == 'N')207.208. {209.210. subStr[2].Insert(11,"分"); 211.212. subStr[2].Insert(2,"度"); 213.214. subStr[2].Insert(0," 北纬"); 215.216. }217.218. else if (subStr[3] == 'S')219.220. {221.222. subStr[2].Insert(11,"分"); 223.224. subStr[2].Insert(2,"度"); 225.226. subStr[2].Insert(0," 南纬"); 227.228. }229.230.231.232. //提取经度233.234. if (subStr[5] == 'E')235.236. {237.238. subStr[4].Insert(12,"分"); 239.240. subStr[4].Insert(3,"度");241.242. subStr[4].Insert(0," 东经"); 243.244. }245.246. else if (subStr[5] == 'W')247.248. {249.250. subStr[4].Insert(12,"分");251.252. subStr[4].Insert(3,"度");253.254. subStr[4].Insert(0," 西经"); 255.256. }257.258.259.260. //判断GPS状态261.262. CString GpsState;263.264.265.266. if (subStr[6] == '0')267.268. {269.270. GpsState = " GPS状态:无定位."; 271.272. }273.274. else if (subStr[6] == '1')275.276. {277.278. GpsState = " GPS状态:无差分校正定位."; 279.280. }281.282. else if (subStr[6] == '2')283.284. {285.286. GpsState = " GPS状态:差分校正定位."; 287.288. }289.290. else if (subStr[6] == '9')291.292. {293.294. GpsState = " GPS状态:用星历计算定位."; 295.296. }297.298.299.300. //提取卫星数301.302. subStr[7].Insert(0," 卫星数:");303.304.305.306. //提取平面位置精度因子307.308. subStr[8].Insert(0," 平面位置精度因子:"); 309.310.311.312. //天线海拔高度313.314. subStr[9].Insert(strlen(subStr[9]),subStr[10]); 315.316. subStr[9].Insert(0," 天线海拔高度:");317.318.319.320. //海平面分离度321.322. subStr[11].Insert(strlen(subStr[11]),subStr[12]); 323.324. subStr[11].Insert(0," 海平面分离度:");325.326.327.328. subStr[0] += subStr[1];329.330. subStr[0] += subStr[2];331.332. subStr[0] += subStr[4];333.334. subStr[0] += GpsState;335.336. subStr[0] += subStr[7];337.338. subStr[0] += subStr[8];339.340. subStr[0] += subStr[9];341.342. subStr[0] += subStr[11];343.344. //////////////////////////////////////MessageBox(subStr[0]); 345.346. wFile.WriteString(subStr[0]);//将数据写入文件347.348.349.350. }351.352.353.354. //GPZDA数据355.356. else if (subStr[0] == "$GPZDA")357.358. {359.360. //提取时间361.362. subStr[1].Insert(2,':');363.364. subStr[1].Insert(5,':');365.366. subStr[1].Insert(0," UTC时间:");367.368.369.370. //提取日期371.372. subStr[2].Insert(strlen(subStr[2]),"日"); 373.374. subStr[2].Insert(0,"月");375.376. subStr[2].Insert(0,subStr[3]);377.378. subStr[2].Insert(0,"年");379.380. subStr[2].Insert(0,subStr[4]);382. subStr[2].Insert(0,' ');383.384.385.386. //当地时域描述387.388. subStr[5].Insert(strlen(subStr[5]),"小时"); 389.390.391.392. if (strlen(subStr[6]) > 3)393.394. {395.396. subStr[6] = subStr[6].Left(2);397.398. }399.400. else401.402. {403.404. subStr[6] = '0';405.406. }407.408.409.410. subStr[6] += "分";411.412. subStr[6].Insert(0,subStr[5]);413.414. subStr[6].Insert(0," 当地时域:");415.417.418. subStr[0] += subStr[1];419.420. subStr[0] += subStr[2];421.422. subStr[0] += subStr[6];423.424. //////////////////////////////MessageBox(subStr[0]); 425.426. wFile.WriteString(subStr[0]);//将数据写入文件427.428. }429.430.431.432. //GPGSA数据433.434. else if (subStr[0] == "$GPGSA")435.436. {437.438. //卫星捕获模式,以及定位模式439.440. CString CatchLocation;441.442.443.444. if (subStr[1] == 'M')445.446. {447.448. if (subStr[2] == '1')449.450. {452. CatchLocation = " 手动捕获卫星,未定位!"; 453.454. }455.456. else if (subStr[2] == '2')457.458. {459.460. CatchLocation = " 手动捕获卫星,2D定位!"; 461.462. }463.464. else if (subStr[2] == '3')465.466. {467.468. CatchLocation = " 手动捕获卫星,3D定位!"; 469.470. }471.472. }473.474. else if (subStr[1] == 'A')475.476. {477.478. if (subStr[2] == '1')479.480. {481.482. CatchLocation =" 自动捕获卫星,未定位!"; 483.484. }485.486. else if (subStr[2] == '2')487.488. {489.490. CatchLocation =" 自动捕获卫星,2D定位!"; 491.492. }493.494. else if (subStr[2] == '3')495.496. {497.498. CatchLocation =" 自动捕获卫星,3D定位!"; 499.500. }501.502. }503.504.505.506. //各卫星定位结果507.508. subStr[3].Insert(0," 各卫星定位结果:");509.510. subStr[3] += ' ';511.512. subStr[4].Insert(0,subStr[3]);513.514. subStr[4] += ' ';515.516. subStr[5].Insert(0,subStr[4]);517.518. subStr[5] += ' ';519.520. subStr[6].Insert(0,subStr[5]);522. subStr[6] += ' ';523.524. subStr[7].Insert(0,subStr[6]); 525.526. subStr[7] += ' ';527.528. subStr[8].Insert(0,subStr[7]); 529.530. subStr[8] += ' ';531.532. subStr[9].Insert(0,subStr[8]); 533.534. subStr[9] += ' ';535.536. subStr[10].Insert(0,subStr[9]); 537.538. subStr[10] += ' ';539.540. subStr[11].Insert(0,subStr[10]); 541.542. subStr[11] += ' ';543.544. subStr[12].Insert(0,subStr[11]); 545.546. subStr[12] += ' ';547.548. subStr[13].Insert(0,subStr[12]); 549.550. subStr[13] += ' ';551.552. subStr[14].Insert(0,subStr[13]); 553.554. subStr[14] += ' ';555.557.558. //空间(三维)位置精度因子559.560. subStr[15].Insert(0," 空间(三维)位置精度因子:"); 561.562.563.564. //平面位置精度因子565.566. subStr[16].Insert(0," 平面位置精度因子:");567.568.569.570. //高度位置精度因子571.572. subStr[17] = subStr[17].Left(3);573.574. subStr[17].Insert(0," 高度位置精度因子:");575.576.577.578. subStr[0] += CatchLocation;579.580. subStr[0] += subStr[14];581.582. subStr[0] += subStr[15];583.584. subStr[0] += subStr[16];585.586. subStr[0] += subStr[17];587.588. /////////////////////////////MessageBox(subStr[0]);589.590. wFile.WriteString(subStr[0]);//将数据写入文件592. }593.594.595.596. //GPGSV数据597.598. else if (subStr[0] == "$GPGSV")599.600. {601.602. ///////////////////////////MessageBox(subStr[0]);603.604.605.606. //卫星编号、卫星仰角(0~90度)、卫星方位角(0~359度)、信噪比607.608. subStr[4].Insert(0,"卫星编号:");609.610. subStr[5].Insert(0," 仰角:");611.612. subStr[6].Insert(0," 方位角:");613.614. subStr[7].Insert(0," 信噪比:");615.616. subStr[4] += subStr[5];617.618. subStr[4] += subStr[6];619.620. subStr[4] += subStr[7];621.622. ///////////////////MessageBox(subStr[4]);623.624. subStr[8].Insert(0,"卫星编号:");626. subStr[9].Insert(0," 仰角:");627.628. subStr[10].Insert(0," 方位角:");629.630. subStr[11].Insert(0," 信噪比:");631.632. subStr[8] += subStr[9];633.634. subStr[8] += subStr[10];635.636. subStr[8] += subStr[11];637.638. ////////////////////////MessageBox(subStr[8]); 639.640. subStr[12].Insert(0,"卫星编号:"); 641.642. subStr[13].Insert(0," 仰角:");643.644. subStr[14].Insert(0," 方位角:");645.646. subStr[15].Insert(0," 信噪比:");647.648. subStr[12] += subStr[13];649.650. subStr[12] += subStr[14];651.652. subStr[12] += subStr[15];653.654. /////////////////////MessageBox(subStr[12]); 655.656. subStr[16].Insert(0,"卫星编号:"); 657.658. subStr[17].Insert(0," 仰角:");659.660. subStr[18].Insert(0," 方位角:");661.662.663.664. if (strlen(subStr[19]) > 3)665.666. {667.668. subStr[19] = subStr[19].Left(2);669.670. }671.672. else673.674. {675.676. subStr[19] = '0';677.678. }679.680.681.682. subStr[19].Insert(0," 信噪比:");683.684. subStr[16] += subStr[17];685.686. subStr[16] += subStr[18];687.688. subStr[16] += subStr[19];689.690. /////////////////////////////////MessageBox(subStr[16]); 691.692. wFile.WriteString(subStr[16]);//将数据写入文件693.694. }695.696. return str;697.698. }699.700.701.702.703.704. //读取文件数据并解析705.706. void CGpsDataView::OnFileRead()707.708. {709.710. // TODO: 在此添加命令处理程序代码711.712. CStdioFile myFile;713.714. CString oneLine;715.716. char cFlag = ',';717.718. CString subStr[20];719.720.721.722. //读取GPS数据文件723.724. if(!myFile.Open(("gps.txt"),CFile::modeRead | CFile::typeText)) 725.726. {727.728. AfxMessageBox(_T("打开文件错误!"));729.730. return;731.732. }733.734. else735.736. {737.738. /*do nothing*/739.740. }741.742.743.744. while (myFile.ReadString(oneLine))//读一行745.746. {747.748. //////////MessageBox(oneLine);749.750. int j = GetSubStrCount(oneLine,cFlag); //得到该行的子字符串个数751.752.753.754. //校验755.756. if(CheckNum(oneLine))757.758. {759.760. ////////////MessageBox(_T("数据校验...接收正确!...")); 761.762.763.764. for (int i=0;i<j;i++)765.766. {767.768. subStr[i] = GetSubStr(oneLine,i,cFlag); 769.770. //MessageBox(subStr[i]); 771.772. }773.774.775.776. Analyzing(oneLine); //解析777.778. }779.780. else781.782. {783.784. AfxMessageBox(_T("数据校验..接收错误!...")); 785.786. }787.788. }789.790.791.792. myFile.Close();793.794. }795.796.797.798. //******************************************************************************* ****************799.800. //坐标转换801.802.803.804. //度分秒--弧度805.806. double Dms2Rad(double Dms)807.808. {809.810. double Degree, Miniute;811.812. double Second;813.814. int Sign;815.816. double Rad;817.818.819.820. if(Dms >= 0)821.822. {823.824. Sign = 1;825.826. }827.828. else829.830. {831.832. Sign = -1;833.834. }835.836.837.838. Dms = fabs(Dms); //绝对值839.840. Degree = floor(Dms); // 取度 floor(2.800) = 2.0000841.842. Miniute = floor(fmod(Dms * 100.0, 100.0)); //fmod 计算余数843.844. Second = fmod(Dms * 10000.0, 100.0);845.846. Rad = Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 180.0;847.848. return Rad;849.850. }851.852.853.854. double Rad2Dms(double Rad)855.856. {857.858. double Degree, Miniute;859.860. double Second;861.862. int Sign;863.864. double Dms;865.867.868. if(Rad >= 0)869.870. {871.872. Sign = 1;873.874. }875.876. else877.878. {879.880. Sign = -1;881.882. }883.884.885.886. Rad = fabs(Rad * 180.0 / PI);887.888. Degree = floor(Rad);889.890. Miniute = floor(fmod(Rad * 60.0, 60.0));891.892. Second = fmod(Rad * 3600.0, 60.0);893.894. Dms = Sign * (Degree + Miniute / 100.0 + Second / 10000.0); 895.896. return Dms;897.898. }899.900.902. //正算公式903.904. bool GpsPoint::BL2xy()905.906. {907.908. //大地测量学基础(吕志平乔书波北京:测绘出版社 2010.03)909.910.911.912. double X; //由赤道至纬度为B的子午线弧长(P106 5-41)913.914. double N; //椭球的卯酉圈曲率半径915.916. double t;917.918. double t2;919.920. double m;921.922. double m2;923.924. double ng2;925.926. double cosB;927.928. double sinB;929.930.931.932. X = A1 * B * 180.0 / PI + A2 * sin(2 * B)933.934. + A3 * sin(4 * B) + A4 * sin(6 * B);935.937.938. sinB = sin(B);939.940. cosB = cos(B);941.942. t = tan(B);943.944. t2 = t * t;945.946.947.948. N = a /sqrt(1 - e2 * sinB * sinB);949.950. m = cosB * (L - L0);951.952. m2 = m * m;953.954. ng2 = cosB * cosB * e2 / (1 - e2);955.956.957.958. //P156 (6-63公式)959.960. x = X + N * t *(( 0.5 + ( (5 - t2 + 9 * ng2 + 4 * ng2 * ng2) 961.962. / 24.0 + (61 - 58 * t2 + t2 * t2) * m2 / 720.0) * m2)* m2); 963.964.965.966. y = N * m * ( 1 + m2 * ( (1 - t2 + ng2) / 6.0 + m2 * ( 5 - 18 * t2 + t2 * t2967.968. + 14 * ng2 - 58 * ng2 * t2 ) / 120.0));969.971.972. //y += 500000;973.974.975.976. return true;977.978. }979.980.981.982. //反算公式983.984. bool GpsPoint::xy2BL()985.986. {987.988. double sinB;989.990. double cosB;991.992. double t;993.994. double t2;995.996. double N; //椭球的卯酉圈曲率半径997.998. double ng2;999.1000. double V;1001.1002. double yN;1003.1004. double preB0;1006. double B0;1007.1008. double eta;1009.1010. //y -= 500000;1011.1012. B0 = x / A1;1013.1014.1015.1016. do1017.1018. {1019.1020. preB0 = B0;1021.1022. B0 = B0 * PI / 180.0;1023.1024. B0 = (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0 ))) / A1;1025.1026. eta = fabs(B0 - preB0);1027.1028. }while(eta > 0.000000001);1029.1030.1031.1032. B0 = B0 * PI / 180.0;1033.1034. B = Rad2Dms(B0);1035.1036. sinB = sin(B0);1037.1038. cosB = cos(B0);1040. t = tan(B0);1041.1042. t2 = t * t;1043.1044. N = a / sqrt(1 - e2 * sinB * sinB);1045.1046. ng2 = cosB * cosB * e2 / (1 - e2);1047.1048. V = sqrt(1 + ng2);1049.1050. yN = y / N;1051.1052.1053.1054. B = B0 - (yN * yN - (5 + 3 * t2 + ng2 - 9 * ng2 * t2) * yN * yN * yN * yN1055.1056. / 12.0 + (61 + 90 * t2 + 45 * t2 * t2) * yN * yN * yN * yN * y N * yN / 360.0)1057.1058. * V * V * t / 2;1059.1060.1061.1062. L = L0 + (yN - (1 + 2 * t2 + ng2) * yN * yN * yN / 6.0 + (5 + 28 * t2 + 241063.1064. * t2 * t2 + 6 * ng2 + 8 * ng2 * t2) * yN * yN * yN * yN * yN / 120.0) / cosB;1065.1066. return true;1067.1068. }1069.1071.1072. //设置中央子午线1073.1074. bool GpsPoint::SetL0(double dL0)1075.1076. {1077.1078. L0 = Dms2Rad(dL0);1079.1080. return true;1081.1082. }1083.1084.1085.1086. //将度分秒经纬度转换为弧度后再转换为平面坐标1087.1088. bool GpsPoint::SetBL(double dB, double dL) 1089.1090. {1091.1092. B = Dms2Rad(dB);1093.1094. L = Dms2Rad(dL);1095.1096. BL2xy();1097.1098. return true;1099.1100. }1101.1102.1103.1104. bool GpsPoint::GetBL(double *dB, double *dL)1106. {1107.1108. *dB = Rad2Dms(B);1109.1110. *dL = Rad2Dms(L);1111.1112. return true;1113.1114. }1115.1116.1117.1118. //将平面坐标转换为(弧度)经纬度1119.1120. bool GpsPoint::Setxy(double dx, double dy) 1121.1122. {1123.1124. x = dx;1125.1126. y = dy;1127.1128. xy2BL();1129.1130. return true;1131.1132. }1133.1134.1135.1136. bool GpsPoint::Getxy(double *dx, double *dy) 1137.1138. {1139.1140. *dx = x;1141.1142. *dy = y;1143.1144. return true;1145.1146. }1147.1148.1149.1150. GpsPoint_Krasovsky::GpsPoint_Krasovsky()1151.1152. {1153.1154. a = 6378245; //长半径1155.1156. f = 298.3; //扁率的倒数(扁率:(a-b)/a)1157.1158. e2 = 1 - ((f - 1) / f) * ((f - 1) / f); //第一偏心率的平方1159.1160. e12 = (f / (f - 1)) * (f / (f - 1)) - 1; //第二偏心率的平方1161.1162.1163.1164. // 克拉索夫斯基椭球1165.1166. A1 = 111134.8611;1167.1168. A2 = -16036.4803;1169.1170. A3 = 16.8281;1171.1172. A4 = -0.0220;1173.1174. }1175.1176.1177.1178. //*************坐标转换1179.1180. bool CGpsDataView::CoordCovert(CString latitude, CString longitude)1181.1182. {1183.1184. double bbb = atof(latitude);1185.1186. double lll = atof(longitude);1187.1188.1189.1190. //度分格式转换为度分秒格式1191.1192. bbb = Dm2Dms(bbb);1193.1194. lll = Dm2Dms(lll);1195.1196.1197.1198. double MyL0 ; //中央子午线1199.1200. double MyB = bbb ; //33 d 44 m 55.6666 s1201.1202. double MyL = lll ; //3度带,109 d 22 m 33.4444 s1203.1204.1205.1206. //计算当地中央子午线 ,3度带1207.1208. MyL0 = fabs(MyL);1209.1210. MyL0 = floor(MyL);1211.1212. MyL0 = 3 * floor(MyL0 / 3 );1213.1214.1215.1216. GpsPoint_Krasovsky MyPrj;1217.1218. MyPrj.SetL0(MyL0);1219.1220. MyPrj.SetBL(MyB, MyL);1221.1222. double OutMyX;1223.1224. double OutMyY;1225.1226. OutMyX = MyPrj.x; //正算结果:坐标x 1227.1228. OutMyY = MyPrj.y; //结果:坐标y 1229.1230.1231.1232. CString strTemp1;1233.1234. CString strTemp2;1235.1236. CString strTemp3;1237.1238. CString strTemp4;1239.1240.1241.1242. strTemp1.Format("%f",OutMyX);1244. strTemp2.Format("%f",OutMyY); 1245.1246. strTemp1.Insert(0,"x = "); 1247.1248. strTemp2.Insert(0," , y = "); 1249.1250. strTemp2.Insert(0,strTemp1); 1251.1252. strTemp2.Insert(0," 坐标转换: "); 1253.1254.1255.1256. strTemp3.Format("%f12",MyB); 1257.1258. strTemp4.Format("%f12",MyL); 1259.1260. strTemp3.Insert(0,"B = "); 1261.1262. strTemp4.Insert(0," L = "); 1263.1264. strTemp4.Insert(0,strTemp3); 1265.1266. strTemp2.Insert(0,strTemp4); 1267.1268. //MessageBox(strTemp2); 1269.1270.1271.1272. DrawPoint(MyPrj.x,MyPrj.y); 1273.1274.1275.1276. return true;1277.1279.1280.1281.1282. //================================== 1283.1284. //度分格式转换为度分秒格式1285.1286. double CGpsDataView::Dm2Dms(double Dm) 1287.1288. {1289.1290. double Dms;1291.1292. double temp;1293.1294. temp = Dm - floor(Dm);1295.1296. temp = (temp * 60) / 100;1297.1298. Dm = floor(Dm);1299.1300. Dm += temp;1301.1302. Dm = Dm /100;1303.1304. Dms = Dm;1305.1306. return Dms;1307.1308. }1309.1310.1311.1312.1314.1315.1316.1317.1318. //*************绘制线路显示出路线1319.1320. int count1=0;1321.1322. bool bFirst = true;1323.1324. double xTemp;1325.1326. double yTemp;1327.1328. void CGpsDataView::DrawPoint(double X, double Y) 1329.1330. {1331.1332. Sleep(100);1333.1334.1335.1336. //X = (X - floor(X))*100;1337.1338. //Y = (Y - floor(Y))*100;1339.1340.1341.1342. if (bFirst)1343.1344. {1345.1346. xTemp=X;1347.1348. yTemp=Y;1349.1350. bFirst=false;1351.1352. }1353.1354.1355.1356. CDC *pDC=GetDC();1357.1358. CPen pen(PS_SOLID,3,RGB(255,20,20));1359.1360. CPen *pOldPen;1361.1362. CBrush *pOldBrush;1363.1364. CBrush *pBrush=CBrush::FromHandle( (HBRUSH)GetStockObjec t(NULL_BRUSH) );1365.1366.1367.1368. pOldPen=pDC->SelectObject(&pen);1369.1370. pOldBrush=pDC->SelectObject(pBrush);1371.1372.1373.1374. int a=(int)(100.0-(X-xTemp)*800.0);1375.1376. int b=(int)(100.0+(Y-yTemp)*800.0);1377.1378.1379.1380. //绘制点显示路径1381.1382. pDC->Ellipse(a,b,a+5,b+5);1383.1384.1385.1386. //计数1387.1388. count1=count1+1;1389.1390. pDC->SelectObject( pOldBrush );1391.1392. pDC->SelectObject( pOldPen );1393.1394.1395.1396. CString str;1397.1398. str.Format("%.1f,%.1f,%d,%d,%d",X-xTemp,Y-yTemp,a,b,count1);1399.1400. pDC->TextOut(10,10,str);1401.1402. }。
GPS坐标转换代码
{
*dB = Rad2Dms(B);
*dL = Rad2Dms(L);
return true;
}
bool PrjPoint::Setxy(double dx, double dy)
{
x = dx;
y = dy;
xy2BL();
return true;
}
bool PrjPoint::Getxy(double *dx, double *dy)
} bool PrjPoint::SetBL(double dB, double dL)
{
B = Dms2Rad(dB);
L = Dms2Rad(dL);
//B = dB;
//我靠,I wana say fuck
//L = dL; //del it !
BL2xy();
return true;
}
bool PrjPoint::GetBL(double *dB, double *dL)
Sign = 1; else
Sign = -1; Dms = fabs(Dms); Degree = floor(Dms); Miniute = floor(fmod(Dms * 100.0, 100.0)); Second = fmod(Dms * 10000.0, 100.0); Rad = Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 1
PrjPoint_IUGG1975::PrjPoint_IUGG1975() //在类外定义构造成员函数,要加上类名和域限定 符 :: {
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; } PrjPoint_IUGG1975::~PrjPoint_IUGG1975() //析构函数,释放构造函数占用的内存 { } /////////////////////////////////////////////////// // Definition of PrjPoint_Krasovsky /////////////////////////////////////////////////// PrjPoint_Krasovsky::PrjPoint_Krasovsky() { 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; } PrjPoint_Krasovsky::~PrjPoint_Krasovsky()
gcj坐标系转换代码
def
300.02.00.10.10.1abs
20.06.020.02.02.03.0
20.040.03.02.03.0
150.012.0300.030.02.03.0
return
#示例
128.543
37.065
print"WGS84坐标系经度:"
print"WGS84坐标系纬度:"
这段代码实现了GCJ坐标系到WGS84坐标系的转换。请注意,这只是一个简单的示例,实际中可能需要根据具体情况进行更复杂的处理和优化。
坐标系的转换是在不同坐标系之间进行数据转换的过程。在处理坐标系转换时,常见的包括直角坐标系(Cartesian coordinates)和大地坐标系(Geodetic coordinates),GCJ坐标系是一种由中国国家测绘局(国测局)使用的坐标系统,主要用于网络地图服务。
以下是一个简要的GCJ坐标系转换的Python代码示例,使用的是WGS84坐标系(GPS坐标):
import
def
6378245.0
0.00669342162296594323
105.035.0
105.035.0
180.0
1
180.01
180.0
return
def
100.02.03.00.20.10.2abs
20.06.020.03.0
160.012.032030.02.03.0
- 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);}。