📄 survey.cpp
字号:
// Survey.cpp: implementation of the CSurvey class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "TransForm.h"
#include "Survey.h"
#include "math.h"
#include "stdlib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSurvey::CSurvey()
{
pi = 3.14159265358979;
cs_a=0; cs_b=0; cs_f=0; cs_E=0; cs_e1=0; cs_e2=0;
dsetx=0; dsety=0; dgetx=0; dgety=0;
dgetbl_b=0;dgetbl_l=0; //经纬度
dmerl=0;fdh=0; //中央子午线,代号 大地坐标==>地理坐标。
dmeil_last=0;fdh_last=0; //中央子午线,代号 地理坐标==>大地坐标。
dudai=3; //3度带或6度带
}
CSurvey::~CSurvey()
{
}
void CSurvey::GetSysDat(int sel)
{
if(sel == 1) //北京54系统
{
cs_a = (double)6378245;
cs_f = (double)(1/298.3);
}
else if(sel == 2) //西安80系统
{
cs_a = (double)6378140;
cs_f = (double)(1/298.257);
}
else //WGS84坐标系
{
cs_a = (double)6378137;
cs_f = (double)(1/298.257223563);
}
cs_b = cs_a * (1 - cs_f);
cs_E = cs_a * cs_a - cs_b * cs_b;
cs_e1 = cs_E / (cs_a*cs_a); // e1=(a^2-b^2)/a^2
cs_e2 = cs_E / (cs_b*cs_b); // e1=(a^2-b^2)/b^2
return;
}
BOOL CSurvey::GetFdh()
{
fdh=(int)(dsety/1000000);
if(fdh>=1)
{
dmerl=dudai*fdh-dudai+3; //根据代号计算中央子午线
return TRUE;
}
else
{
return FALSE;
}
}
double CSurvey::Blength(double xx)
{
double c0=0,c1=0,c2=0,c3=0,c4=0;
double a0=0,a1=0,a2=0,a3=0;
double b=0;
double blb=0;
double dlen=0;
c0 = cs_a * (1 - cs_e1);
c0 = xx / c0;
c1 = 1+(3*cs_e1)/4+(45*cs_e1*cs_e1)/64+(175*cs_e1*cs_e1*cs_e1)/256;
c2 = (3*cs_e1)/4+(15*cs_e1*cs_e1)/16+(525*cs_e1*cs_e1*cs_e1)/512;
c3 = (15*cs_e1*cs_e1) / 64 + (105*cs_e1*cs_e1*cs_e1) / 256;
c4 = (35*cs_e1*cs_e1*cs_e1) / 512;
a0 = c0 / c1;
a1 = c2 / (c1*2);
a2 = -c3 / (c1*4);
a3 = c4 / (c1*6);
b = a0;
blb=Calb(b, a0, a1, a2, a3);
dlen = 180 * blb / pi;
return dlen;
}
double CSurvey::Calb(double b, double a0, double a1, double a2, double a3)
{
double b1=0;
double reb=0;
b1 = a0 + a1 * sin(2 * b) + a2 * sin(4 * b) + a3 * sin(6 * b);
if(fabs(b1 - b) < 0.0000000001)
{
b = b1;
return b1;
}
else
{
b = b1;
reb=Calb(b, a0, a1, a2, a3);
return reb;
}
}
CString CSurvey::DMS(double datab) //将数据转换成度。分。秒
{
double b;
int i,J,k,L;
CString d, S, c, M, dmsa;
b = fabs(datab); i = (int)(b);
b = 60 * (b - i); J = (int)(b);
b = 60 * (b - J); k = (int)(b);
b = 10000 * (b - k);
if(b>=9000)
{
k=k+1; b=0;
if(k==60)
{
k=0; J=J+1;
if(J==60) { J=0; i=i+1; }
}
}
d.Format("%i",i);
d.TrimRight();d.TrimLeft();
M.Format("%i",J);
M.TrimRight();M.TrimLeft();
S.Format("%i",k);
S.TrimRight();S.TrimLeft();
L = (int)b;
c.Format("%i",L);
c.TrimRight();c.TrimLeft();
if(M.GetLength() == 1) {M = "0" + M;}
if(S.GetLength() == 1) {S = "0" + S;}
if(c.GetLength() == 1) {c = "0" + c;}
if(c.GetLength() == 2) {c = "0" + c;}
if(c.GetLength() == 3) {c = "0" + c;}
if(datab < 0) {d = "-" + d;}
dmsa = d + "." + M + S + c;
return dmsa;
}
double CSurvey::Deg(double datab) //将数据转换成度
{
double k, c, du=0;
int i, J;
if(datab>0)
{ k=1;}
else if(datab<0)
{ k=-1;}
else
{ k=0;}
//c = fabs(datab + 0.000000001);
c = ::fabsf(datab);
i = (int)c;
c = 100 * (c - i);
J = (int)c;
c = 100 * (c - J);
du = (i + (double)J / (double)60 + c / 3600) * k;
return du;
}
double CSurvey::Rmax(double datab)
{
double Wa=0;
double bb,sinb;
double reb=0;
double dgddu=0;
dgddu=Deg(datab);
bb = pi * dgddu / 180;
sinb = sin(bb);
Wa = sqrt(1 - cs_e1 * sinb * sinb);
reb = cs_a / Wa;
return reb;
}
BOOL CSurvey::XyToBl()
{
double djsx=0;
double jsn=0;
double bb;
double cB;
double M,m2,m3,m4,m5,m6;
double t,t2,t4;
double f2,f4;
double chawd,chajd;
dsety = dsety - 500000;
djsx = Blength(dsetx);
djsx = atof((DMS(djsx)));
jsn = Rmax(djsx);
djsx = Deg(djsx);
bb = pi * djsx / 180;
cB = cos(bb);
M = dsety / jsn;
m2 = M * M; m3 = M * m2; m4 = M * m3; m5 = M * m4; m6 = M * m5;
t = tan(bb);
t2 = t * t; t4 = t2 * t2;
f2 = cs_e2 * cB * cB;
f4 = f2 * f2;
double c,L;
c = 90*m2 - 7.5*(5+3*t2+f2-9*f2*t2)*m4 + 0.25*(61+90*t2+45*t4)*m6;
chawd = djsx - (1 + f2) * t * c / pi;
c = 180*M-30*(1+2*t2+f2)*m3+1.5*(5+28*t2+24*t4)*m5;
L = c / (pi * cB);
chajd = dmerl + L;
dgetsd=(180*M-60*(1+t2-f2)*m3+12*(2+5*t2+3*t4)*m5)*t/pi;
dgetbl_b = atof(DMS(chawd));
dgetbl_l = atof(DMS(chajd));
dgetsd = atof(DMS(dgetsd));
return TRUE;
}
double CSurvey::Slength(double jwd)
{
double c1,c2,c3,c4;
double b0,bb,bb1,sb2,sb4,sb6;
double S,reb;
c1 = 1 + 3*cs_e1/4 + 45*cs_e1*cs_e1/64 + 175*cs_e1*cs_e1*cs_e1/256;
c2 = 3*cs_e1/4 + 15*cs_e1*cs_e1/16 + 525*cs_e1*cs_e1*cs_e1/512;
c3 = 15*cs_e1*cs_e1/64 + 105*cs_e1*cs_e1*cs_e1/256;
c4 = 35*cs_e1*cs_e1*cs_e1/512;
b0 = Deg(jwd);
bb1 = pi * b0 / 180;
bb = 2 * bb1;
sb2 = sin(bb);
bb = 4 * bb1;
sb4 = sin(bb);
bb = 6 * bb1;
sb6 = sin(bb);
S = c1*bb1-c2*sb2/2+c3*sb4/4-c4*sb6/6;
reb = cs_a*(1-cs_e1)*S;
return reb;
}
void CSurvey::BCalMeri(double jdB,double jdmin,int daihao,double* reMeri,double* redh)
{ //根据经度计算中央子午线
double ys;
double sjd;
int qian;
double jmin=0;
jmin=Deg(jdmin);
sjd=Deg(jdB);
sjd=(sjd+jmin)/2;
sjd=sjd+(double)daihao/2;
if(daihao==6)
{
ys=fmod(jdB,(double)daihao);
if(ys!=0)
{ qian=(int)(jdB/daihao)+1; }
else
{ qian=(int)(jdB/daihao); }
}
else
{ qian=(int)(sjd/daihao); }
*reMeri = qian*daihao-daihao+3;
*redh = qian;
return;
}
BOOL CSurvey::BlToXy()
{
double DL;
double n,bb,cB;
double M,m2,m3,m4,m5,m6;
double t,t2,t4;
double f2,f4,c;
DL = Deg(dgetbl_l) - Deg(dmeil_last);//与中央子午线的经差
n = Rmax(dgetbl_b);
dgetx = Slength(dgetbl_b);//赤道至纬度B的子午线弧长 即X
bb = Deg(dgetbl_b);
bb = pi * bb / 180;
cB = cos(bb);
M = cB * pi * DL / 180;//cosB.l
m2 = M * M; m3 = M * m2; m4 = M * m3; m5 = M * m4; m6 = M * m5;
t = tan(bb);
t2 = t * t; t4 = t2 * t2;
f2 = cs_e2 * cB * cB;
f4 = f2 * f2;
c = m2/2 + (5-t2+9*f2+4*f4)*m4/24 + (61-58*t2+t4)*m6/720;
dgetx = dgetx + n * t * c;
c = M + (1-t2+f2)*m3/6 + (5-18*t2+t4+14*f2-58*f2*t2)*m5/120;
dgety = n * c + 500000;
dgetsd = t*(180*M+(1+3*f2+2*f4)*m3*60+(2-t2)*m5*12)/pi;
dgetsd = atof(DMS(dgetsd));
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//新图号计算旧图号 分解图号
void CSurvey::GetReduceNewth(CString strnewtf,char* top,int* jw,char* sc,int* row,int* col)
{ //H50E001012
int i=0;
CString strgd;
//strgd = strnewtf.Left(1);
//strcmp(top,strgd);
*top=strnewtf.GetAt(0);
strgd=strnewtf.Mid(1,2);
*jw=atoi(strgd);
//strgd=strnewtf.Mid(3,1);
//strcmp(sc,strgd);
*sc=strnewtf.GetAt(3);
strgd=strnewtf.Mid(4,3);
*row=atoi(strgd);
strgd=strnewtf.Right(3);
*col=atoi(strgd);
return;
}
CString CSurvey::GetOldThFormNewTh(CString strnewtf)
{
CString stroldtf;
CString strn;
CString BLC;
int KK=0,jj=0,mm=0;
int nn=0;
char tmph; char tmpsc;
int jw=0;int rowws=0;int colls=0;
GetReduceNewth(strnewtf,&tmph,&jw,&tmpsc,&rowws,&colls);
//stroldtf.SetAt(0,tmph);
stroldtf.Format("%c",tmph);
strn.Format("%i",jw);
stroldtf=stroldtf+"-"+strn;
switch(tmpsc)
{
case 'B': //'1:50万
BLC = "500000";
if(rowws==1&&colls==1) {stroldtf=stroldtf+"-A";}
else if(rowws==1&&colls==2) {stroldtf=stroldtf+"-B";}
else if(rowws==2&&colls==1) {stroldtf=stroldtf+"-C";}
else if(rowws==2&&colls==2) {stroldtf=stroldtf+"-D";}
break;
case 'C': //'1:25万
BLC = "250000";
//oldtf = oldtf + "-(" + Trim(Str$((rowws - 1) * 6 + colls) + ")")
strn.Format("%i",(rowws - 1) * 6 + colls);
stroldtf=stroldtf+"-("+strn+")";
break;
case 'D': //'1:10万
BLC = "100000";
//oldtf = oldtf + "-" + Trim(Str$((rowws - 1) * 12 + colls))
strn.Format("%i",(rowws - 1) * 12 + colls);
stroldtf=stroldtf+"-"+strn;
break;
case 'E': //'1:5万
BLC = "50000";
if((int)fmod((double)rowws,(double)2)!=0)
{
KK = (int)(rowws + 1) / 2;
mm = 1;
}
else
{
KK = (int)rowws / 2;
mm = 2;
}
if((int)fmod((double)colls,(double)2)!=0)
{
jj = (int)(colls + 1) / 2;
nn = 1;
}
else
{
jj = (int)colls / 2;
nn = 2;
}
strn.Format("%i",(KK - 1) * 12 + jj);
stroldtf=stroldtf+"-"+strn;
//oldtf = oldtf + "-" + Trim(Str$((KK - 1) * 12 + jj))
//dm$ = Trim(Str$(mm)) + Trim(Str$(nn))
if(mm==1&&nn==1) {stroldtf=stroldtf+"-A";}
else if(mm==1&&nn==2) {stroldtf=stroldtf+"-B";}
else if(mm==2&&nn==1) {stroldtf=stroldtf+"-C";}
else if(mm==2&&nn==2) {stroldtf=stroldtf+"-D";}
break;
case 'F': //'1:2.5万
BLC = "25000";
if((int)fmod((double)rowws,(double)4)!=0)
{
KK = (int)(rowws / 4 + 1);
mm=1;
}
else
{
KK = (int)(rowws / 4);
mm=2;
}
if((int)fmod((double)colls,(double)4)!=0)
{
jj = colls / 4 + 1;
nn=1;
}
else
{
jj = colls / 4;
nn=2;
}
strn.Format("%i", (KK - 1) * 12 + jj);
//oldtf = oldtf + "-" + Trim(Str$((KK - 1) * 12 + jj))
stroldtf=stroldtf+"-"+strn;
if(mm==1&&nn==1) {stroldtf=stroldtf+"-A";}
else if(mm==1&&nn==2) {stroldtf=stroldtf+"-B";}
else if(mm==2&&nn==1) {stroldtf=stroldtf+"-C";}
else if(mm==2&&nn==2) {stroldtf=stroldtf+"-D";}
KK =(int)fmod((double)rowws,(double)4);
jj =(int)fmod((double)colls,(double)4);
if( KK == 0 ) {KK = 4;}
if( jj == 0 ) {jj = 4;}
int mhd;
mhd=(int)fmod((double)KK,(double)4);
if( mhd == 1 || mhd == 3) { mm = 1;}
else { mm = 2;}
mhd=(int)fmod((double)jj,(double)4);
if( mhd == 1 || mhd == 3) { nn = 1;}
else { nn = 2;}
if(mm==1&&nn==1) {stroldtf=stroldtf+"-1";}
else if(mm==1&&nn==2) {stroldtf=stroldtf+"-2";}
else if(mm==2&&nn==1) {stroldtf=stroldtf+"-3";}
else if(mm==2&&nn==2) {stroldtf=stroldtf+"-4";}
break;
case 'G': //'1:1万
BLC = "10000";
if((int)fmod((double)rowws,(double)8)!=0)
{ KK = (int)rowws / 8 + 1;}
else
{ KK = (int)rowws / 8;}
if((int)fmod((double)colls,(double)8)!=0)
{ jj = (int)colls / 8 + 1;}
else
{ jj = (int)colls / 8;}
strn.Format("%i",(KK - 1) * 12 + jj);
stroldtf=stroldtf+"-"+strn;
//oldtf = oldtf + "-" + Trim(Str$((KK - 1) * 12 + jj))
KK = (int)fmod((double)rowws,(double)8);
jj = (int)fmod((double)colls,(double)8);
if( KK == 0) { KK = 8;}
if( jj == 0) { jj = 8;}
jj = (KK - 1) * 8 + jj;
strn.Format("%i",jj);
stroldtf=stroldtf+"-("+strn+")";
break;
case 'H': //'1:5千
BLC = "5000";
if((int)fmod((double)rowws,(double)16)!=0)
{ //KK = (int)(rowws + 1) / 16 + 1;
KK = (int)(rowws / 16) + 1;
}
else
{ KK = (int)rowws / 16;}
if((int)fmod((double)colls,(double)16)!=0)
{ //jj = (int)(colls + 1) / 16 + 1;
jj = (int)(colls / 16) + 1;}
else
{ jj = (int)colls / 16;}
strn.Format("%i",(KK - 1) * 12 + jj);
stroldtf=stroldtf+"-"+strn;
KK=(int)(fmod((double)rowws,(double)16)/2+0.5);
jj=(int)(fmod((double)colls,(double)16)/2+0.5);
if( KK == 0) {KK = 8;}
if( jj == 0) {jj = 8;}
strn.Format("%i",(KK - 1) * 8 + jj);
stroldtf=stroldtf+"-("+strn+")";
KK =(int)fmod((double)rowws,(double)16);
KK =(int)fmod((double)colls,(double)16);
if((int)fmod((double)KK,(double)2)!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -