坐标转换的源代码.txt
上传用户:jsljixie
上传日期:2010-01-31
资源大小:3k
文件大小:6k
源码类别:

其他行业

开发平台:

Visual C++

  1. // WGS2GK.CPP : C++ version of Ottmar Labonde's WGSDHDN3.PAS with CPU time measurement
  2. // compile with MS Visual C++ version 6.0 or do the necessary modifications for your compiler
  3. //
  4. // Conversion of WGS84 lat and lon to DHDN- (Deutsches Haupt-Dreiecksnetz),
  5. // aka "Potsdam-Datum" and R & H (Gauss-Krueger Rechtswert and Hochwert).
  6. #include "stdafx.h"
  7. #include <math.h>
  8. #define Pi 3.1415926535897932384626433832795028841971693993751058209749445923078164
  9. const double awgs = 6378137.0;        // WGS84 Semi-Major Axis = Equatorial Radius in meters
  10. const double bwgs = 6356752.314;      // WGS84 Semi-Minor Axis = Polar Radius in meters
  11. const double abes = 6377397.155;      // Bessel Semi-Major Axis = Equatorial Radius in meters
  12. const double bbes = 6356078.962;      // Bessel Semi-Minor Axis = Polar Radius in meters
  13. const double cbes = 111120.6196;      // Bessel latitude to Gauss-Krueger meters
  14. const double dx   = -585.7;           // Translation Parameter 1
  15. const double dy   = -87.0;            // Translation Parameter 2 
  16. const double dz   = -409.2;           // Translation Parameter 3
  17. const double rotx = 2.540423689E-6;   // Rotation Parameter 1
  18. const double roty = 7.514612057E-7;   // Rotation Parameter 2
  19. const double rotz = -1.368144208E-5;  // Rotation Parameter 3
  20. // const double sc   = 1/0.99999122;     // Scaling Factor wrong!
  21. // Maik Stoeckmann reported this error on Nov 12th 2002. Thank you, Maik!
  22. const double sc   = 0.99999122;       // Scaling Factor
  23. double l1;
  24. double b1;
  25. double l2;
  26. double b2;
  27. double h1;
  28. double h2;
  29. double R;
  30. double H;
  31. double a;
  32. double b;
  33. double eq;
  34. double N;
  35. double Xq;
  36. double Yq;
  37. double Zq;
  38. double X;
  39. double Y;
  40. double Z;
  41. // For performance measurement
  42. static LARGE_INTEGER pm_freq;
  43. static LARGE_INTEGER pm_start;
  44. LARGE_INTEGER pm_end;
  45. double pm_executiontime;
  46. // Prototypes
  47. void HelmertTransformation(double,double,double,double&,double&,double&);
  48. void BesselBLnachGaussKrueger(double,double,double&,double&);
  49. void BLRauenberg (double,double,double,double&,double&,double&);
  50. double neuF(double,double,double,double);
  51. double round(double);
  52. int main(int argc, char* argv[])
  53. {
  54.   printf("WGS84 to Gauss-Krueger Transformation Testn");
  55.   printf("Written by Walter Piechulla, Regensburg Universityn");
  56.   printf("Thanks to Ottmar Labonde, http://user.baden-online.de/~olabonde/n");
  57.   printf("This should work for Germany with an error of +- 1 mn");
  58.   printf("nPlease type in WGS-Latitude (decimal)> ");
  59.   scanf("%lf",&b1);
  60.   printf("nPlease type in WGS-Longitude (decimal)> ");
  61.   scanf("%lf",&l1);
  62.   printf("nPlease type in WGS-Height over ground (meters)> ");
  63.   scanf("%lf",&h1);
  64.   QueryPerformanceFrequency(&pm_freq);      // get frequency
  65.   QueryPerformanceCounter(&pm_start);       // store actual counter
  66.     
  67.   l1=Pi*l1/180;
  68.   b1=Pi*b1/180;
  69.   a=awgs; 
  70.   b=bwgs;
  71.   
  72.   eq=(a*a-b*b)/(a*a);
  73.   N=a/sqrt(1-eq*sin(b1)*sin(b1));
  74.   Xq=(N+h1)*cos(b1)*cos(l1);
  75.   Yq=(N+h1)*cos(b1)*sin(l1);
  76.   Zq=((1-eq)*N+h1)*sin(b1);
  77.   HelmertTransformation(Xq,Yq,Zq,X,Y,Z);
  78.   
  79.   a=abes;
  80.   b=bbes;
  81.   eq=(a*a-b*b)/(a*a);
  82.   BLRauenberg(X,Y,Z,b2,l2,h2);
  83.   
  84.   BesselBLnachGaussKrueger(b2,l2,R,H);
  85.   
  86.   b2=b2*180/Pi;
  87.   l2=l2*180/Pi;
  88.   QueryPerformanceCounter(&pm_end); 
  89.   // executiontime is difference of counters divided by the frequency
  90.   pm_executiontime=(double)(pm_end.QuadPart - pm_start.QuadPart)/(double)pm_freq.QuadPart;
  91.   printf("nPotsdam-Breite: %lfn",b2);
  92.   printf("Potsdam-Laenge: %lfn",l2);
  93.   printf("Potsdam-Hoehe: %lfn",h2);
  94.   
  95.   printf("nGauss-Krueger Koordinaten:nn");
  96.   printf("R = %lfnn",R);
  97.   printf("H = %lfnn",H);
  98.   printf("Execution time in ms = %5.3lfn", pm_executiontime*1000);
  99.   return(0);
  100. }
  101. void HelmertTransformation(double x,double y,double z,double& xo,double& yo,double& zo)
  102. {
  103.   xo=dx+(sc*(1*x+rotz*y-roty*z));
  104.   yo=dy+(sc*(-rotz*x+1*y+rotx*z));
  105.   zo=dz+(sc*(roty*x-rotx*y+1*z));
  106. }                            
  107. void BesselBLnachGaussKrueger(double b,double ll,double& Re,double& Ho)
  108. {
  109.   double l;
  110.   double l0;
  111.   double bg;
  112.   double lng;
  113.   double Ng;
  114.   double k;
  115.   double t;
  116.   double eq;
  117.   double Vq;
  118.   double v;
  119.   double nk;
  120.   double X;
  121.   double gg;
  122.   double SS;
  123.   double Y;
  124.   double kk;
  125.   double Pii;
  126.   double RVV;
  127.   bg=180*b/Pi;
  128.   lng=180*ll/Pi;
  129.   l0=3*round((180*ll/Pi)/3);
  130.   l0=Pi*l0/180;
  131.   l=ll-l0;
  132.   k=cos(b);
  133.   t=sin(b)/k;
  134.   eq=(abes*abes-bbes*bbes)/(bbes*bbes);
  135.   Vq=1+eq*k*k;
  136.   v=sqrt(Vq);
  137.   Ng=abes*abes/(bbes*v);
  138.   nk=(abes-bbes)/(abes+bbes);
  139.   X=((Ng*t*k*k*l*l)/2)+((Ng*t*(9*Vq-t*t-4)*k*k*k*k*l*l*l*l)/24);
  140.   gg=b+(((-3*nk/2)+(9*nk*nk*nk/16))*sin(2*b)+15*nk*nk*sin(4*b)/16-35*nk*nk*nk*sin(6*b)/48);
  141.   SS=gg*180*cbes/Pi;
  142.   Ho=(SS+X);
  143.   Y=Ng*k*l+Ng*(Vq-t*t)*k*k*k*l*l*l/6+Ng*(5-18*t*t+t*t*t*t)*k*k*k*k*k*l*l*l*l*l/120;
  144.   kk=500000;
  145.   Pii=Pi;
  146.   RVV=round((180*ll/Pii)/3);
  147.   Re=RVV*1000000+kk+Y;
  148. }
  149. void BLRauenberg (double x,double y,double z,double& b,double& l,double& h)
  150. {
  151.   double f;
  152.   double f1;
  153.   double f2;
  154.   double ft;
  155.   double p;
  156.   f=Pi*50/180;
  157.   p=Z/sqrt(x*x+y*y);
  158.   
  159.   do
  160.   {
  161.     f1=neuF(f,x,y,p);
  162.     f2=f;
  163.     f=f1;
  164.     ft=180*f1/Pi;
  165.   }
  166.   while(!(fabs(f2-f1)<10E-10));
  167.   
  168.   b=f;
  169.   l=atan(y/x);
  170.   h=sqrt(x*x+y*y)/cos(f1)-a/sqrt(1-eq*sin(f1)*sin(f1));
  171. }
  172. double neuF(double f,double x,double y,double p)
  173. {
  174.   double zw;
  175.   double nnq;
  176.   zw=a/sqrt(1-eq*sin(f)*sin(f));
  177.   nnq=1-eq*zw/(sqrt(x*x+y*y)/cos(f));
  178.   return(atan(p/nnq));
  179. }
  180. double round(double src)
  181. {
  182.   double theInteger;
  183.   double theFraction;
  184.   double criterion = 0.5;
  185.   theFraction = modf(src,&theInteger);
  186.   if (!(theFraction < criterion))
  187.   {
  188.     theInteger += 1; 
  189.   } 
  190.   return theInteger;
  191. }
  192. // Outline for measurement of used CPU time with Windows 95/98/NT
  193. //
  194. // QueryPerformanceFrequency(&freq);      // get frequency
  195. // QueryPerformanceCounter(&start);       // store actual counter
  196. //...
  197. // execute code to measure
  198. //...
  199. // QueryPerformanceCounter(&end); // store actual counter again
  200. //
  201. // executiontime is difference of counters divided by the frequency
  202. // executiontime=(double)(end.QuadPart - start.QuadPart)/(double)freq.QuadPart;
  203. //
  204. // printf("execution in ms = %5.3lfn", executiontime*1000);