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

GDI/图象编程

开发平台:

Visual C++

  1. // QCoordSys.h: interface for the CQCoordSys class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_)
  5. #define AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. /*
  10. 高斯-克吕格投影、兰勃特投影、墨卡托投影需要定义的坐标系参数序列如下: 
  11. 高斯-克吕格:投影代号(Type),基准面(Datum),单位(Unit), 
  12. 中央经度(OriginLongitude),原点纬度(OriginLatitude), 
  13. 比例系数(ScaleFactor), 
  14. 东伪偏移(FalseEasting),北纬偏移(FalseNorthing) 
  15. 兰勃特: 投影代号(Type),基准面(Datum),单位(Unit), 
  16. 中央经度(OriginLongitude),原点纬度(OriginLatitude), 
  17. 标准纬度1(StandardParallelOne),标准纬度2(StandardParallelTwo), 
  18. 东伪偏移(FalseEasting),北纬偏移(FalseNorthing) 
  19. 墨卡托: 投影代号(Type),基准面(Datum),单位(Unit), 
  20. 原点经度(OriginLongitude),原点纬度(OriginLatitude), 
  21. 标准纬度(StandardParallelOne) 
  22. *******************************************************************
  23. 在MapX中坐标系定义由基准面、投影两部分参数组成,方法如下: 
  24. CoordSys.Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],  
  25. [StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor],  
  26. [FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform])  
  27. 其中参数:Type表示投影类型,Type为1时地图坐标以经纬度表示,它是必选参数,它后面的参数都为可选参数; 
  28. Datum为大地基准面对象,如果采用非地球坐标(NonEarth)无需定义该参数; 
  29. Units为坐标单位,如Units为7表示以米为单位; 
  30. OriginLongitude、OriginLatitude分别为原点经度和纬度; 
  31. StandardParallelOne、StandardParallelTwo为第一、第二标准纬线; 
  32. Azimuth为方位角,斜轴投影需要定义该参数; 
  33. ScaleFactor为比例系数; 
  34. FalseEasting, FalseNorthing为东伪偏移、北伪偏移值; 
  35. Range为地图可见纬度范围; 
  36. Bounds为地图坐标范围,是一矩形对象,非地球坐标(NonEarth)必须定义该参数;  
  37. AffineTransform为坐标系变换对象。
  38.  */
  39. enum  enumQGISWorldMapMode     //世界坐标和图纸坐标之间的映射关系WMM:World Map Mode
  40. {
  41. WMM_NORMAL=0X0000,         //单独使用,普通模式
  42. WMM_X_AXIS_REVERSE=0X0001, //X轴反转可以单独使用,也可以与WMM_Y_AXIS_REVERSE联合使用,效果等同于WMM_XY_AXIS_REVERSE
  43. WMM_Y_AXIS_REVERSE=0X0002, //可以单独使用,也可以与WMM_X_AXIS_REVERSE联合使用,效果等同于WMM_XY_AXIS_REVERSE
  44. WMM_XY_AXIS_REVERSE=0X0003,//单独使用
  45. WMM_AXIS_ROTATE=0X0004     //单独使用
  46. };
  47. enum enumQGISMapProjectionType //地图投影类型 MPT:Map Projection Type
  48. {
  49. MPT_UNKNOWN=0,             //未知
  50. MPT_GAUSS=1,               //高斯投影
  51. MPT_ALBERS,                //albert投影
  52. MPT_LAMBERT,               //Lambert投影
  53. MPT_UTM,                   //通用横轴墨卡托投影
  54. MPT_MAX                   
  55. };
  56. enum enumQGISCoordSysType     //坐标系统类型CST:Coordinate System Type
  57. {
  58. CST_UNKNOWN=0,            //未知
  59. CST_BEIJING54=1,          //北京54
  60. CST_XIAN80,               //西安80
  61. CST_WGS84,                //WGS84坐标系统
  62. CST_MAX
  63. };
  64. enum enumQGISEllipsiodType    //椭球体类型ET:EllipsiodType
  65. {
  66. ET_UNKNOWN=0,             //未知
  67. ET_KLSFSJ=1,              //克拉索夫斯基
  68. ET_IUGG75,                //IUGG75
  69. ET_WGS84,                 //WGS84
  70. ET_USERDEF,               //用户自定义椭球
  71. ET_MAX
  72. };
  73. //////////////////////////////////////////
  74. ///***************CQGIS****************///
  75. ///类    名:CQGISEllipsiodParams
  76. ///基    型:无
  77. ///说    明:椭球体参数类
  78. ///***************CQGIS****************///
  79. //////////////////////////////////////////
  80. class AFX_EXT_CLASS CQGISEllipsiodParams : public CObject
  81. {
  82. public:
  83. CQGISEllipsiodParams(enumQGISEllipsiodType ET = ET_KLSFSJ);
  84. virtual ~CQGISEllipsiodParams(){};
  85. CQGISEllipsiodParams(CQGISEllipsiodParams & e); //拷贝构造函数
  86. void Copy(CQGISEllipsiodParams & e);            //深度拷贝函数
  87. CQGISEllipsiodParams & operator = (CQGISEllipsiodParams & e);
  88. bool operator == (CQGISEllipsiodParams & e);
  89. DECLARE_SERIAL(CQGISEllipsiodParams);
  90. virtual void Serialize(CArchive & ar);
  91. void DataSerialize(CArchive & ar);
  92. public:
  93. void SetEHalfMajorAxis(double a);
  94. double GetEHalfMajorAxis();
  95. void SetEHalfMinorAxis(double b);
  96. double GetEHalfMinorAxis();
  97. void SetEFlattening(double flat);
  98. double GetEFlattening();
  99. void SetEllipsiodType(long lET);
  100. long GetEllipsioddType();
  101. void SetEllipsiodName(CString szEllipsiodName);
  102. CString GetellipsiodName();
  103. long GetEllipsiodYear();
  104. void SetellipsiodYear(long lYear);
  105. CString ValToStr();    //方便测试,将内部属性全部转为字符串
  106. private:
  107. long m_lEID;              //椭球体参数
  108. long m_lEYear;            //定义年代
  109. CString m_szEName;        //椭球名称    
  110. double m_fEHalfMajorAxis; //椭球长半轴
  111. double m_fEHalfMinorAxis; //椭球短半轴
  112. double m_fEFlattening;    //椭球扁率 常数 不必设置
  113. public:
  114. double m_fEGravityConst;  //地心引力常数  不用设置
  115. //X,Y,H为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
  116. double m_fXOffset;
  117. double m_fYOffset;
  118. double m_fZOffset;
  119. };
  120. //////////////////////////////////////////
  121. ///***************CQGIS****************///
  122. ///类    名:CQGISMapProjectionParams
  123. ///基    型:无
  124. ///说    明:地图投影参数类
  125. ///***************CQGIS****************///
  126. //////////////////////////////////////////
  127. class AFX_EXT_CLASS CQGISMapProjectionParams : public CObject
  128. {
  129. public:
  130. CQGISMapProjectionParams();
  131. virtual ~CQGISMapProjectionParams(){};
  132. CQGISMapProjectionParams(CQGISMapProjectionParams & e);
  133. CQGISMapProjectionParams  operator=(CQGISMapProjectionParams & e);
  134. bool operator==(CQGISMapProjectionParams & e);
  135. DECLARE_SERIAL(CQGISMapProjectionParams);
  136. virtual void Serialize(CArchive & ar);
  137. public:
  138. long GetMapProjectionType();
  139. void SetMapProjectionType(long nType);
  140. bool SetLatitudeOf1stStandardParallel(double B1);//第一标准纬线
  141. bool SetLatitudeOf2ndStandardParallel(double B2);//第二标准纬线
  142. bool SetLongitudeOfFalseOrigin(double L0);//中央经度
  143. bool SetLatitudeOfFalseOrigin(double B0);//原点纬度
  144. bool SetEastingAtFalseOrigin(double dEF);//东伪偏移
  145. bool SetNorthingAtFalseOrigin(double dNF);//北纬偏移
  146. double GetLatitudeOf1stStandardParallel();//第一标准纬线
  147. double GetLatitudeOf2ndStandardParallel();//第二标准纬线
  148. double GetLongitudeOfFalseOrigin();//中央经度
  149. double GetLatitudeOfFalseOrigin();//原点纬度
  150. double GetEastingAtFalseOrigin();//东伪偏移
  151. double GetNorthingAtFalseOrigin();//北纬偏移
  152. public:
  153. CString m_szMName;
  154. double  m_dMScale_Factor_On_Initial_Line;  //起始线比例系数
  155. double  m_dMAzimuth_Of_Initial_Line;
  156. double  m_dMAngle_From_Rectified_To_Skewed_Grid;
  157. double  m_dMEasting_At_Projection_Centre;
  158. double  m_dMNorthing_At_Projection_Centre;
  159. double  m_dMLatitude_Of_Projection_Centre; //纬度投影中心
  160. double  m_dMLongitude_Of_Projection_Centre;//经度投影中心
  161. ////  切圆锥投影   参数
  162. double  m_dMLatitude_Of_Natural_Origin; 
  163. double  m_dMLongitude_Of_Natural_Origin;
  164. double  m_dMScale_Factor_At_Natural_Origin;
  165. double  m_dMFalse_Easting;
  166. double  m_dMFalse_Northing;
  167. long    m_lMID;
  168. double  m_dMLongitude_Of_False_Origin;//中央经度
  169. double  m_dMLatitude_Of_False_Origin;//原点纬度
  170. double  m_dMLatitude_Of_1st_Standard_Parallel;//第一标准纬线
  171. double  m_dMLatitude_Of_2nd_Standard_Parallel;//第二标准纬线
  172. double  m_dMEasting_At_False_Origin;//东伪偏移(Lambert,Albers)
  173. double  m_dMNorthing_At_False_Origin;//北纬偏移(Lambert,Albers)
  174. };
  175. //////////////////////////////////////////
  176. ///***************CQGIS****************///
  177. ///类    名:CQGISDatumPlaneParams
  178. ///基    型:无
  179. ///说    明:基准面参数
  180. ///***************CQGIS****************///
  181. //////////////////////////////////////////
  182. //基准面定义
  183. class AFX_EXT_CLASS CQGISDatumPlaneParams : public CObject//基准面参数
  184. {
  185. public:
  186. CQGISDatumPlaneParams();
  187. virtual ~CQGISDatumPlaneParams();
  188. CQGISDatumPlaneParams(CQGISDatumPlaneParams & e);
  189. CQGISDatumPlaneParams operator=(CQGISDatumPlaneParams & e);
  190. bool operator==(CQGISDatumPlaneParams & e);
  191. DECLARE_SERIAL(CQGISDatumPlaneParams);
  192. virtual void Serialize(CArchive & ar);
  193. public:
  194. CString     m_szName;//基准面名称
  195. long        m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
  196. //ShiftX, ShiftY, ShiftZ为平移参数
  197. double     m_dShiftX; 
  198. double     m_dShiftY;
  199. double     m_dShiftZ; 
  200. //RotateX, RotateY, RotateZ为旋转参数;
  201. double     m_dRotateX; 
  202. double     m_dRotateY; 
  203. double     m_dRotateZ; 
  204. //ScaleAdjust为比例校正因子,以百万分之一计
  205. double     m_dScaleAdjust; 
  206. //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
  207. double  m_dPrimeMeridian;//弧度
  208. };
  209. //////////////////////////////////////////
  210. ///***************CQGIS****************///
  211. ///类    名:CQGISGeoCoordSysParams
  212. ///基    型:无
  213. ///说    明:坐标系统参数类
  214. ///***************CQGIS****************///
  215. //////////////////////////////////////////
  216. //////////////////////////////////////////////////////////////////
  217. class AFX_EXT_CLASS CQGISGeoCoordSysParams
  218. {
  219. public:
  220. //1,北京54坐标系;  2,西安80坐标系; 3 ,WGS 84坐标系
  221. CQGISGeoCoordSysParams(enumQGISCoordSysType csType);
  222. ~CQGISGeoCoordSysParams(void);
  223. public:
  224. //设置坐标系统类型: 1,北京54坐标系;  2,西安80坐标系; 3 ,WGS 84坐标系
  225. void SetCoordSysType(enumQGISCoordSysType csType);
  226. //获取坐标系统类型
  227. enumQGISCoordSysType GetCoordSysType();
  228. public:
  229. char Name[5]; //椭球名称
  230. double A; //椭球长半轴
  231. double Alfa; //扁率倒数
  232. double E2; //第一偏心率的平方(e^2)
  233. double UTM; //是否为UTM 投影
  234. double L0; // L0 中央子午线经度(弧度单位)
  235. double X0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
  236. double Y0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
  237. double H0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
  238. double DN; //DN为高程异常, 大地高 = 正常高 + 高程异常
  239. protected:
  240. enumQGISCoordSysType m_enumCoordSysType;
  241. };
  242.  
  243. //////////////////////////////////////////
  244. ///***************CQGIS****************///
  245. ///类    名:CQCoordSys
  246. ///基    型:CObject
  247. ///说    明:坐标系统类
  248. ///***************CQGIS****************///
  249. //////////////////////////////////////////
  250. class CQPoint;
  251. class CBoundaryRect;
  252. class AFX_EXT_CLASS CQCoordSys : public CObject
  253. {
  254. public:
  255. CQCoordSys();
  256. CQCoordSys(CQCoordSys & CS);
  257. CQCoordSys operator= (CQCoordSys & CS);
  258. bool operator==(CQCoordSys & CS);
  259. virtual ~CQCoordSys();
  260. public:
  261. void Copy(CQCoordSys & CS);
  262. DECLARE_SERIAL(CQCoordSys);
  263. virtual void Serialize(CArchive& ar); //序列化 序列化后的文件内容不是明码无法直接查看
  264. inline void SetQMapMode(int MapMode);  //设置映射模式
  265. void SetViewportOrg(CPoint & pt); //设置视口原点
  266. void SetViewportOrg(long x,long y);
  267. void SetViewport(long x,long y,long cx,long cy); //设置视口范围
  268. void SetViewportSize(CSize size);
  269. void SetViewportSize(long cx,long cy);
  270. inline void SetWndportOrg(CPoint & pt);  //设置窗口原点
  271. inline void SetWndportOrg(long x,long y);
  272. void SetWndport(long x,long y,long cx,long cy);  //设置窗口范围
  273. void SetWndportSize(CSize size);
  274. void SetWndportSize(long cx,long cy);
  275. inline void SetStartOfWnd(long x,long y);
  276. inline void GetStartOfWnd(long &x,long &y);
  277. inline long GetStartXOfWnd();
  278. inline long GetStartYOfWnd();
  279. inline int GetQMapMode() const;
  280. inline CPoint GetViewportOrg();   
  281. inline void GetViewport(long &x,long &y,long &cx,long &cy);
  282. inline CPoint GetWndportOrg();            
  283. void GetWndport(long &x,long &y,long &cx,long &cy);
  284. inline CSize GetViewportSize();
  285. inline CSize GetWndportSize();
  286. inline UINT GetWorldMapMode() const; //获得世界坐标和逻辑坐标的换算关系
  287. inline void SetWorldMapMode(UINT wWorldMapMode = WMM_NORMAL);
  288. inline double CalWorldScale(); //计算世界坐标和逻辑坐标的换算关系
  289. inline double GetDisplayScale() const; //获得地图显示放大倍数
  290. inline void SetDisplayScale(double DS); // 设置地图显示放大比例
  291. inline void SetWorldScale(double fDisplayScale,double fMapScale);
  292. inline void SetWorldScale(double worldScale/*一个逻辑相当于worldScalege个世界单位*/);
  293. inline double GetWorldScale() const;
  294. inline double CalDispScale(double worldScale);//根据一个逻辑相当于worldScalege个世界单位,计算显示比例参数
  295. inline double GetMapScale() const; //获得比例尺分母
  296. void SetMapScale(double fMapScale);
  297. inline void SetStartOfWorld(double x,double y);
  298. inline void GetStartOfWorld(double &x,double &y);
  299. inline double GetStartXOfWorld();
  300. inline double GetStartYOfWorld();
  301. inline void SetRotateAngle(double fRA);
  302. inline double GetRotateAngle();
  303. CString GetUnitNameCHS(); //获得系统单位的汉字
  304. inline int GetUnitType()const;
  305. void SetUnitType(int it);
  306. CQGISEllipsiodParams  & GetEllipsiodParams();
  307. CQGISMapProjectionParams & GetMapProjectionParams();
  308. CQGISDatumPlaneParams    & GetDatumPlaneParams();
  309. void SetLogicalUnitsPtrMeter(double x,double y);
  310. void GetLogicalUnitsPtrMeter(double &x,double &y);
  311. double GetLogicalUintsPtrMeterX();
  312. double GetLogicalUintsPtrMeterY();
  313. void LPtoWP(long x,long y,double * wx,double * wy); //逻辑坐标到世界坐标的转换关系
  314. void LPtoWP(CPoint  pt,CQPoint * qpt);
  315. void LPtoWP(CRect rc,CBoundaryRect * pRect);
  316. void WPtoLP(double wx,double wy,long *lx,long *ly);
  317. void WPtoLP(CQPoint qpt,CPoint * pt);
  318. void WPtoLP(CBoundaryRect  BRect,CRect * pRc);
  319. //系统中对应的几种长度单位
  320. //1、逻辑长度 2、世界长度 3、图纸长度 4、毫米长度
  321. double LLtoWL(long lLen); //Windows逻辑长度转换为世界长度
  322. inline long WLtoLL(double wLen); //世界长度转换为逻辑长度
  323. inline double LLtoMM(long lLen); //逻辑长度转换为毫米长度
  324. inline long MMtoLL(double mLen); //毫米长度转换为逻辑长度
  325. inline double WLtoML(double wLen);//世界坐标转换为图纸长度
  326. inline long MLtoLL(double mLen);  //图纸坐标转换为逻辑坐标
  327. inline double MLtoWL(double mLen);//图纸坐标转化为世界坐标
  328. inline double LLtoML(long lLen);  //逻辑坐标转换为图纸坐标
  329. inline double MMtoWL(double mm);  //毫米长度转换为世界坐标
  330. //在MapScale比例尺下的毫米长度对应的世界长度
  331. inline double MMtoWL(double mm,double MapScale);
  332. inline void Translate(CPoint OldPoint,CPoint NewPoint);
  333. inline void Translate(long lOffX, long lOffY);
  334. //以lpt点为中心,放大或缩小图形,dZoomFactor>1为放大,小于1为缩小
  335. inline void Zoom(CPoint & pt, double dZoomFactor=2);
  336. inline void DisplayRectFitToView(CBoundaryRect * pRect);
  337. inline void DisplayRectFitToView(double dMinX, double dMinY,double dMaxX,double dMaxY);
  338. void DisplayAllInRect(double dMinX, double dMinY,double dMaxX,double dMaxY);
  339. inline void Display_1_VS_1(double dMinX, double dMinY,double dMaxX,double dMaxY);
  340. protected:
  341. int m_nMapMode; // //设备坐标和逻辑坐标之间的影射模式,默认为MM_TEXT
  342. //视口设备坐标参数
  343. CPoint m_ptViewportOrg;   // 视口原点
  344. CSize m_sizeViewportSize; // 视口范围
  345. //窗口逻辑坐标
  346. CPoint m_ptWndportOrg;    // 窗口原点
  347. CSize  m_sizeWndportSize; // 窗口范围
  348. //世界坐标系统下的起点(m_dStartX,m_dStartY)在逻辑坐标系统下的值
  349. long m_lStartX;
  350. long m_lStartY;
  351. //世界坐标系下用于显示图形的起点坐标
  352. double m_wStartX;
  353. double m_wStartY;
  354. //逻辑坐标系统与世界坐标系统的影射模式
  355. enumQGISWorldMapMode m_nWorldMapMode;
  356. //世界坐标的旋转角度,只有当m_nWorldMapMode=WMM_AXIS_ROTATE时候起作用
  357. double m_dRotateAngle;//度数[0-360]
  358. private:
  359. CQGISEllipsiodParams m_EllipsiodParams;  //椭球参数
  360. CQGISDatumPlaneParams m_DatumPaneParams; //基准面参数
  361. CQGISMapProjectionParams m_MapProjectionParams; //投影转换参数
  362. int m_nUnitType;  //系统单位:0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
  363. double m_dLogicalUnitsPtrMeterX;//逻辑坐标的X轴上一米相当于m_dLogicalUnitsPtrMeterX逻辑单位
  364. double m_dLogicalUnitsPtrMeterY;//逻辑坐标的Y轴上一米相当于m_dLogicalUnitsPtrMeterY逻辑单位
  365. double m_dMapScale; //地图比例尺分母
  366. double m_dDispScale;//地图显示比例,既将图纸放大m_dDispScale倍
  367. };
  368. #endif // !defined(AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_)