utmproj.h
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:2k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. // utmproj.h
  2. //
  3. #ifndef UTM_H_
  4. #define UTM_H_
  5. #include <geo.h>
  6. #include <projects.h>
  7. #include <proj_api.h>
  8. class UTMProjection {
  9. protected:
  10. PJ * m_pj;
  11. public:
  12. UTMProjection(void)
  13. {
  14. m_pj = 0;
  15. }
  16. ~UTMProjection(void)
  17. {
  18. if (m_pj)
  19. {
  20. pj_free(m_pj);
  21. }
  22. m_pj = 0;
  23. }
  24. void forward(double lat, double lon, double& x, double& y)
  25. {
  26. if (m_pj)
  27. {
  28. projUV sUV;
  29. sUV.u = lon * GEO::DE2RA;
  30. sUV.v = lat * GEO::DE2RA;
  31. sUV = pj_fwd( sUV, m_pj );
  32. x = (int)(sUV.u + 0.50);
  33. y = (int)(sUV.v + 0.50);
  34. }
  35. }
  36. void inverse(double x, double y, double& lat, double& lon)
  37. {
  38. if (m_pj)
  39. {
  40. projUV sUV;
  41. sUV.u = x;
  42. sUV.v = y;
  43. sUV = pj_inv( sUV, m_pj );
  44. lon = sUV.u * GEO::RA2DE;
  45. lat = sUV.v * GEO::RA2DE;
  46. }
  47. }
  48. void setup(INT32 zone, const char * ellps = 0)
  49. {
  50. if (m_pj)
  51. {
  52. pj_free(m_pj);
  53. }
  54. char pjData[4][24];
  55. char * pjPtrs[4];
  56. strcpy(pjData[0],"proj=utm");
  57. sprintf(pjData[1],"zone=%d",zone);
  58. if (ellps)
  59. {
  60. strcpy(pjData[2],"ellps=");
  61. strcat(pjData[2],ellps);
  62. }
  63. else
  64. {
  65. strcpy(pjData[2],"ellps=WGS84");
  66. }
  67. strcpy(pjData[3],"units=m");
  68. pjPtrs[0] = pjData[0];
  69. pjPtrs[1] = pjData[1];
  70. pjPtrs[2] = pjData[2];
  71. pjPtrs[3] = pjData[3];
  72. m_pj = pj_init(4,pjPtrs);
  73. }
  74. void DD2DMS(double ll, INT32& degrees, INT32& minutes, double& seconds)
  75. {
  76. double dd = ll;
  77. degrees = (int)(double)(long)fabs(dd);
  78. double mm = (double)((fabs(dd) - degrees)*60.0);
  79. minutes = (int)mm;
  80. seconds = (double)((mm - (double)(long)(minutes))*60.0);
  81. if (seconds >= 60.00)
  82. {
  83. if (minutes == 59)
  84. {
  85. if (degrees < 0.0)
  86. degrees -= 1;
  87. else
  88. degrees += 1;
  89. minutes = 0;
  90. seconds -= 60.0;
  91. }
  92. else
  93. {
  94. seconds -= 60.00;
  95. minutes += 1;
  96. }
  97. }
  98. }
  99. };
  100. #endif