⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 survey.cpp

📁 能够实现一些常用的地图转换
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -