QCoordSys.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:50k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QCoordSys.cpp: implementation of the CQCoordSys class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeResource.h"
  6. #include "..includeQCoordSys.h"
  7. #include "..includeQBaseObj.h"
  8. #include "....geoprojectionsMapProjections.h"
  9. #include "..includeQGlobalObj.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CQGISEllipsiodParams::CQGISEllipsiodParams(enumQGISEllipsiodType ET /* = ET_KLSFSJ */)
  19. {
  20. switch(ET)
  21. {
  22. case ET_UNKNOWN:
  23. {
  24. break;
  25. }
  26. case ET_KLSFSJ:  //克拉索夫斯基
  27. {
  28. m_szEName = "克拉索夫斯基椭球(1940)"; //椭球球名称 Krassovsky
  29. m_lEID = ET_KLSFSJ;
  30. m_lEYear = 1940;
  31. m_fEHalfMajorAxis = 6378245; //椭球长半轴
  32. m_fEHalfMinorAxis = 6356863.018773; //椭球短半轴
  33. m_fEFlattening = 1.0/298.3;  //扁率
  34. m_fEGravityConst = 0; //地心引力常数
  35. m_fXOffset = 0;
  36. m_fYOffset = 0;
  37. m_fZOffset = 0;
  38. break;
  39. }
  40. case ET_IUGG75:
  41. {
  42. m_szEName = "IUGG75椭球";
  43. m_lEID = ET_IUGG75;
  44. m_lEYear = 1975;
  45. m_fEHalfMajorAxis = 6378140;//椭球长半轴
  46. m_fEHalfMinorAxis = 6356755.2881575;//椭球短半轴
  47. m_fEFlattening = 1.0/298.257; //扁率
  48. m_fEGravityConst = 0; //地心引力常数
  49. m_fXOffset = 0;
  50. m_fYOffset = 0;
  51. m_fZOffset = 0;
  52. break;
  53. }
  54. case ET_WGS84:
  55. {
  56. m_lEID = ET_WGS84;//
  57. m_szEName = "WGS-84椭球(1984)";//椭球体名称  Krassovsky
  58. m_lEYear = 1984;//定义年代
  59. m_fEHalfMajorAxis = 6378137;//椭球长半轴
  60. m_fEHalfMinorAxis = 6356752.3142451;//椭球短半轴
  61. m_fEFlattening = 1.0/298.257223563; //扁率
  62. m_fEGravityConst = 0; //地心引力常数
  63. m_fXOffset = 0;
  64. m_fYOffset = 0;
  65. m_fZOffset = 0;
  66. break;
  67. }
  68. case ET_MAX:
  69. break;
  70. default:
  71. {
  72. m_szEName = "克拉索夫斯基椭球(1940)"; //椭球球名称 Krassovsky
  73. m_lEID = ET_KLSFSJ;
  74. m_lEYear = 1940;
  75. m_fEHalfMajorAxis = 6378245; //椭球长半轴
  76. m_fEHalfMinorAxis = 6356863.018773; //椭球短半轴
  77. m_fEFlattening = 1.0/298.3;  //扁率
  78. m_fEGravityConst = 0; //地心引力常数
  79. m_fXOffset = 0;
  80. m_fYOffset = 0;
  81. m_fZOffset = 0;
  82. break;
  83. }
  84. }
  85. }
  86. CQGISEllipsiodParams::CQGISEllipsiodParams(CQGISEllipsiodParams & e)
  87. {
  88. m_lEID = e.GetEllipsioddType();
  89. m_szEName = e.GetellipsiodName();
  90. m_lEYear = e.GetEllipsiodYear();
  91. m_fEHalfMajorAxis = e.GetEHalfMajorAxis();
  92. m_fEHalfMinorAxis = e.GetEHalfMinorAxis();
  93. m_fEFlattening = e.GetEFlattening();
  94. m_fEGravityConst = e.m_fEGravityConst;
  95. m_fXOffset = e.m_fXOffset;
  96. m_fYOffset = e.m_fYOffset;
  97. m_fZOffset = e.m_fZOffset;
  98. }
  99. void CQGISEllipsiodParams::Copy(CQGISEllipsiodParams & e)
  100. {
  101. m_lEID = e.GetEllipsioddType();
  102. m_szEName = e.GetellipsiodName();
  103. m_lEYear = e.GetEllipsiodYear();
  104. m_fEHalfMajorAxis = e.GetEHalfMajorAxis();
  105. m_fEHalfMinorAxis = e.GetEHalfMinorAxis();
  106. m_fEFlattening = e.GetEFlattening();
  107. m_fEGravityConst = e.m_fEGravityConst;
  108. m_fXOffset = e.m_fXOffset;
  109. m_fYOffset = e.m_fYOffset;
  110. m_fZOffset = e.m_fZOffset;
  111. }
  112. void CQGISEllipsiodParams::SetEHalfMajorAxis(double a)
  113. {
  114. if(a<6378100) return;
  115. m_fEHalfMajorAxis = a;
  116. }
  117. double CQGISEllipsiodParams::GetEHalfMajorAxis()
  118. {
  119. return m_fEHalfMajorAxis;
  120. }
  121. void CQGISEllipsiodParams::SetEHalfMinorAxis(double b)
  122. {
  123. if(b<6356000) return;
  124. m_fEHalfMinorAxis = b;
  125. }
  126. double CQGISEllipsiodParams::GetEHalfMinorAxis()
  127. {
  128. return m_fEHalfMinorAxis;
  129. }
  130. void CQGISEllipsiodParams::SetEFlattening(double flat)
  131. {
  132. if(flat>1/290) return;
  133. m_fEFlattening = flat;
  134. }
  135. double CQGISEllipsiodParams::GetEFlattening()
  136. {
  137. return m_fEFlattening;
  138. }
  139. void CQGISEllipsiodParams::SetEllipsiodName(CString szEllipsiodName)
  140. {
  141. m_szEName = szEllipsiodName;
  142. }
  143. CString CQGISEllipsiodParams::GetellipsiodName()
  144. {
  145. return m_szEName;
  146. }
  147. void CQGISEllipsiodParams::SetEllipsiodType(long lET)
  148. {
  149. if(lET<=ET_UNKNOWN || lET>ET_MAX) lET = ET_UNKNOWN;
  150. m_lEID = lET;
  151. }
  152. long CQGISEllipsiodParams::GetEllipsioddType()
  153. {
  154. return m_lEID;
  155. }
  156. void CQGISEllipsiodParams::SetellipsiodYear(long lYear)
  157. {
  158. m_lEYear = lYear;
  159. }
  160. long CQGISEllipsiodParams::GetEllipsiodYear()
  161. {
  162. return m_lEYear;
  163. }
  164. CString CQGISEllipsiodParams::ValToStr()
  165. {
  166. CString sz;
  167. sz.Empty();
  168. if(m_lEID != 0)
  169. {
  170. char * szEType = new char;
  171. switch(m_lEID)
  172. {
  173. case ET_KLSFSJ:
  174. szEType = "ET_KLSFSJ";
  175. break;
  176. case ET_IUGG75:
  177. szEType = "ET_IUGG75";
  178. break;
  179. case ET_USERDEF:
  180. szEType = "ET_USERDEF";
  181. break;
  182. case ET_WGS84:
  183. szEType = "ET_WGS84";
  184. break;
  185. default:
  186. szEType = "ET_KLSFSJ";
  187. break;
  188. }
  189. sz.Format("椭球类型:%s椭球确定时间:%d椭球名称:%s椭球常轴:%f椭球短轴:%f椭球扁率:%f椭球重力引力常数:%f椭球偏移:%f,%f,%f",
  190. szEType,m_lEYear,m_szEName,m_fEHalfMajorAxis,
  191. m_fEHalfMinorAxis,m_fEFlattening,m_fEGravityConst,m_fXOffset,m_fYOffset,m_fZOffset);
  192. }
  193. return sz;
  194. }
  195. void CQGISEllipsiodParams::DataSerialize(CArchive & ar)
  196. {
  197. if(ar.IsStoring())
  198. {
  199. ar<<m_lEID;
  200.     ar<<m_lEYear;
  201. ar<<m_szEName;
  202. ar<<m_fEHalfMajorAxis;
  203. ar<<m_fEHalfMinorAxis;
  204. ar<<m_fEFlattening;
  205. ar<<m_fEFlattening;
  206. ar<<m_fXOffset;
  207. ar<<m_fYOffset;
  208. ar<<m_fZOffset;
  209. }
  210. else
  211. {
  212. ar>>m_lEID;
  213.     ar>>m_lEYear;
  214. ar>>m_szEName;
  215. ar>>m_fEHalfMajorAxis;
  216. ar>>m_fEHalfMinorAxis;
  217. ar>>m_fEFlattening;
  218. ar>>m_fEFlattening;
  219. ar>>m_fXOffset;
  220. ar>>m_fYOffset;
  221. ar>>m_fZOffset;
  222. }
  223. }
  224. IMPLEMENT_SERIAL(CQGISEllipsiodParams,CObject,1)
  225. void CQGISEllipsiodParams::Serialize(CArchive & ar)
  226. {
  227. if(ar.IsStoring())
  228. {
  229. ar.Write(&m_lEID,sizeof(long));
  230. ar.Write(&m_lEYear,sizeof(long));
  231. ar.Write(&m_fEHalfMajorAxis,sizeof(float));
  232. ar.Write(&m_fEHalfMinorAxis,sizeof(float));
  233. ar.Write(&m_fEFlattening,sizeof(float));
  234. ar.Write(&m_fEGravityConst,sizeof(float));
  235. ar.Write(&m_fXOffset,sizeof(float));
  236. ar.Write(&m_fYOffset,sizeof(float));
  237. ar.Write(&m_fZOffset,sizeof(float));
  238. int i = m_szEName.GetLength();
  239. ar.Write(&i,sizeof(int));
  240. ar.Write((const char *)m_szEName,i);
  241. }
  242. else
  243. {
  244. ar.Read(&m_lEID,sizeof(long));
  245. ar.Read(&m_lEYear,sizeof(long));
  246. ar.Read(&m_fEHalfMajorAxis,sizeof(float));
  247. ar.Read(&m_fEHalfMinorAxis,sizeof(float));
  248. ar.Read(&m_fEFlattening,sizeof(float));
  249. ar.Read(&m_fEGravityConst,sizeof(float));
  250. ar.Read(&m_fXOffset,sizeof(float));
  251. ar.Read(&m_fYOffset,sizeof(float));
  252. ar.Read(&m_fZOffset,sizeof(float));
  253. int i = 0;
  254. ar.Read(&i,sizeof(int));
  255. char szName[255];
  256. ar.Read(szName,i);
  257. szName[i] = '';
  258. m_szEName = CString(szName);
  259. }
  260. }
  261. bool CQGISEllipsiodParams::operator ==(CQGISEllipsiodParams & e)
  262. {
  263. if(m_lEID == e.GetEllipsioddType() &&
  264. m_lEYear == e.GetEllipsiodYear() &&
  265. m_szEName == e.GetellipsiodName() && 
  266. m_fEHalfMajorAxis == e.GetEHalfMajorAxis() &&
  267. m_fEHalfMinorAxis == e.m_fEHalfMinorAxis &&
  268. m_fEGravityConst == e.m_fEGravityConst && 
  269. m_fEFlattening == e.GetEFlattening() &&
  270. m_fXOffset == e.m_fXOffset && 
  271. m_fYOffset == e.m_fYOffset && 
  272. m_fZOffset == e.m_fZOffset)
  273. return true;
  274. else
  275. return false;
  276. }
  277. //////////////////////////////////////////////////////////////////////////
  278. CQGISMapProjectionParams::CQGISMapProjectionParams()
  279. {
  280. m_lMID = 1;
  281. m_szMName = "Gauss投影";
  282. m_dMLatitude_Of_False_Origin = 0;//原点纬度
  283. m_dMLongitude_Of_False_Origin = 114*PI/180;//中央经度
  284. m_dMLatitude_Of_1st_Standard_Parallel = 20*PI/180;//第1标准纬线
  285. m_dMLatitude_Of_2nd_Standard_Parallel = 40*PI/180;//第2标准纬线
  286. m_dMEasting_At_False_Origin = 0;
  287. m_dMNorthing_At_False_Origin = 0;
  288. m_dMLatitude_Of_Projection_Centre = 0;
  289. m_dMLongitude_Of_Projection_Centre = 0;
  290. m_dMScale_Factor_On_Initial_Line = 1;
  291. m_dMAzimuth_Of_Initial_Line = 0;
  292. m_dMAngle_From_Rectified_To_Skewed_Grid = 0;
  293. m_dMEasting_At_Projection_Centre = 0;
  294. m_dMNorthing_At_Projection_Centre = 0;
  295. m_dMLatitude_Of_Natural_Origin = 0; 
  296. m_dMLongitude_Of_Natural_Origin = 0;
  297. m_dMScale_Factor_At_Natural_Origin = 0;
  298. m_dMFalse_Easting = 0;
  299. m_dMFalse_Northing = 0;
  300. }
  301. CQGISMapProjectionParams::CQGISMapProjectionParams(CQGISMapProjectionParams & e)
  302. {
  303. m_lMID = e.GetMapProjectionType();
  304. m_szMName = e.m_szMName;
  305. m_dMLatitude_Of_False_Origin = e.GetLatitudeOfFalseOrigin();
  306. m_dMLongitude_Of_False_Origin = e.GetLongitudeOfFalseOrigin();
  307. m_dMLatitude_Of_1st_Standard_Parallel = e.GetLatitudeOf1stStandardParallel();
  308. m_dMLatitude_Of_2nd_Standard_Parallel = e.GetLatitudeOf2ndStandardParallel();
  309. m_dMEasting_At_False_Origin = e.GetEastingAtFalseOrigin();
  310. m_dMNorthing_At_False_Origin = e.GetNorthingAtFalseOrigin();
  311. m_dMLatitude_Of_Projection_Centre = e.m_dMLatitude_Of_Projection_Centre;
  312. m_dMLongitude_Of_Projection_Centre = e.m_dMLongitude_Of_Projection_Centre;
  313. m_dMScale_Factor_On_Initial_Line = e.m_dMScale_Factor_On_Initial_Line;
  314. m_dMAzimuth_Of_Initial_Line = e.m_dMAzimuth_Of_Initial_Line;
  315. m_dMAngle_From_Rectified_To_Skewed_Grid = e.m_dMAngle_From_Rectified_To_Skewed_Grid;
  316. m_dMEasting_At_Projection_Centre = e.m_dMEasting_At_Projection_Centre;
  317. m_dMNorthing_At_Projection_Centre = e.m_dMNorthing_At_Projection_Centre;
  318. m_dMLatitude_Of_Natural_Origin = e.m_dMLatitude_Of_Natural_Origin; 
  319. m_dMLongitude_Of_Natural_Origin = e.m_dMLongitude_Of_Natural_Origin;
  320. m_dMScale_Factor_At_Natural_Origin = e.m_dMScale_Factor_At_Natural_Origin;
  321. m_dMFalse_Easting = e.m_dMFalse_Easting;
  322. m_dMFalse_Northing = e.m_dMFalse_Northing;
  323. }
  324. CQGISMapProjectionParams CQGISMapProjectionParams::operator =(CQGISMapProjectionParams & e)
  325. {
  326. m_lMID = e.m_lMID;
  327. m_szMName = e.m_szMName;
  328. m_dMLatitude_Of_False_Origin = e.m_dMLatitude_Of_False_Origin;
  329. m_dMLongitude_Of_False_Origin = e.m_dMLongitude_Of_False_Origin;
  330. m_dMLatitude_Of_1st_Standard_Parallel = e.m_dMLatitude_Of_1st_Standard_Parallel;
  331. m_dMLatitude_Of_2nd_Standard_Parallel = e.m_dMLatitude_Of_2nd_Standard_Parallel;
  332. m_dMEasting_At_False_Origin = e.m_dMEasting_At_False_Origin;
  333. m_dMNorthing_At_False_Origin = e.m_dMNorthing_At_False_Origin;
  334. m_dMLatitude_Of_Projection_Centre = e.m_dMLatitude_Of_Projection_Centre;
  335. m_dMLongitude_Of_Projection_Centre = e.m_dMLongitude_Of_Projection_Centre;
  336. m_dMScale_Factor_On_Initial_Line = e.m_dMScale_Factor_On_Initial_Line;
  337. m_dMAzimuth_Of_Initial_Line = e.m_dMAzimuth_Of_Initial_Line;
  338. m_dMAngle_From_Rectified_To_Skewed_Grid = e.m_dMAngle_From_Rectified_To_Skewed_Grid;
  339. m_dMEasting_At_Projection_Centre = e.m_dMEasting_At_Projection_Centre;
  340. m_dMNorthing_At_Projection_Centre = e.m_dMNorthing_At_Projection_Centre;
  341. m_dMLatitude_Of_Natural_Origin = e.m_dMLatitude_Of_Natural_Origin; 
  342. m_dMLongitude_Of_Natural_Origin = e.m_dMLongitude_Of_Natural_Origin;
  343. m_dMScale_Factor_At_Natural_Origin = e.m_dMScale_Factor_At_Natural_Origin;
  344. m_dMFalse_Easting = e.m_dMFalse_Easting;
  345. m_dMFalse_Northing = e.m_dMFalse_Northing;
  346. return *this;
  347. }
  348. bool CQGISMapProjectionParams::operator == (CQGISMapProjectionParams & e)
  349. {
  350. if(
  351. m_lMID == e.m_lMID &&
  352. m_szMName == e.m_szMName &&
  353. m_dMLatitude_Of_False_Origin == e.m_dMLatitude_Of_False_Origin &&
  354. m_dMLongitude_Of_False_Origin == e.m_dMLongitude_Of_False_Origin &&
  355. m_dMLatitude_Of_1st_Standard_Parallel == e.m_dMLatitude_Of_1st_Standard_Parallel &&
  356. m_dMLatitude_Of_2nd_Standard_Parallel == e.m_dMLatitude_Of_2nd_Standard_Parallel &&
  357. m_dMEasting_At_False_Origin == e.m_dMEasting_At_False_Origin &&
  358. m_dMNorthing_At_False_Origin == e.m_dMNorthing_At_False_Origin &&
  359. m_dMLatitude_Of_Projection_Centre == e.m_dMLatitude_Of_Projection_Centre &&
  360. m_dMLongitude_Of_Projection_Centre == e.m_dMLongitude_Of_Projection_Centre &&
  361. m_dMScale_Factor_On_Initial_Line == e.m_dMScale_Factor_On_Initial_Line &&
  362. m_dMAzimuth_Of_Initial_Line == e.m_dMAzimuth_Of_Initial_Line &&
  363. m_dMAngle_From_Rectified_To_Skewed_Grid == e.m_dMAngle_From_Rectified_To_Skewed_Grid &&
  364. m_dMEasting_At_Projection_Centre == e.m_dMEasting_At_Projection_Centre &&
  365. m_dMNorthing_At_Projection_Centre == e.m_dMNorthing_At_Projection_Centre &&
  366. m_dMLatitude_Of_Natural_Origin == e.m_dMLatitude_Of_Natural_Origin && 
  367. m_dMLongitude_Of_Natural_Origin == e.m_dMLongitude_Of_Natural_Origin &&
  368. m_dMScale_Factor_At_Natural_Origin == e.m_dMScale_Factor_At_Natural_Origin &&
  369. m_dMFalse_Easting == e.m_dMFalse_Easting &&
  370. m_dMFalse_Northing == e.m_dMFalse_Northing)
  371. return true;
  372. return false;
  373. }
  374. IMPLEMENT_SERIAL(CQGISMapProjectionParams,CObject,1)
  375. void CQGISMapProjectionParams::Serialize(CArchive & ar)
  376. {
  377. if(ar.IsStoring())
  378. {
  379. ar<<m_lMID;
  380. ar<<m_szMName;
  381. ar<<m_dMLatitude_Of_False_Origin;
  382. ar<<m_dMLongitude_Of_False_Origin;
  383. ar<<m_dMLatitude_Of_1st_Standard_Parallel;
  384. ar<<m_dMLatitude_Of_2nd_Standard_Parallel;
  385. ar<<m_dMEasting_At_False_Origin;
  386. ar<<m_dMNorthing_At_False_Origin;
  387. ar<<m_dMLatitude_Of_Projection_Centre;
  388. ar<<m_dMLongitude_Of_Projection_Centre;
  389. ar<<m_dMScale_Factor_On_Initial_Line;
  390. ar<<m_dMAzimuth_Of_Initial_Line;
  391. ar<<m_dMAngle_From_Rectified_To_Skewed_Grid;
  392. ar<<m_dMEasting_At_Projection_Centre;
  393. ar<<m_dMNorthing_At_Projection_Centre;
  394. ar<<m_dMLatitude_Of_Natural_Origin; 
  395. ar<<m_dMLongitude_Of_Natural_Origin;
  396. ar<<m_dMScale_Factor_At_Natural_Origin;
  397. ar<<m_dMFalse_Easting;
  398. ar<<m_dMFalse_Northing;
  399. }
  400. else
  401. {
  402. ar>>m_lMID;
  403. ar>>m_szMName;
  404. ar>>m_dMLatitude_Of_False_Origin;
  405. ar>>m_dMLongitude_Of_False_Origin;
  406. ar>>m_dMLatitude_Of_1st_Standard_Parallel;
  407. ar>>m_dMLatitude_Of_2nd_Standard_Parallel;
  408. ar>>m_dMEasting_At_False_Origin;
  409. ar>>m_dMNorthing_At_False_Origin;
  410. ar>>m_dMLatitude_Of_Projection_Centre;
  411. ar>>m_dMLongitude_Of_Projection_Centre;
  412. ar>>m_dMScale_Factor_On_Initial_Line;
  413. ar>>m_dMAzimuth_Of_Initial_Line;
  414. ar>>m_dMAngle_From_Rectified_To_Skewed_Grid;
  415. ar>>m_dMEasting_At_Projection_Centre;
  416. ar>>m_dMNorthing_At_Projection_Centre;
  417. ar>>m_dMLatitude_Of_Natural_Origin; 
  418. ar>>m_dMLongitude_Of_Natural_Origin;
  419. ar>>m_dMScale_Factor_At_Natural_Origin;
  420. ar>>m_dMFalse_Easting;
  421. ar>>m_dMFalse_Northing;
  422. }
  423. }
  424. long CQGISMapProjectionParams::GetMapProjectionType()
  425. {
  426. return m_lMID;
  427. }
  428. void CQGISMapProjectionParams::SetMapProjectionType(long nType)
  429. {
  430. if(nType>=MPT_MAX || nType<MPT_UNKNOWN)nType = MPT_UNKNOWN;
  431. m_lMID = nType;
  432. }
  433. bool CQGISMapProjectionParams::SetLatitudeOf1stStandardParallel(double B1)
  434. {
  435. if(B1<-PI/2.0 || B1>PI/2)return false;
  436. m_dMLatitude_Of_1st_Standard_Parallel = B1;
  437. return true;
  438. }
  439. bool CQGISMapProjectionParams::SetLatitudeOf2ndStandardParallel(double B2)
  440. {
  441. if(B2<-PI/2.0 || B2>PI/2)return false;
  442. m_dMLatitude_Of_2nd_Standard_Parallel = B2;
  443. return true;
  444. }
  445. bool CQGISMapProjectionParams::SetLongitudeOfFalseOrigin(double L0)//中央经度
  446. {
  447. if(L0<-PI || L0>PI)return false;
  448. m_dMLongitude_Of_False_Origin = L0;
  449. return true;
  450. }
  451. bool CQGISMapProjectionParams::SetLatitudeOfFalseOrigin(double B0)//原点纬度
  452. {
  453. if(B0<-PI/2.0 || B0>PI/2)return false;
  454. m_dMLatitude_Of_False_Origin = B0;
  455. return true;
  456. }
  457. bool CQGISMapProjectionParams::SetEastingAtFalseOrigin(double dEF)//东伪偏移
  458. {
  459. m_dMEasting_At_False_Origin = dEF;
  460. return true;
  461. }
  462. bool CQGISMapProjectionParams::SetNorthingAtFalseOrigin(double dNF)//北纬偏移
  463. {
  464. m_dMNorthing_At_False_Origin = dNF;
  465. return true;
  466. }
  467. double CQGISMapProjectionParams::GetLatitudeOf1stStandardParallel()
  468. {
  469. return m_dMLatitude_Of_1st_Standard_Parallel;
  470. }
  471. double CQGISMapProjectionParams::GetLatitudeOf2ndStandardParallel()
  472. {
  473. return m_dMLatitude_Of_2nd_Standard_Parallel;
  474. }
  475. double CQGISMapProjectionParams::GetLongitudeOfFalseOrigin()//中央经度
  476. {
  477. return m_dMLongitude_Of_False_Origin;
  478. }
  479. double CQGISMapProjectionParams::GetLatitudeOfFalseOrigin()//原点纬度
  480. {
  481. return m_dMLatitude_Of_False_Origin;
  482. }
  483. double CQGISMapProjectionParams::GetEastingAtFalseOrigin()//东伪偏移
  484. {
  485. return m_dMEasting_At_False_Origin;
  486. }
  487. double CQGISMapProjectionParams::GetNorthingAtFalseOrigin()//北纬偏移
  488. {
  489. return m_dMNorthing_At_False_Origin;
  490. }
  491. //////////////////////////////////////////////////////////////////////////
  492. CQGISDatumPlaneParams::CQGISDatumPlaneParams()
  493. {
  494. m_szName = "1985国家高程基准";//基准面名称
  495. m_lEllipsoid = ET_KLSFSJ;//Ellipsoid为基准面采用的椭球体的ID号
  496. //ShiftX, ShiftY, ShiftZ为平移参数
  497. m_dShiftX = 0; 
  498. m_dShiftY = 0;
  499. m_dShiftZ = 0; 
  500. //RotateX, RotateY, RotateZ为旋转参数;
  501. m_dRotateX = 1; 
  502. m_dRotateY = 1; 
  503. m_dRotateZ = 1; 
  504. //ScaleAdjust为比例校正因子,以百万分之一计
  505. m_dScaleAdjust = 1; 
  506. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  507. m_dPrimeMeridian = 0;//弧度
  508. }
  509. CQGISDatumPlaneParams::~CQGISDatumPlaneParams()
  510. {
  511. }
  512. CQGISDatumPlaneParams::CQGISDatumPlaneParams(CQGISDatumPlaneParams & e)
  513. {
  514. m_szName = e.m_szName;//基准面名称
  515. m_lEllipsoid = e.m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
  516. //ShiftX, ShiftY, ShiftZ为平移参数
  517. m_dShiftX = e.m_dShiftX; 
  518. m_dShiftY = e.m_dShiftY;
  519. m_dShiftZ = e.m_dShiftZ; 
  520. //RotateX, RotateY, RotateZ为旋转参数;
  521. m_dRotateX = e.m_dRotateX; 
  522. m_dRotateY = e.m_dRotateY; 
  523. m_dRotateZ = e.m_dRotateZ; 
  524. //ScaleAdjust为比例校正因子,以百万分之一计
  525. m_dScaleAdjust = e.m_dScaleAdjust; 
  526. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  527. m_dPrimeMeridian = e.m_dPrimeMeridian;//弧度
  528. }
  529. CQGISDatumPlaneParams CQGISDatumPlaneParams::operator=(CQGISDatumPlaneParams & e)
  530. {
  531. m_szName = e.m_szName;//基准面名称
  532. m_lEllipsoid = e.m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
  533. //ShiftX, ShiftY, ShiftZ为平移参数
  534. m_dShiftX = e.m_dShiftX; 
  535. m_dShiftY = e.m_dShiftY;
  536. m_dShiftZ = e.m_dShiftZ; 
  537. //RotateX, RotateY, RotateZ为旋转参数;
  538. m_dRotateX = e.m_dRotateX; 
  539. m_dRotateY = e.m_dRotateY; 
  540. m_dRotateZ = e.m_dRotateZ; 
  541. //ScaleAdjust为比例校正因子,以百万分之一计
  542. m_dScaleAdjust = e.m_dScaleAdjust; 
  543. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  544. m_dPrimeMeridian = e.m_dPrimeMeridian;//弧度
  545. return *this;
  546. }
  547. bool CQGISDatumPlaneParams::operator==(CQGISDatumPlaneParams & e)
  548. {
  549. if(
  550. m_szName == e.m_szName &&
  551. m_lEllipsoid == e.m_lEllipsoid &&
  552. m_dShiftX == e.m_dShiftX && 
  553. m_dShiftY == e.m_dShiftY &&
  554. m_dShiftZ == e.m_dShiftZ && 
  555. m_dRotateX == e.m_dRotateX && 
  556. m_dRotateY == e.m_dRotateY && 
  557. m_dRotateZ == e.m_dRotateZ && 
  558. m_dScaleAdjust == e.m_dScaleAdjust && 
  559. m_dPrimeMeridian == e.m_dPrimeMeridian
  560. )
  561. return true;
  562. return false;
  563. }
  564. IMPLEMENT_SERIAL(CQGISDatumPlaneParams,CObject,1)
  565. void CQGISDatumPlaneParams::Serialize(CArchive & ar)
  566. {
  567. if(ar.IsStoring())
  568. {
  569. ar<<     m_szName;//基准面名称
  570. ar<<        m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
  571. //ShiftX, ShiftY, ShiftZ为平移参数
  572. ar<<     m_dShiftX; 
  573. ar<<     m_dShiftY;
  574. ar<<     m_dShiftZ; 
  575. //RotateX, RotateY, RotateZ为旋转参数;
  576. ar<<     m_dRotateX; 
  577. ar<<     m_dRotateY; 
  578. ar<<     m_dRotateZ; 
  579. //ScaleAdjust为比例校正因子,以百万分之一计
  580. ar<<     m_dScaleAdjust; 
  581. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  582. ar<<  m_dPrimeMeridian;//弧度
  583. }
  584. else
  585. {
  586. ar>>     m_szName;//基准面名称
  587. ar>>        m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
  588. //ShiftX, ShiftY, ShiftZ为平移参数
  589. ar>>     m_dShiftX; 
  590. ar>>     m_dShiftY;
  591. ar>>     m_dShiftZ; 
  592. //RotateX, RotateY, RotateZ为旋转参数;
  593. ar>>     m_dRotateX; 
  594. ar>>     m_dRotateY; 
  595. ar>>     m_dRotateZ; 
  596. //ScaleAdjust为比例校正因子,以百万分之一计
  597. ar>>     m_dScaleAdjust; 
  598. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  599. ar>>  m_dPrimeMeridian;//弧度
  600. }
  601. }
  602. //////////////////////////////////////////////////////////////////////////
  603. ///////////////////////////////////////////////////////////
  604. //坐标系统
  605. CQGISGeoCoordSysParams::CQGISGeoCoordSysParams(enumQGISCoordSysType csType)
  606. {
  607. switch(csType)
  608. {
  609. case CST_BEIJING54:
  610. {
  611. m_enumCoordSysType = CST_BEIJING54;
  612. A = 6378245.0;
  613. Alfa = 1.0/298.3 ;
  614. E2 = 0.00669342162296594 ;
  615. UTM = 1.0 ;
  616. DN =  0.0 ;
  617. X0 =  0.0 ;
  618. Y0 =  0.0 ;
  619. H0 =  0.0;
  620. L0 =  111.0/180*PI;
  621. break;
  622. }
  623. case CST_XIAN80:
  624. {
  625. m_enumCoordSysType = CST_XIAN80;
  626. A=6378140.0;
  627. Alfa = 1.0/298.257;
  628. E2 = 0.006694384999588 ;
  629. UTM = 1.0 ;
  630. DN =  0.0 ;
  631. X0 =  0.0 ;
  632. Y0 =  0.0 ;
  633. H0 =  0.0;
  634. L0 =  111.0/180*PI;
  635. break;
  636. }
  637. case CST_WGS84:
  638. {
  639. m_enumCoordSysType = CST_WGS84;
  640. A = 6378137.0;
  641. Alfa = 1.0/298.257223563 ;
  642. E2 = 0.00669437999014132 ;
  643. UTM = 1.0 ;
  644. DN =  0.0 ;
  645. X0 =  0.0 ;
  646. Y0 =  0.0 ;
  647. H0 =  0.0;
  648. L0 =  111.0/180*PI;
  649. break;
  650. }
  651. default:
  652. {
  653. m_enumCoordSysType = CST_BEIJING54;
  654. A = 6378245.0;
  655. Alfa = 1.0/298.3 ;
  656. E2 = 0.00669342162296594 ;
  657. UTM = 1.0 ;
  658. DN =  0.0 ;
  659. X0 =  0.0 ;
  660. Y0 =  0.0 ;
  661. H0 =  0.0;
  662. L0 =  111.0/180*PI;
  663. break;
  664. }
  665. }
  666. }
  667. CQGISGeoCoordSysParams::~CQGISGeoCoordSysParams(void)
  668. {
  669. }
  670. //设置坐标系统类型: 1,北京54坐标系;  2,西安80坐标系; 3,WGS 84坐标系
  671. void CQGISGeoCoordSysParams::SetCoordSysType(enumQGISCoordSysType csType)
  672. {
  673. switch(csType)
  674. {
  675. case CST_BEIJING54:
  676. {
  677. m_enumCoordSysType = CST_BEIJING54;
  678. A = 6378245.0;
  679. Alfa = 1.0/298.3 ;
  680. E2 = 0.00669342162296594 ;
  681. UTM = 1.0 ;
  682. DN =  0.0 ;
  683. X0 =  0.0 ;
  684. Y0 =  0.0 ;
  685. H0 =  0.0;
  686. L0 =  111.0/180*PI;
  687. break;
  688. }
  689. case CST_XIAN80:
  690. {
  691. m_enumCoordSysType = CST_XIAN80;
  692. A=6378140.0;
  693. Alfa = 1.0/298.257;
  694. E2 = 0.006694384999588 ;
  695. UTM = 1.0 ;
  696. DN =  0.0 ;
  697. X0 =  0.0 ;
  698. Y0 =  0.0 ;
  699. H0 =  0.0;
  700. L0 =  111.0/180*PI;
  701. break;
  702. }
  703. case CST_WGS84:
  704. {
  705. m_enumCoordSysType = CST_WGS84;
  706. A = 6378137.0;
  707. Alfa = 1.0/298.257223563 ;
  708. E2 = 0.00669437999014132 ;
  709. UTM = 1.0 ;
  710. DN =  0.0 ;
  711. X0 =  0.0 ;
  712. Y0 =  0.0 ;
  713. H0 =  0.0;
  714. L0 =  111.0/180*PI;
  715. break;
  716. }
  717. default:
  718. {
  719. m_enumCoordSysType = CST_BEIJING54;
  720. A = 6378245.0;
  721. Alfa = 1.0/298.3 ;
  722. E2 = 0.00669342162296594 ;
  723. UTM = 1.0 ;
  724. DN =  0.0 ;
  725. X0 =  0.0 ;
  726. Y0 =  0.0 ;
  727. H0 =  0.0;
  728. L0 =  111.0/180*PI;
  729. break;
  730. }
  731. }
  732. }
  733. //获取坐标系统类型: 1,北京54坐标系;  2,西安80坐标系; 3,WGS 84坐标系
  734. enumQGISCoordSysType CQGISGeoCoordSysParams::GetCoordSysType()
  735. {
  736. return m_enumCoordSysType;
  737. }
  738. //////////////////////////////////////////////////////////////////////////
  739. //////////////////////////////////////////
  740. ///***************CQGIS****************///
  741. ///函数名称:CQCoordSys
  742. ///返回类型:无
  743. ///入口参数:无
  744. ///出口参数:无
  745. ///思路说明:构造函数
  746. ///***************CQGIS****************///
  747. //////////////////////////////////////////
  748. CQCoordSys::CQCoordSys()
  749. {
  750. m_nMapMode = MM_TEXT; //Windows默认的映射模式
  751.                       //设备坐标与逻辑坐标之间的映射模式 
  752. m_ptViewportOrg = CPoint(0,0); //视口原点放在(0,0)点
  753. m_sizeViewportSize = CSize(100,100); //视口范围
  754. m_ptWndportOrg = CPoint(0,0);
  755. m_sizeWndportSize = CSize(100,100);
  756. //世界坐标系下的START点在逻辑坐标下的值
  757. m_lStartX = 0;
  758. m_lStartY = m_ptWndportOrg.y + m_sizeWndportSize.cy;
  759. //逻辑坐标系统与世界坐标系统的映射模式
  760. m_nWorldMapMode = WMM_NORMAL;
  761. //世界坐标系统的旋转角度,只有当m_nWorldMapMode=WMM_AXIS_ROTATE时候起作用
  762. m_dRotateAngle = 0.0; //表示度数0-360
  763. m_wStartX = 0;
  764. m_wStartY = 0;
  765. //逻辑坐标的X轴上一米相当于m_dLogicalUnitsPtrMeterX逻辑单位
  766. m_dLogicalUnitsPtrMeterX = 96/0.0254;
  767. m_dLogicalUnitsPtrMeterY = m_dLogicalUnitsPtrMeterX;
  768. m_dMapScale = 1; //地图比例尺分母
  769. m_dDispScale = 1; //显示比例1:1
  770. m_nUnitType = 0; //系统单位
  771. }
  772. CQCoordSys::~CQCoordSys()
  773. {
  774. }
  775. CQCoordSys::CQCoordSys(CQCoordSys & CS)
  776. {
  777. m_nMapMode = CS.GetQMapMode();
  778. //设备坐标参数
  779. m_ptViewportOrg = CS.GetViewportOrg();
  780. m_sizeViewportSize = CS.GetViewportSize();
  781. //窗口坐标参数
  782. m_ptWndportOrg = CS.GetWndportOrg();
  783. m_sizeWndportSize = CS.GetWndportSize();
  784. //世界坐标参数
  785. //在世界坐标系统下用于显示图形的起点坐标
  786. CS.GetStartOfWorld(m_wStartX,m_wStartY);
  787. //逻辑坐标系统与世界坐标系统的映射模式
  788. m_nWorldMapMode = (enumQGISWorldMapMode)CS.GetWorldMapMode();
  789. //世界坐标的旋转
  790. m_dRotateAngle = CS.GetRotateAngle();
  791. //世界坐标系下用于显示图形的起点坐标在逻辑坐标下的值
  792. CS.GetStartOfWnd(m_lStartX,m_lStartY);
  793. CS.GetLogicalUnitsPtrMeter(m_dLogicalUnitsPtrMeterX,m_dLogicalUnitsPtrMeterY);
  794. m_dMapScale = CS.GetMapScale();
  795. m_dDispScale = CS.GetDisplayScale();
  796. }
  797. CQCoordSys CQCoordSys::operator =(CQCoordSys & CS)
  798. {
  799. m_nMapMode = CS.GetQMapMode();
  800. //设备坐标参数
  801. m_ptViewportOrg = CS.GetViewportOrg();
  802. m_sizeViewportSize = CS.GetViewportSize();
  803. //窗口坐标参数
  804. m_ptWndportOrg = CS.GetWndportOrg();
  805. m_sizeWndportSize = CS.GetWndportSize();
  806. //世界坐标参数
  807. //在世界坐标系统下用于显示图形的起点坐标
  808. CS.GetStartOfWorld(m_wStartX,m_wStartY);
  809. //逻辑坐标系统与世界坐标系统的映射模式
  810. m_nWorldMapMode = (enumQGISWorldMapMode)CS.GetWorldMapMode();
  811. //世界坐标的旋转
  812. m_dRotateAngle = CS.GetRotateAngle();
  813. //世界坐标系下用于显示图形的起点坐标在逻辑坐标下的值
  814. CS.GetStartOfWnd(m_lStartX,m_lStartY);
  815. CS.GetLogicalUnitsPtrMeter(m_dLogicalUnitsPtrMeterX,m_dLogicalUnitsPtrMeterY);
  816. m_dMapScale = CS.GetMapScale();
  817. m_dDispScale = CS.GetDisplayScale();
  818. return *this;
  819. }
  820. bool CQCoordSys::operator==(CQCoordSys & CS)
  821. {
  822. if(m_nMapMode==CS.GetQMapMode() && 
  823. m_ptViewportOrg==CS.GetViewportOrg()&&
  824. m_sizeViewportSize==CS.GetViewportSize()&&
  825. m_ptWndportOrg==CS.GetWndportOrg()&&
  826. m_sizeWndportSize==CS.GetWndportSize()&&
  827. m_lStartX==CS.GetStartXOfWnd()&&
  828. m_lStartY==CS.GetStartYOfWnd()&&
  829. m_nWorldMapMode==(enumQGISWorldMapMode)CS.GetWorldMapMode()&&
  830. m_dRotateAngle==CS.GetRotateAngle()&&
  831. m_wStartX==CS.GetStartXOfWorld()&&
  832. m_wStartY==CS.GetStartYOfWorld()&&
  833. m_EllipsiodParams==CS.GetEllipsiodParams()&&
  834. m_MapProjectionParams==CS.GetMapProjectionParams()&&
  835. m_DatumPaneParams==CS.GetDatumPlaneParams()&&
  836. m_nUnitType==CS.GetUnitType()&&  //系统单位:0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  837. m_dLogicalUnitsPtrMeterX==CS.GetLogicalUintsPtrMeterX()&&//逻辑坐标的X轴上一米相当于m_dLogicalUnitsPtrMeterX逻辑单位
  838. m_dLogicalUnitsPtrMeterY==CS.GetLogicalUintsPtrMeterY()&&//逻辑坐标的Y轴上一米相当于m_dLogicalUnitsPtrMeterY逻辑单位
  839. m_dMapScale==CS.GetMapScale()&&//地图比例尺分母
  840. m_dDispScale==CS.GetDisplayScale())//地图显示比例,既将图纸放大m_dDispScale倍
  841. return true;
  842. else
  843. return false;
  844. }
  845. double CQCoordSys::GetLogicalUintsPtrMeterX()
  846. {
  847. return m_dLogicalUnitsPtrMeterX;
  848. }
  849. double CQCoordSys::GetLogicalUintsPtrMeterY()
  850. {
  851. return m_dLogicalUnitsPtrMeterY;
  852. }
  853. void CQCoordSys::Copy(CQCoordSys & CS)
  854. {
  855. m_nMapMode = CS.GetQMapMode();
  856. //设备坐标参数
  857. m_ptViewportOrg = CS.GetViewportOrg();
  858. m_sizeViewportSize = CS.GetViewportSize();
  859. //窗口坐标参数
  860. m_ptWndportOrg = CS.GetWndportOrg();
  861. m_sizeWndportSize = CS.GetWndportSize();
  862. //世界坐标参数
  863. //在世界坐标系统下用于显示图形的起点坐标
  864. CS.GetStartOfWorld(m_wStartX,m_wStartY);
  865. //逻辑坐标系统与世界坐标系统的映射模式
  866. m_nWorldMapMode = (enumQGISWorldMapMode)CS.GetWorldMapMode();
  867. //世界坐标的旋转
  868. m_dRotateAngle = CS.GetRotateAngle();
  869. //世界坐标系下用于显示图形的起点坐标在逻辑坐标下的值
  870. CS.GetStartOfWnd(m_lStartX,m_lStartY);
  871. CS.GetLogicalUnitsPtrMeter(m_dLogicalUnitsPtrMeterX,m_dLogicalUnitsPtrMeterY);
  872. m_dMapScale = CS.GetMapScale();
  873. m_dDispScale = CS.GetDisplayScale();
  874. }
  875. inline long CQCoordSys::GetStartXOfWnd()
  876. {
  877. return m_lStartX;
  878. }
  879. inline long CQCoordSys::GetStartYOfWnd()
  880. {
  881. return m_lStartY;
  882. }
  883. inline double CQCoordSys::GetStartXOfWorld()
  884. {
  885. return m_wStartX;
  886. }
  887. inline double CQCoordSys::GetStartYOfWorld()
  888. {
  889. return m_wStartY;
  890. }
  891. inline void CQCoordSys::SetQMapMode(int nMapMode)
  892. {
  893. m_nMapMode = nMapMode;
  894. }
  895. inline int CQCoordSys::GetQMapMode() const
  896. {
  897. return m_nMapMode;
  898. }
  899. void CQCoordSys::SetViewportOrg(long x,long y)
  900. {
  901. m_ptViewportOrg = CPoint(x,y);
  902. }
  903. void CQCoordSys::SetViewportOrg(CPoint & pt)
  904. {
  905. m_ptViewportOrg = pt;
  906. }
  907. inline CPoint CQCoordSys::GetViewportOrg()
  908. {
  909. return m_ptViewportOrg;
  910. }
  911. void CQCoordSys::SetViewport(long x,long y,long cx,long cy)
  912. {
  913. m_ptViewportOrg = CPoint(x,y);
  914. m_sizeViewportSize = CSize(cx,cy);
  915. }
  916. inline void CQCoordSys::GetViewport(long &x,long &y,long &cx,long &cy)
  917. {
  918. x = m_ptViewportOrg.x;
  919. y = m_ptViewportOrg.y;
  920. cx = m_sizeViewportSize.cx;
  921. cy = m_sizeViewportSize.cy;
  922. }
  923. void CQCoordSys::SetViewportSize(long cx,long cy)
  924. {
  925. m_sizeViewportSize = CSize(cx,cy);
  926. }
  927. void CQCoordSys::SetViewportSize(CSize size)
  928. {
  929. m_sizeViewportSize = size;
  930. }
  931. inline CSize CQCoordSys::GetViewportSize()
  932. {
  933. return m_sizeViewportSize;
  934. inline void CQCoordSys::SetWndportOrg(long x,long y)
  935. {
  936. m_ptWndportOrg = CPoint(x,y);
  937. }
  938. inline void CQCoordSys::SetWndportOrg(CPoint & pt)
  939. {
  940. m_ptWndportOrg = pt;
  941. }
  942. inline CPoint CQCoordSys::GetWndportOrg()
  943. {
  944. return m_ptWndportOrg;
  945. }
  946. void CQCoordSys::SetWndport(long x,long y,long cx,long cy)
  947. {
  948. m_ptWndportOrg = CPoint(x,y);
  949. m_sizeWndportSize = CSize(cx,cy);
  950. }
  951. void CQCoordSys::GetWndport(long &x,long &y,long &cx,long &cy)
  952. {
  953. x = m_ptWndportOrg.x;
  954. y = m_ptWndportOrg.y;
  955. cx = m_sizeWndportSize.cx;
  956. cy = m_sizeWndportSize.cy;
  957. }
  958. void CQCoordSys::SetWndportSize(long cx,long cy)
  959. {
  960. m_sizeWndportSize = CSize(cx,cy);
  961. }
  962. void CQCoordSys::SetWndportSize(CSize size)
  963. {
  964. m_sizeWndportSize = size;
  965. }
  966. inline CSize CQCoordSys::GetWndportSize()
  967. {
  968. return m_sizeWndportSize;
  969. }
  970. inline void CQCoordSys::SetStartOfWnd(long x,long y)
  971. {
  972. m_lStartX = x;
  973. m_lStartY = y;
  974. }
  975. inline void CQCoordSys::GetStartOfWnd(long &x,long &y)
  976. {
  977. x = m_lStartX;
  978. y = m_lStartY;
  979. }
  980. inline UINT CQCoordSys::GetWorldMapMode() const
  981. {
  982. return m_nWorldMapMode;
  983. }
  984. inline void CQCoordSys::SetWorldMapMode(UINT wWorldMapMode /* = WMM_NORMAL */)
  985. {
  986. m_nWorldMapMode = (enumQGISWorldMapMode)wWorldMapMode;
  987. }
  988. inline double CQCoordSys::CalWorldScale()
  989. {
  990. double scale = m_dMapScale/(m_dLogicalUnitsPtrMeterX*m_dDispScale);
  991. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  992. switch(m_nUnitType) //系统单位
  993. {
  994. case 0:
  995. break;
  996. case 1:
  997. scale/=100;
  998. break;
  999. case 2:
  1000. scale/=1000;
  1001.     break;
  1002. case 3:
  1003. scale*=0.0254;
  1004.     break;
  1005. case 4:
  1006. scale*=1000;
  1007. break;
  1008. default:
  1009.     break;
  1010. }
  1011. return scale;
  1012. }
  1013. inline double CQCoordSys::GetWorldScale() const
  1014. {
  1015. double scale = m_dMapScale/(m_dLogicalUnitsPtrMeterX*m_dDispScale);
  1016. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1017. switch(m_nUnitType) //系统单位
  1018. {
  1019. case 0:
  1020. break;
  1021. case 1:
  1022. scale/=100;
  1023. break;
  1024. case 2:
  1025. scale/=1000;
  1026.     break;
  1027. case 3:
  1028. scale*=0.0254;
  1029.     break;
  1030. case 4:
  1031. scale*=1000;
  1032. break;
  1033. default:
  1034.     break;
  1035. }
  1036. return scale;
  1037. }
  1038. inline double CQCoordSys::GetDisplayScale() const
  1039. {
  1040. return m_dDispScale;
  1041. }
  1042. inline void CQCoordSys::SetDisplayScale(double DS)
  1043. {
  1044. m_dDispScale = DS;
  1045. }
  1046. inline void CQCoordSys::SetWorldScale(double fDisplayScale,double fMapScale)
  1047. {
  1048. m_dDispScale = fDisplayScale;
  1049. m_dMapScale = fMapScale;
  1050. }
  1051. inline void CQCoordSys::SetWorldScale(double worldScale)
  1052. {
  1053. m_dDispScale = CalDispScale(worldScale);
  1054. }
  1055. inline double CQCoordSys::CalDispScale(double worldScale)
  1056. {
  1057. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1058. switch(m_nUnitType)
  1059. {
  1060. case 0:
  1061. break;
  1062. case 1:
  1063. worldScale*=100;
  1064. break;
  1065. case 2:
  1066. worldScale*=1000;
  1067.     break;
  1068. case 3:
  1069. worldScale/=0.0254;
  1070.     break;
  1071. case 4:
  1072. worldScale/=1000;
  1073. break;
  1074. default:
  1075.     break;
  1076. }
  1077. return m_dMapScale/(worldScale*m_dLogicalUnitsPtrMeterX);
  1078. }
  1079. inline double CQCoordSys::GetMapScale() const
  1080. {
  1081. return m_dMapScale;
  1082. }
  1083. void CQCoordSys::SetMapScale(double fMapScale)
  1084. {
  1085. m_dMapScale = fMapScale;
  1086. }
  1087. inline void CQCoordSys::SetStartOfWorld(double x,double y)
  1088. {
  1089. m_wStartX = x;
  1090. m_wStartY = y;
  1091. }
  1092. inline void CQCoordSys::GetStartOfWorld(double &x,double &y)
  1093. {
  1094. x = m_wStartX;
  1095. y = m_wStartY;
  1096. }
  1097. inline void CQCoordSys::SetRotateAngle(double fRA)
  1098. {
  1099. m_dRotateAngle = fRA;
  1100. }
  1101. inline double CQCoordSys::GetRotateAngle()
  1102. {
  1103. return m_dRotateAngle;
  1104. }
  1105. CString CQCoordSys::GetUnitNameCHS()
  1106. {
  1107. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1108. CString szUint;
  1109. switch(m_nUnitType)
  1110. {
  1111. case 0:
  1112. szUint = "米";
  1113. break;
  1114. case 1:
  1115. szUint = "厘米";
  1116. break;
  1117. case 2:
  1118. szUint = "毫米";
  1119.     break;
  1120. case 3:
  1121. szUint = "英尺";
  1122.     break;
  1123. case 4:
  1124. szUint = "公里";
  1125. break;
  1126. case 5:
  1127. szUint = "度分秒";
  1128. break;
  1129. case 6:
  1130. szUint = "度";
  1131. break;
  1132. default:
  1133.     break;
  1134. }
  1135. return szUint;
  1136. }
  1137. void CQCoordSys::SetUnitType(int it)
  1138. {
  1139. m_nUnitType = it;
  1140. }
  1141. inline int CQCoordSys::GetUnitType() const
  1142. {
  1143. return m_nUnitType;
  1144. }
  1145. CQGISEllipsiodParams & CQCoordSys::GetEllipsiodParams()
  1146. {
  1147. return m_EllipsiodParams;
  1148. }
  1149. CQGISMapProjectionParams & CQCoordSys::GetMapProjectionParams()
  1150. {
  1151. return m_MapProjectionParams;
  1152. }
  1153. CQGISDatumPlaneParams & CQCoordSys::GetDatumPlaneParams()
  1154. {
  1155. return m_DatumPaneParams;
  1156. }
  1157. void CQCoordSys::SetLogicalUnitsPtrMeter(double x,double y)
  1158. {
  1159. m_dLogicalUnitsPtrMeterX = x;
  1160. m_dLogicalUnitsPtrMeterY = y;
  1161. }
  1162. void CQCoordSys::GetLogicalUnitsPtrMeter(double &x,double &y)
  1163. {
  1164. x = m_dLogicalUnitsPtrMeterX;
  1165. y = m_dLogicalUnitsPtrMeterY;
  1166. }
  1167. IMPLEMENT_SERIAL(CQCoordSys,CObject,1)
  1168. void CQCoordSys::Serialize(CArchive& ar)
  1169. {
  1170. if(ar.IsStoring())
  1171. {
  1172. ar<<m_nMapMode;
  1173. ar<<m_ptViewportOrg;
  1174. ar<<m_sizeViewportSize;
  1175. ar<<m_ptWndportOrg;
  1176. ar<<m_sizeWndportSize;
  1177. ar<<m_lStartX;
  1178. ar<<m_lStartY;
  1179. ar<<m_wStartX;
  1180. ar<<m_wStartY;
  1181. ar<<(int)m_nWorldMapMode;
  1182. ar<<m_dRotateAngle;
  1183. ar<<m_nUnitType;
  1184. ar<<m_dLogicalUnitsPtrMeterX;
  1185. ar<<m_dLogicalUnitsPtrMeterY;
  1186. ar<<m_dMapScale;
  1187. ar<<m_dDispScale;
  1188. }
  1189. else
  1190. {
  1191. ar>>m_nMapMode;
  1192. ar>>m_ptViewportOrg;
  1193. ar>>m_sizeViewportSize;
  1194. ar>>m_ptWndportOrg;
  1195. ar>>m_sizeWndportSize;
  1196. ar>>m_lStartX;
  1197. ar>>m_lStartY;
  1198. ar>>m_wStartX;
  1199. ar>>m_wStartY;
  1200. int nWorldMapMode = 0;
  1201. ar>>nWorldMapMode;
  1202. m_nWorldMapMode = (enumQGISWorldMapMode)nWorldMapMode;
  1203. ar>>m_dRotateAngle;
  1204. ar>>m_nUnitType;
  1205. ar>>m_dLogicalUnitsPtrMeterX;
  1206. ar>>m_dLogicalUnitsPtrMeterY;
  1207. ar>>m_dMapScale;
  1208. ar>>m_dDispScale;
  1209. }
  1210. m_EllipsiodParams.Serialize(ar);
  1211. m_DatumPaneParams.Serialize(ar);
  1212. m_MapProjectionParams.Serialize(ar);
  1213. }
  1214. void CQCoordSys::LPtoWP(long x,long y,double * wx,double * wy)
  1215. {
  1216. //转换公式
  1217. //WMM_NORMAL MM_TEXT
  1218. //(wx - m_wStartX)/GetWorldScale() = x - m_lStartX
  1219. //(wy - m_wStartY)/GetWorldScale() = m_lStartY - y
  1220. //wx = (x - m_lStartX)*GetWorldScale()+m_wStartX
  1221. //wy = (m_lStartY - y)*GetWorldScale()+m_wStartY
  1222. //WMM_X_AXIS_REVERSE
  1223. //(m_wStartX - wx)/GetWorldScale() = x - m_lStartX
  1224. //(wy - m_wStartY)/GetWorldScale() = m_lStartY - y
  1225. if(m_nMapMode == MM_TEXT) //windows默认的逻辑坐标与设备坐标的映射模式
  1226. {
  1227. switch(m_nWorldMapMode)
  1228. {
  1229. case WMM_NORMAL: //正常
  1230. {
  1231. *wx = (x-m_lStartX)*GetWorldScale()+m_wStartX;
  1232. *wy = (m_lStartY-y)*GetWorldScale()+m_wStartY;
  1233. break;
  1234. }
  1235. case WMM_X_AXIS_REVERSE://X轴倒置
  1236. {
  1237. *wx = m_wStartX - (x-m_lStartX)*GetWorldScale();
  1238. *wy = (m_lStartY-y)*GetWorldScale()+m_wStartY;
  1239. break;
  1240. }
  1241. case WMM_Y_AXIS_REVERSE://Y轴倒置
  1242. {
  1243. *wx = (x-m_lStartX)*GetWorldScale()+m_wStartX;
  1244. *wy = m_wStartY - (m_lStartY-y)*GetWorldScale();
  1245. break;
  1246. }
  1247. case WMM_XY_AXIS_REVERSE://XY轴军倒置
  1248. {
  1249. *wx = m_wStartX - (x-m_lStartX)*GetWorldScale();
  1250. *wy = m_wStartY - (m_lStartY-y)*GetWorldScale();
  1251. break;
  1252. }
  1253. case WMM_AXIS_ROTATE:
  1254. {
  1255. AfxMessageBox("不支持!");
  1256. break;
  1257. }
  1258. default:
  1259. {
  1260. *wx = (x-m_lStartX)*GetWorldScale()+m_wStartX;
  1261. *wy = (m_lStartY-y)*GetWorldScale()+m_wStartY;
  1262. break;
  1263. }
  1264. }
  1265. }
  1266. else
  1267. //转换公式
  1268. //WMM_NORMAL 非 MM_TEXT
  1269. //(wx - m_wStartX)/GetWorldScale() = x - m_lStartX
  1270. //(wy - m_wStartY)/GetWorldScale() = y - m_lStartY
  1271. //wx = (x - m_lStartX)*GetWorldScale()+m_wStartX
  1272. //wy = (y - m_lStartY)*GetWorldScale()+m_wStartY
  1273. //WMM_X_AXIS_REVERSE
  1274. //(m_wStartX - wx)/GetWorldScale() = x - m_lStartX
  1275. //(wy - m_wStartY)/GetWorldScale() = y - m_lStartY
  1276. {
  1277. switch(m_nWorldMapMode)
  1278. {
  1279. case WMM_NORMAL:
  1280. {
  1281. *wx = (x - m_lStartX)*GetWorldScale()+m_wStartX;
  1282. *wy = (y - m_lStartY)*GetWorldScale()+m_wStartY;
  1283. break;
  1284. }
  1285. case WMM_X_AXIS_REVERSE: //X轴倒置
  1286. {
  1287. *wx = m_wStartX - (x-m_lStartX)*GetWorldScale();
  1288. *wy = m_wStartY + (y-m_lStartY)*GetWorldScale();
  1289. break;
  1290. }
  1291. case WMM_Y_AXIS_REVERSE://Y轴倒置
  1292. {
  1293. *wx = (x - m_lStartX)*GetWorldScale()+m_wStartX;
  1294. *wy = m_wStartY - (y-m_lStartY)*GetWorldScale();
  1295. break;
  1296. }
  1297. case WMM_XY_AXIS_REVERSE://XY轴倒置
  1298. {
  1299. *wx = m_wStartX - (x-m_lStartX)*GetWorldScale();
  1300. *wy = m_wStartY - (y-m_lStartY)*GetWorldScale();
  1301. break;
  1302. }
  1303. case WMM_AXIS_ROTATE:
  1304. {
  1305. AfxMessageBox("不支持!");
  1306. break;
  1307. }
  1308. default:
  1309. {
  1310. *wx = (x - m_lStartX)*GetWorldScale()+m_wStartX;
  1311. *wy = (y - m_lStartY)*GetWorldScale()+m_wStartY;
  1312. break;
  1313. }
  1314. }
  1315. }
  1316. }
  1317. void CQCoordSys::LPtoWP(CPoint pt,CQPoint * qpt)
  1318. {
  1319. double dx,dy;
  1320. LPtoWP(pt.x,pt.y,&dx,&dy);
  1321. qpt->SetPoint(dx,dy);
  1322. }
  1323. void CQCoordSys::LPtoWP(CRect rc,CBoundaryRect * pRect)
  1324. {
  1325. double x1,y1,x2,y2;
  1326. LPtoWP(rc.left,rc.bottom,&x1,&y1);
  1327. LPtoWP(rc.right,rc.top,&x2,&y2);
  1328. pRect->SetLeftBottomX(min(x1,x2));
  1329. pRect->SetLeftBottomY(min(y1,y2));
  1330. pRect->SetRightTopX(max(x1,x2));
  1331. pRect->SetRightTopY(max(y1,y2));
  1332. }
  1333. void CQCoordSys::WPtoLP(double wx,double wy,long *lx,long *ly)
  1334. {
  1335. //假如是Windows的默认映射模式
  1336. if(m_nMapMode == MM_TEXT)
  1337. {
  1338. //变换公式 
  1339. //(wx-m_wStartX)/GetWorldScale() = x-m_lStartX
  1340. //(wy-m_wStartY)/GetWorldScale() = m_lStartY-y
  1341. switch(m_nWorldMapMode)
  1342. {
  1343. case WMM_NORMAL:
  1344. {
  1345. *lx = (long)(m_lStartX+(wx-m_wStartX)/GetWorldScale());
  1346. *ly = (long)(m_lStartY-(wy-m_wStartY)/GetWorldScale());
  1347. break;
  1348. }
  1349. case WMM_X_AXIS_REVERSE: //X轴反转
  1350. {
  1351. *lx = (long)(m_lStartX+(m_wStartX-wx)/GetWorldScale());
  1352. *ly = (long)(m_lStartY-(wy-m_wStartY)/GetWorldScale());
  1353. break;
  1354. }
  1355. case WMM_Y_AXIS_REVERSE://Y轴反转
  1356. {
  1357. *lx = (long)(m_lStartX+(wx-m_lStartX)/GetWorldScale());
  1358. *ly = (long)(m_lStartY-(m_lStartY-wy)/GetWorldScale());
  1359. break;
  1360. }
  1361. case WMM_XY_AXIS_REVERSE://XY轴反转
  1362. {
  1363. *lx = (long)(m_lStartX+(m_wStartX-wx)/GetWorldScale());
  1364. *ly = (long)(m_lStartY-(m_lStartY-wy)/GetWorldScale());
  1365. break;
  1366. }
  1367. case WMM_AXIS_ROTATE:
  1368. {
  1369. AfxMessageBox("不支持!");
  1370. break;
  1371. }
  1372. default:
  1373. {
  1374. *lx = (long)(m_lStartX+(wx-m_wStartX)/GetWorldScale());
  1375. *ly = (long)(m_lStartY-(wy-m_wStartY)/GetWorldScale());
  1376. break;
  1377. }
  1378. }
  1379. }
  1380. else //非MM_TEXT
  1381. {
  1382. //(wx-m_wStartX)/GetWorldScale() = x-m_lStartX
  1383. //(wy-m_wStartY)/GetWorldScale() = y-m_lStartY
  1384. switch(m_nWorldMapMode)
  1385. {
  1386. case WMM_NORMAL:
  1387. {
  1388. *lx = (long)(m_lStartX+(wx-m_wStartX)/GetWorldScale());
  1389. *ly = (long)(m_lStartY+(wy-m_wStartY)/GetWorldScale());
  1390. break;
  1391. }
  1392. case WMM_X_AXIS_REVERSE:
  1393. {
  1394. *lx = (long)(m_lStartX+(m_wStartX-wx)/GetWorldScale());
  1395. *ly = (long)(m_lStartY+(wy-m_wStartY)/GetWorldScale());
  1396. break;
  1397. }
  1398. case WMM_Y_AXIS_REVERSE:
  1399. {
  1400. *lx = (long)(m_lStartX+(wx-m_wStartX)/GetWorldScale());
  1401. *ly = (long)(m_lStartY+(m_wStartY-wy)/GetWorldScale());
  1402. break;
  1403. }
  1404. case WMM_XY_AXIS_REVERSE:
  1405. {
  1406. *lx = (long)(m_lStartX+(m_wStartX-wx)/GetWorldScale());
  1407. *ly = (long)(m_lStartY+(m_wStartY-wy)/GetWorldScale());
  1408. break;
  1409. }
  1410. case WMM_AXIS_ROTATE:
  1411. {
  1412. AfxMessageBox("不支持!");
  1413. break;
  1414. }
  1415. default:
  1416. {
  1417. *lx = (long)(m_lStartX+(wx-m_wStartX)/GetWorldScale());
  1418. *ly = (long)(m_lStartY+(wy-m_wStartY)/GetWorldScale());
  1419. break;
  1420. }
  1421. }
  1422. }
  1423. }
  1424. void CQCoordSys::WPtoLP(CQPoint qpt,CPoint * pt)
  1425. {
  1426. double wx = qpt.GetX();
  1427. double wy = qpt.GetY();
  1428. WPtoLP(wx,wy,&pt->x,&pt->y);
  1429. }
  1430. void CQCoordSys::WPtoLP(CBoundaryRect BRect,CRect * pRc)
  1431. {
  1432. double minx,miny,maxx,maxy;
  1433. CPoint pt1,pt2;
  1434. minx = BRect.GetLeftBottomX();
  1435. miny = BRect.GetLeftBottomY();
  1436. maxx = BRect.GetRightTopX();
  1437. maxy = BRect.GetRightTopY();
  1438. WPtoLP(minx,miny,&pt1.x,&pt1.y);
  1439. WPtoLP(maxx,maxy,&pt2.x,&pt2.y);
  1440. pRc->left = min(pt1.x,pt2.x);
  1441. pRc->top  = min(pt1.y,pt2.y);
  1442. pRc->right= max(pt1.x,pt2.x);
  1443. pRc->bottom = max(pt1.y,pt2.y);
  1444. }
  1445. //////////////////////////////////////////
  1446. ///***************CQGIS****************///
  1447. ///函数名称:LLtoWL
  1448. ///返回类型:double
  1449. ///入口参数:long lLen
  1450. ///出口参数:无
  1451. ///思路说明:
  1452. ///***************CQGIS****************///
  1453. //////////////////////////////////////////
  1454. double CQCoordSys::LLtoWL(long lLen)
  1455. {
  1456. return (double)(lLen*GetWorldScale());
  1457. }
  1458. inline long CQCoordSys::WLtoLL(double wLen)
  1459. {
  1460. return long(wLen/GetWorldScale());
  1461. }
  1462. inline double CQCoordSys::LLtoMM(long lLen)
  1463. {
  1464. //25.4代表英尺长度
  1465. if(m_nMapMode==MM_TEXT)
  1466. {
  1467. return double(lLen*25.4/g_QObj.g_nPixelsPerInchX);
  1468. }
  1469. else if(m_nMapMode==MM_HIMETRIC)
  1470. {
  1471. return double(lLen/100.0);
  1472. }
  1473. else if(m_nMapMode==MM_LOMETRIC)
  1474. {
  1475. return double(lLen/10.0);
  1476. }
  1477. else if(m_nMapMode==MM_LOENGLISH)
  1478. {
  1479. return double(lLen/100.0*25.4);
  1480. }
  1481. else if(m_nMapMode==MM_HIENGLISH)
  1482. {
  1483. return double(lLen/1000.0*25.4);
  1484. }
  1485. else if(m_nMapMode==MM_TWIPS)
  1486. {
  1487. return double(lLen/1440.0*25.4);
  1488. }
  1489. else return 0;
  1490. }
  1491. inline long CQCoordSys::MMtoLL(double mLen)
  1492. {
  1493. double s=0;
  1494. if(m_nMapMode==MM_TEXT)
  1495. {
  1496. s=mLen/25.4*g_QObj.g_nPixelsPerInchX;
  1497. }
  1498. else if(m_nMapMode==MM_HIMETRIC)
  1499. {
  1500. s=mLen*100.0;
  1501. }
  1502. else if(m_nMapMode==MM_LOMETRIC)
  1503. {
  1504. s=mLen*10.0;
  1505. }
  1506. else if(m_nMapMode==MM_LOENGLISH)
  1507. {
  1508. s=mLen*100.0/25.4;
  1509. }
  1510. else if(m_nMapMode==MM_HIENGLISH)
  1511. {
  1512. s=mLen*1000.0/25.4;
  1513. }
  1514. else if(m_nMapMode==MM_TWIPS)
  1515. {
  1516. s=mLen*1440.0/25.4;
  1517. }
  1518. else
  1519. {
  1520. s=0;
  1521. }
  1522. return (long)(s*m_dDispScale);
  1523. }
  1524. inline double CQCoordSys::WLtoML(double wLen)
  1525. {
  1526. return  wLen/m_dMapScale;
  1527. }
  1528. inline long CQCoordSys::MLtoLL(double mLen)
  1529. {
  1530. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1531. double s=1;
  1532. switch(m_nUnitType) 
  1533. {
  1534. case 0:
  1535. break;
  1536. case 1:
  1537. s=s/100;
  1538. break;
  1539. case 2:
  1540. s=s/1000;
  1541. break;
  1542. case 3:
  1543. s=s*0.0254;
  1544. break;
  1545. case 4:
  1546. s=s*1000;
  1547. break;
  1548. case 5:
  1549. break;
  1550. case 6:
  1551. break;
  1552. }
  1553. return long(mLen*s*m_dLogicalUnitsPtrMeterX+0.5);
  1554. }
  1555. inline double CQCoordSys::MLtoWL(double mLen)
  1556. {
  1557. return mLen*m_dMapScale;
  1558. }
  1559. inline double CQCoordSys::LLtoML(long lLen)
  1560. {
  1561. double s=1;
  1562. switch(m_nUnitType) 
  1563. {
  1564. case 0:
  1565. break;
  1566. case 1:
  1567. s=s/100;
  1568. break;
  1569. case 2:
  1570. s=s/1000;
  1571. break;
  1572. case 3:
  1573. s=s*0.0254;
  1574. break;
  1575. case 4:
  1576. s=s*1000;
  1577. break;
  1578. case 5:
  1579. break;
  1580. case 6:
  1581. break;
  1582. }
  1583. return lLen/(s*m_dLogicalUnitsPtrMeterX);
  1584. }
  1585. inline double CQCoordSys::MMtoWL(double mm)
  1586. {
  1587. double d = 0;
  1588. if(m_nMapMode==MM_TEXT)
  1589. {
  1590. d =  mm/25.4*g_QObj.g_nPixelsPerInchX;
  1591. }
  1592. else if(m_nMapMode==MM_HIMETRIC)
  1593. {
  1594. d =  mm*100.0;
  1595. }
  1596. else if(m_nMapMode==MM_LOMETRIC)
  1597. {
  1598. d =  mm*10.0;
  1599. }
  1600. else if(m_nMapMode==MM_LOENGLISH)
  1601. {
  1602. d =  mm*100.0/25.4;
  1603. }
  1604. else if(m_nMapMode==MM_HIENGLISH)
  1605. {
  1606. d =  mm*1000.0/25.4;
  1607. }
  1608. else if(m_nMapMode==MM_TWIPS)
  1609. {
  1610. d =  mm*1440.0/25.4;
  1611. }
  1612. else
  1613. {
  1614. d = 0;
  1615. }
  1616. double s= m_dMapScale/m_dLogicalUnitsPtrMeterX;
  1617. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1618. switch(m_nUnitType) {
  1619. case 0:
  1620. break;
  1621. case 1:
  1622. s=s/100;
  1623. break;
  1624. case 2:
  1625. s=s/1000;
  1626. break;
  1627. case 3:
  1628. s=s*0.0254;
  1629. break;
  1630. case 4:
  1631. s=s*1000;
  1632. break;
  1633. case 5:
  1634. break;
  1635. case 6:
  1636. break;
  1637. }
  1638. return d * s;
  1639. }
  1640. inline double CQCoordSys::MMtoWL(double mm,double MapScale)
  1641. {
  1642. double d = 0;
  1643. if(m_nMapMode==MM_TEXT)
  1644. {
  1645. d =  mm/25.4*g_QObj.g_nPixelsPerInchX;
  1646. }
  1647. else if(m_nMapMode==MM_HIMETRIC)
  1648. {
  1649. d =  mm*100.0;
  1650. }
  1651. else if(m_nMapMode==MM_LOMETRIC)
  1652. {
  1653. d =  mm*10.0;
  1654. }
  1655. else if(m_nMapMode==MM_LOENGLISH)
  1656. {
  1657. d =  mm*100.0/25.4;
  1658. }
  1659. else if(m_nMapMode==MM_HIENGLISH)
  1660. {
  1661. d =  mm*1000.0/25.4;
  1662. }
  1663. else if(m_nMapMode==MM_TWIPS)
  1664. {
  1665. d =  mm*1440.0/25.4;
  1666. }
  1667. else
  1668. {
  1669. d = 0;
  1670. }
  1671. double s= MapScale/m_dLogicalUnitsPtrMeterX;
  1672. //0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  1673. switch(m_nUnitType) 
  1674. {
  1675. case 0:
  1676. break;
  1677. case 1:
  1678. s=s/100;
  1679. break;
  1680. case 2:
  1681. s=s/1000;
  1682. break;
  1683. case 3:
  1684. s=s*0.0254;
  1685. break;
  1686. case 4:
  1687. s=s*1000;
  1688. break;
  1689. case 5:
  1690. break;
  1691. case 6:
  1692. break;
  1693. }
  1694. return d * s;
  1695. }
  1696. inline void CQCoordSys::Translate(CPoint OldPoint,CPoint NewPoint)
  1697. {
  1698. switch(m_nWorldMapMode)
  1699. {
  1700. case WMM_NORMAL:
  1701. {
  1702. m_wStartX =m_wStartX-(NewPoint.x-OldPoint.x)*GetWorldScale();
  1703. if(m_nMapMode==MM_TEXT)
  1704. m_wStartY =m_wStartY+(NewPoint.y-OldPoint.y)*GetWorldScale();
  1705. else
  1706. m_wStartY =m_wStartY-(NewPoint.y-OldPoint.y)*GetWorldScale();
  1707. break;
  1708. }
  1709. case WMM_X_AXIS_REVERSE://世界坐标的X轴倒置向左增大
  1710. {
  1711. m_wStartX =m_wStartX+(NewPoint.x-OldPoint.x)*GetWorldScale();
  1712. if(m_nMapMode==MM_TEXT)
  1713. m_wStartY =m_wStartY+(NewPoint.y-OldPoint.y)*GetWorldScale();
  1714. else
  1715. m_wStartY =m_wStartY-(NewPoint.y-OldPoint.y)*GetWorldScale();
  1716. break;
  1717. }
  1718. case WMM_Y_AXIS_REVERSE://世界坐标的Y轴倒置向下增大
  1719. {
  1720. m_wStartX =m_wStartX-(NewPoint.x-OldPoint.x)*GetWorldScale();
  1721. if(m_nMapMode==MM_TEXT)
  1722. m_wStartY =m_wStartY-(NewPoint.y-OldPoint.y)*GetWorldScale();
  1723. else
  1724. m_wStartY =m_wStartY+(NewPoint.y-OldPoint.y)*GetWorldScale();
  1725. break;
  1726. }
  1727. case WMM_XY_AXIS_REVERSE://世界坐标的Y轴倒置向下增大,世界坐标的X轴倒置向左增大
  1728. {
  1729. m_wStartX =m_wStartX+(NewPoint.x-OldPoint.x)*GetWorldScale();
  1730. if(m_nMapMode==MM_TEXT)
  1731. m_wStartY =m_wStartY-(NewPoint.y-OldPoint.y)*GetWorldScale();
  1732. else
  1733. m_wStartY =m_wStartY+(NewPoint.y-OldPoint.y)*GetWorldScale();
  1734. break;
  1735. }
  1736. case WMM_AXIS_ROTATE:
  1737. {
  1738. AfxMessageBox("Not support");
  1739. break;
  1740. }
  1741. default://等同于WMM_NORMAL
  1742. {
  1743. m_wStartX =m_wStartX-(NewPoint.x-OldPoint.x)*GetWorldScale();
  1744. if(m_nMapMode==MM_TEXT)
  1745. m_wStartY =m_wStartY+(NewPoint.y-OldPoint.y)*GetWorldScale();
  1746. else
  1747. m_wStartY =m_wStartY-(NewPoint.y-OldPoint.y)*GetWorldScale();
  1748. }
  1749. }
  1750. }
  1751. inline void CQCoordSys::Translate(long lOffX, long lOffY)
  1752. {
  1753. switch(m_nWorldMapMode)
  1754. {
  1755. case WMM_NORMAL:
  1756. {
  1757. m_wStartX = m_wStartX - lOffX*GetWorldScale();
  1758. if(m_nMapMode==MM_TEXT)
  1759. m_wStartY = m_wStartY + lOffY*GetWorldScale();
  1760. else
  1761. m_wStartY = m_wStartY - lOffY*GetWorldScale();
  1762. break;
  1763. }
  1764. case WMM_X_AXIS_REVERSE://世界坐标的X轴倒置向左增大
  1765. {
  1766. m_wStartX =m_wStartX + lOffX*GetWorldScale();
  1767. if(m_nMapMode==MM_TEXT)
  1768. m_wStartY =m_wStartY + lOffY*GetWorldScale();
  1769. else
  1770. m_wStartY =m_wStartY - lOffY*GetWorldScale();
  1771. break;
  1772. }
  1773. case WMM_Y_AXIS_REVERSE://世界坐标的Y轴倒置向下增大
  1774. {
  1775. m_wStartX = m_wStartX - lOffX*GetWorldScale();
  1776. if(m_nMapMode==MM_TEXT)
  1777. m_wStartY = m_wStartY - lOffY*GetWorldScale();
  1778. else
  1779. m_wStartY = m_wStartY + lOffY*GetWorldScale();
  1780. break;
  1781. }
  1782. case WMM_XY_AXIS_REVERSE://世界坐标的Y轴倒置向下增大,世界坐标的X轴倒置向左增大
  1783. {
  1784. m_wStartX = m_wStartX + lOffX*GetWorldScale();
  1785. if(m_nMapMode==MM_TEXT)
  1786. m_wStartY =m_wStartY - lOffY*GetWorldScale();
  1787. else
  1788. m_wStartY =m_wStartY + lOffY*GetWorldScale();
  1789. break;
  1790. }
  1791. case WMM_AXIS_ROTATE:
  1792. {
  1793. AfxMessageBox("Not support");
  1794. break;
  1795. }
  1796. default://等同于WMM_NORMAL
  1797. {
  1798. m_wStartX = m_wStartX - lOffX*GetWorldScale();
  1799. if(m_nMapMode==MM_TEXT)
  1800. m_wStartY = m_wStartY + lOffY*GetWorldScale();
  1801. else
  1802. m_wStartY = m_wStartY - lOffY*GetWorldScale();
  1803. }
  1804. }
  1805. }
  1806. inline void CQCoordSys::Zoom(CPoint & pt, double dZoomFactor/* =2 */)
  1807. {
  1808. if(dZoomFactor>LARGE_NUMBER|| dZoomFactor==1.0|| dZoomFactor<SMALL_NUMBER ) return ;
  1809. CQPoint fpt;
  1810. LPtoWP(pt,&fpt);
  1811. m_dDispScale *=dZoomFactor;
  1812. m_wStartX=fpt.GetX() - pt.x * GetWorldScale();
  1813. if(m_nMapMode==MM_TEXT)
  1814. m_wStartY=fpt.GetY()-GetWorldScale()*(m_sizeWndportSize.cy-pt.y );
  1815. else
  1816. m_wStartY=fpt.GetY()-GetWorldScale()*(m_sizeWndportSize.cy+pt.y );
  1817. }
  1818. inline void CQCoordSys::DisplayRectFitToView(CBoundaryRect * pRect)
  1819. {
  1820. if(!pRect) return;
  1821. if(!pRect->IsValid()) return;
  1822. //得到左下点和右上点,中点
  1823. long x1,y1,x2,y2;
  1824. WPtoLP( pRect->GetLeftBottomX(), pRect->GetLeftBottomY(), &x1, &y1 );
  1825. WPtoLP( pRect->GetRightTopX(), pRect->GetRightTopY(), &x2, &y2 );
  1826. CPoint MidPos( (x1+x2)/2,(y1+y2)/2 );
  1827. CSize sizewnd = GetWndportSize();
  1828. CPoint tempPoint(sizewnd.cx/2,sizewnd.cy/2);
  1829. double bl1=(double)(sizewnd.cx)/(double)(x2-x1); //横向放大比例
  1830. double bl2=(double)(sizewnd.cy)/(double)(y1-y2); //纵向放大比例
  1831. if(bl2<bl1)  bl1=bl2; //取较小的变化比例
  1832. Zoom(MidPos,bl1);
  1833. Translate(MidPos,tempPoint);
  1834. }
  1835. inline void CQCoordSys::DisplayRectFitToView(double dMinX, double dMinY,double dMaxX,double dMaxY)
  1836. {
  1837. //得到左下点和右上点,中点
  1838. long x1,y1,x2,y2;
  1839. WPtoLP( dMinX, dMinY, &x1, &y1 );
  1840. WPtoLP( dMaxX, dMaxY, &x2, &y2 );
  1841. CPoint MidPos( (x1+x2)/2,(y1+y2)/2 );
  1842. CSize sizewnd = GetWndportSize();
  1843. CPoint tempPoint(sizewnd.cx/2,sizewnd.cy/2); //窗口中点
  1844. if((x2-x1)>=5&&(y1-y2)>=5)
  1845. {
  1846. //改变比例
  1847. double bl1=(double)(sizewnd.cx)/(double)(x2-x1); //横向放大比例
  1848. double bl2=(double)(sizewnd.cy)/(double)(y1-y2); //纵向放大比例
  1849. if(bl2<bl1)
  1850. bl1=bl2; //取较小的变化比例
  1851. Zoom(MidPos,bl1);
  1852. Translate(MidPos,tempPoint);
  1853. }
  1854. }
  1855. void CQCoordSys::DisplayAllInRect(double dMinX, double dMinY,double dMaxX,double dMaxY)
  1856. {
  1857. //计算横向比例
  1858. double hblc = (dMaxX-dMinX)/(GetViewportSize().cx-20);
  1859. //计算纵向比例
  1860. double vblc = (dMaxY-dMinY)/(GetViewportSize().cy-20);
  1861. double blc = 1;
  1862. //取较大的比例为显示比例
  1863. if(hblc>vblc)
  1864. blc = hblc;
  1865. else
  1866. blc = vblc;
  1867. /*以下确定屏幕左下角的实际坐标,即在左侧和下侧都留了10点阵的区域
  1868. (minx,miny)在屏幕的左下角向右10点阵同时向上10点阵处。*/
  1869. SetStartOfWorld(dMinX-10*blc,dMinY-10*blc);
  1870. SetWorldScale(blc);
  1871. switch(GetWorldMapMode())
  1872. {
  1873. case WMM_NORMAL:
  1874. SetStartOfWnd(10,GetViewportSize().cy-10);
  1875. break;
  1876. case WMM_XY_AXIS_REVERSE:
  1877. SetStartOfWnd(GetViewportSize().cx-10,10);
  1878. break;
  1879. case WMM_X_AXIS_REVERSE:
  1880. SetStartOfWnd(GetViewportSize().cx-10,GetViewportSize().cy-10);
  1881. break;
  1882. case WMM_Y_AXIS_REVERSE:
  1883. SetStartOfWnd(10,10);
  1884. break;
  1885. default:
  1886. SetStartOfWnd(10,GetViewportSize().cy-10);
  1887. }
  1888. }
  1889. inline void CQCoordSys::Display_1_VS_1(double dMinX, double dMinY,double dMaxX,double dMaxY)
  1890. {
  1891. SetStartOfWorld(dMinX,dMinY);
  1892. SetDisplayScale(1.0); //设置显示比例为1:1
  1893. switch(GetWorldMapMode()) 
  1894. {
  1895. case WMM_NORMAL:
  1896. SetStartOfWnd(10,GetViewportSize().cy-10);
  1897. break;
  1898. case WMM_XY_AXIS_REVERSE:
  1899. SetStartOfWnd(GetViewportSize().cx-10,10);
  1900. break;
  1901. case WMM_X_AXIS_REVERSE:
  1902. SetStartOfWnd(GetViewportSize().cx-10,GetViewportSize().cy-10);
  1903. case WMM_Y_AXIS_REVERSE:
  1904. SetStartOfWnd(10,10);
  1905. break;
  1906. default:
  1907. SetStartOfWnd(10,GetViewportSize().cy-10);
  1908. }
  1909. }