QCoordSys.h
资源名称:QGIS.rar [点击查看]
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:16k
源码类别:
GDI/图象编程
开发平台:
Visual C++
- // QCoordSys.h: interface for the CQCoordSys class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_)
- #define AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- /*
- 高斯-克吕格投影、兰勃特投影、墨卡托投影需要定义的坐标系参数序列如下:
- 高斯-克吕格:投影代号(Type),基准面(Datum),单位(Unit),
- 中央经度(OriginLongitude),原点纬度(OriginLatitude),
- 比例系数(ScaleFactor),
- 东伪偏移(FalseEasting),北纬偏移(FalseNorthing)
- 兰勃特: 投影代号(Type),基准面(Datum),单位(Unit),
- 中央经度(OriginLongitude),原点纬度(OriginLatitude),
- 标准纬度1(StandardParallelOne),标准纬度2(StandardParallelTwo),
- 东伪偏移(FalseEasting),北纬偏移(FalseNorthing)
- 墨卡托: 投影代号(Type),基准面(Datum),单位(Unit),
- 原点经度(OriginLongitude),原点纬度(OriginLatitude),
- 标准纬度(StandardParallelOne)
- *******************************************************************
- 在MapX中坐标系定义由基准面、投影两部分参数组成,方法如下:
- CoordSys.Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],
- [StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor],
- [FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform])
- 其中参数:Type表示投影类型,Type为1时地图坐标以经纬度表示,它是必选参数,它后面的参数都为可选参数;
- Datum为大地基准面对象,如果采用非地球坐标(NonEarth)无需定义该参数;
- Units为坐标单位,如Units为7表示以米为单位;
- OriginLongitude、OriginLatitude分别为原点经度和纬度;
- StandardParallelOne、StandardParallelTwo为第一、第二标准纬线;
- Azimuth为方位角,斜轴投影需要定义该参数;
- ScaleFactor为比例系数;
- FalseEasting, FalseNorthing为东伪偏移、北伪偏移值;
- Range为地图可见纬度范围;
- Bounds为地图坐标范围,是一矩形对象,非地球坐标(NonEarth)必须定义该参数;
- AffineTransform为坐标系变换对象。
- */
- enum enumQGISWorldMapMode //世界坐标和图纸坐标之间的映射关系WMM:World Map Mode
- {
- WMM_NORMAL=0X0000, //单独使用,普通模式
- WMM_X_AXIS_REVERSE=0X0001, //X轴反转可以单独使用,也可以与WMM_Y_AXIS_REVERSE联合使用,效果等同于WMM_XY_AXIS_REVERSE
- WMM_Y_AXIS_REVERSE=0X0002, //可以单独使用,也可以与WMM_X_AXIS_REVERSE联合使用,效果等同于WMM_XY_AXIS_REVERSE
- WMM_XY_AXIS_REVERSE=0X0003,//单独使用
- WMM_AXIS_ROTATE=0X0004 //单独使用
- };
- enum enumQGISMapProjectionType //地图投影类型 MPT:Map Projection Type
- {
- MPT_UNKNOWN=0, //未知
- MPT_GAUSS=1, //高斯投影
- MPT_ALBERS, //albert投影
- MPT_LAMBERT, //Lambert投影
- MPT_UTM, //通用横轴墨卡托投影
- MPT_MAX
- };
- enum enumQGISCoordSysType //坐标系统类型CST:Coordinate System Type
- {
- CST_UNKNOWN=0, //未知
- CST_BEIJING54=1, //北京54
- CST_XIAN80, //西安80
- CST_WGS84, //WGS84坐标系统
- CST_MAX
- };
- enum enumQGISEllipsiodType //椭球体类型ET:EllipsiodType
- {
- ET_UNKNOWN=0, //未知
- ET_KLSFSJ=1, //克拉索夫斯基
- ET_IUGG75, //IUGG75
- ET_WGS84, //WGS84
- ET_USERDEF, //用户自定义椭球
- ET_MAX
- };
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///类 名:CQGISEllipsiodParams
- ///基 型:无
- ///说 明:椭球体参数类
- ///***************CQGIS****************///
- //////////////////////////////////////////
- class AFX_EXT_CLASS CQGISEllipsiodParams : public CObject
- {
- public:
- CQGISEllipsiodParams(enumQGISEllipsiodType ET = ET_KLSFSJ);
- virtual ~CQGISEllipsiodParams(){};
- CQGISEllipsiodParams(CQGISEllipsiodParams & e); //拷贝构造函数
- void Copy(CQGISEllipsiodParams & e); //深度拷贝函数
- CQGISEllipsiodParams & operator = (CQGISEllipsiodParams & e);
- bool operator == (CQGISEllipsiodParams & e);
- DECLARE_SERIAL(CQGISEllipsiodParams);
- virtual void Serialize(CArchive & ar);
- void DataSerialize(CArchive & ar);
- public:
- void SetEHalfMajorAxis(double a);
- double GetEHalfMajorAxis();
- void SetEHalfMinorAxis(double b);
- double GetEHalfMinorAxis();
- void SetEFlattening(double flat);
- double GetEFlattening();
- void SetEllipsiodType(long lET);
- long GetEllipsioddType();
- void SetEllipsiodName(CString szEllipsiodName);
- CString GetellipsiodName();
- long GetEllipsiodYear();
- void SetellipsiodYear(long lYear);
- CString ValToStr(); //方便测试,将内部属性全部转为字符串
- private:
- long m_lEID; //椭球体参数
- long m_lEYear; //定义年代
- CString m_szEName; //椭球名称
- double m_fEHalfMajorAxis; //椭球长半轴
- double m_fEHalfMinorAxis; //椭球短半轴
- double m_fEFlattening; //椭球扁率 常数 不必设置
- public:
- double m_fEGravityConst; //地心引力常数 不用设置
- //X,Y,H为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
- double m_fXOffset;
- double m_fYOffset;
- double m_fZOffset;
- };
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///类 名:CQGISMapProjectionParams
- ///基 型:无
- ///说 明:地图投影参数类
- ///***************CQGIS****************///
- //////////////////////////////////////////
- class AFX_EXT_CLASS CQGISMapProjectionParams : public CObject
- {
- public:
- CQGISMapProjectionParams();
- virtual ~CQGISMapProjectionParams(){};
- CQGISMapProjectionParams(CQGISMapProjectionParams & e);
- CQGISMapProjectionParams operator=(CQGISMapProjectionParams & e);
- bool operator==(CQGISMapProjectionParams & e);
- DECLARE_SERIAL(CQGISMapProjectionParams);
- virtual void Serialize(CArchive & ar);
- public:
- long GetMapProjectionType();
- void SetMapProjectionType(long nType);
- bool SetLatitudeOf1stStandardParallel(double B1);//第一标准纬线
- bool SetLatitudeOf2ndStandardParallel(double B2);//第二标准纬线
- bool SetLongitudeOfFalseOrigin(double L0);//中央经度
- bool SetLatitudeOfFalseOrigin(double B0);//原点纬度
- bool SetEastingAtFalseOrigin(double dEF);//东伪偏移
- bool SetNorthingAtFalseOrigin(double dNF);//北纬偏移
- double GetLatitudeOf1stStandardParallel();//第一标准纬线
- double GetLatitudeOf2ndStandardParallel();//第二标准纬线
- double GetLongitudeOfFalseOrigin();//中央经度
- double GetLatitudeOfFalseOrigin();//原点纬度
- double GetEastingAtFalseOrigin();//东伪偏移
- double GetNorthingAtFalseOrigin();//北纬偏移
- public:
- CString m_szMName;
- double m_dMScale_Factor_On_Initial_Line; //起始线比例系数
- double m_dMAzimuth_Of_Initial_Line;
- double m_dMAngle_From_Rectified_To_Skewed_Grid;
- double m_dMEasting_At_Projection_Centre;
- double m_dMNorthing_At_Projection_Centre;
- double m_dMLatitude_Of_Projection_Centre; //纬度投影中心
- double m_dMLongitude_Of_Projection_Centre;//经度投影中心
- //// 切圆锥投影 参数
- double m_dMLatitude_Of_Natural_Origin;
- double m_dMLongitude_Of_Natural_Origin;
- double m_dMScale_Factor_At_Natural_Origin;
- double m_dMFalse_Easting;
- double m_dMFalse_Northing;
- long m_lMID;
- double m_dMLongitude_Of_False_Origin;//中央经度
- double m_dMLatitude_Of_False_Origin;//原点纬度
- double m_dMLatitude_Of_1st_Standard_Parallel;//第一标准纬线
- double m_dMLatitude_Of_2nd_Standard_Parallel;//第二标准纬线
- double m_dMEasting_At_False_Origin;//东伪偏移(Lambert,Albers)
- double m_dMNorthing_At_False_Origin;//北纬偏移(Lambert,Albers)
- };
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///类 名:CQGISDatumPlaneParams
- ///基 型:无
- ///说 明:基准面参数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- //基准面定义
- class AFX_EXT_CLASS CQGISDatumPlaneParams : public CObject//基准面参数
- {
- public:
- CQGISDatumPlaneParams();
- virtual ~CQGISDatumPlaneParams();
- CQGISDatumPlaneParams(CQGISDatumPlaneParams & e);
- CQGISDatumPlaneParams operator=(CQGISDatumPlaneParams & e);
- bool operator==(CQGISDatumPlaneParams & e);
- DECLARE_SERIAL(CQGISDatumPlaneParams);
- virtual void Serialize(CArchive & ar);
- public:
- CString m_szName;//基准面名称
- long m_lEllipsoid;//Ellipsoid为基准面采用的椭球体的ID号
- //ShiftX, ShiftY, ShiftZ为平移参数
- double m_dShiftX;
- double m_dShiftY;
- double m_dShiftZ;
- //RotateX, RotateY, RotateZ为旋转参数;
- double m_dRotateX;
- double m_dRotateY;
- double m_dRotateZ;
- //ScaleAdjust为比例校正因子,以百万分之一计
- double m_dScaleAdjust;
- //PrimeMeridian为本初子午线经度,在我国取0,表示经度从格林威治起算
- double m_dPrimeMeridian;//弧度
- };
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///类 名:CQGISGeoCoordSysParams
- ///基 型:无
- ///说 明:坐标系统参数类
- ///***************CQGIS****************///
- //////////////////////////////////////////
- //////////////////////////////////////////////////////////////////
- class AFX_EXT_CLASS CQGISGeoCoordSysParams
- {
- public:
- //1,北京54坐标系; 2,西安80坐标系; 3 ,WGS 84坐标系
- CQGISGeoCoordSysParams(enumQGISCoordSysType csType);
- ~CQGISGeoCoordSysParams(void);
- public:
- //设置坐标系统类型: 1,北京54坐标系; 2,西安80坐标系; 3 ,WGS 84坐标系
- void SetCoordSysType(enumQGISCoordSysType csType);
- //获取坐标系统类型
- enumQGISCoordSysType GetCoordSysType();
- public:
- char Name[5]; //椭球名称
- double A; //椭球长半轴
- double Alfa; //扁率倒数
- double E2; //第一偏心率的平方(e^2)
- double UTM; //是否为UTM 投影
- double L0; // L0 中央子午线经度(弧度单位)
- double X0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
- double Y0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
- double H0; //X0,Y0,H0为标准椭球的平移参数,目的是为了使椭球与某地区吻合最好将标准椭球进行平移
- double DN; //DN为高程异常, 大地高 = 正常高 + 高程异常
- protected:
- enumQGISCoordSysType m_enumCoordSysType;
- };
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///类 名:CQCoordSys
- ///基 型:CObject
- ///说 明:坐标系统类
- ///***************CQGIS****************///
- //////////////////////////////////////////
- class CQPoint;
- class CBoundaryRect;
- class AFX_EXT_CLASS CQCoordSys : public CObject
- {
- public:
- CQCoordSys();
- CQCoordSys(CQCoordSys & CS);
- CQCoordSys operator= (CQCoordSys & CS);
- bool operator==(CQCoordSys & CS);
- virtual ~CQCoordSys();
- public:
- void Copy(CQCoordSys & CS);
- DECLARE_SERIAL(CQCoordSys);
- virtual void Serialize(CArchive& ar); //序列化 序列化后的文件内容不是明码无法直接查看
- inline void SetQMapMode(int MapMode); //设置映射模式
- void SetViewportOrg(CPoint & pt); //设置视口原点
- void SetViewportOrg(long x,long y);
- void SetViewport(long x,long y,long cx,long cy); //设置视口范围
- void SetViewportSize(CSize size);
- void SetViewportSize(long cx,long cy);
- inline void SetWndportOrg(CPoint & pt); //设置窗口原点
- inline void SetWndportOrg(long x,long y);
- void SetWndport(long x,long y,long cx,long cy); //设置窗口范围
- void SetWndportSize(CSize size);
- void SetWndportSize(long cx,long cy);
- inline void SetStartOfWnd(long x,long y);
- inline void GetStartOfWnd(long &x,long &y);
- inline long GetStartXOfWnd();
- inline long GetStartYOfWnd();
- inline int GetQMapMode() const;
- inline CPoint GetViewportOrg();
- inline void GetViewport(long &x,long &y,long &cx,long &cy);
- inline CPoint GetWndportOrg();
- void GetWndport(long &x,long &y,long &cx,long &cy);
- inline CSize GetViewportSize();
- inline CSize GetWndportSize();
- inline UINT GetWorldMapMode() const; //获得世界坐标和逻辑坐标的换算关系
- inline void SetWorldMapMode(UINT wWorldMapMode = WMM_NORMAL);
- inline double CalWorldScale(); //计算世界坐标和逻辑坐标的换算关系
- inline double GetDisplayScale() const; //获得地图显示放大倍数
- inline void SetDisplayScale(double DS); // 设置地图显示放大比例
- inline void SetWorldScale(double fDisplayScale,double fMapScale);
- inline void SetWorldScale(double worldScale/*一个逻辑相当于worldScalege个世界单位*/);
- inline double GetWorldScale() const;
- inline double CalDispScale(double worldScale);//根据一个逻辑相当于worldScalege个世界单位,计算显示比例参数
- inline double GetMapScale() const; //获得比例尺分母
- void SetMapScale(double fMapScale);
- inline void SetStartOfWorld(double x,double y);
- inline void GetStartOfWorld(double &x,double &y);
- inline double GetStartXOfWorld();
- inline double GetStartYOfWorld();
- inline void SetRotateAngle(double fRA);
- inline double GetRotateAngle();
- CString GetUnitNameCHS(); //获得系统单位的汉字
- inline int GetUnitType()const;
- void SetUnitType(int it);
- CQGISEllipsiodParams & GetEllipsiodParams();
- CQGISMapProjectionParams & GetMapProjectionParams();
- CQGISDatumPlaneParams & GetDatumPlaneParams();
- void SetLogicalUnitsPtrMeter(double x,double y);
- void GetLogicalUnitsPtrMeter(double &x,double &y);
- double GetLogicalUintsPtrMeterX();
- double GetLogicalUintsPtrMeterY();
- void LPtoWP(long x,long y,double * wx,double * wy); //逻辑坐标到世界坐标的转换关系
- void LPtoWP(CPoint pt,CQPoint * qpt);
- void LPtoWP(CRect rc,CBoundaryRect * pRect);
- void WPtoLP(double wx,double wy,long *lx,long *ly);
- void WPtoLP(CQPoint qpt,CPoint * pt);
- void WPtoLP(CBoundaryRect BRect,CRect * pRc);
- //系统中对应的几种长度单位
- //1、逻辑长度 2、世界长度 3、图纸长度 4、毫米长度
- double LLtoWL(long lLen); //Windows逻辑长度转换为世界长度
- inline long WLtoLL(double wLen); //世界长度转换为逻辑长度
- inline double LLtoMM(long lLen); //逻辑长度转换为毫米长度
- inline long MMtoLL(double mLen); //毫米长度转换为逻辑长度
- inline double WLtoML(double wLen);//世界坐标转换为图纸长度
- inline long MLtoLL(double mLen); //图纸坐标转换为逻辑坐标
- inline double MLtoWL(double mLen);//图纸坐标转化为世界坐标
- inline double LLtoML(long lLen); //逻辑坐标转换为图纸坐标
- inline double MMtoWL(double mm); //毫米长度转换为世界坐标
- //在MapScale比例尺下的毫米长度对应的世界长度
- inline double MMtoWL(double mm,double MapScale);
- inline void Translate(CPoint OldPoint,CPoint NewPoint);
- inline void Translate(long lOffX, long lOffY);
- //以lpt点为中心,放大或缩小图形,dZoomFactor>1为放大,小于1为缩小
- inline void Zoom(CPoint & pt, double dZoomFactor=2);
- inline void DisplayRectFitToView(CBoundaryRect * pRect);
- inline void DisplayRectFitToView(double dMinX, double dMinY,double dMaxX,double dMaxY);
- void DisplayAllInRect(double dMinX, double dMinY,double dMaxX,double dMaxY);
- inline void Display_1_VS_1(double dMinX, double dMinY,double dMaxX,double dMaxY);
- protected:
- int m_nMapMode; // //设备坐标和逻辑坐标之间的影射模式,默认为MM_TEXT
- //视口设备坐标参数
- CPoint m_ptViewportOrg; // 视口原点
- CSize m_sizeViewportSize; // 视口范围
- //窗口逻辑坐标
- CPoint m_ptWndportOrg; // 窗口原点
- CSize m_sizeWndportSize; // 窗口范围
- //世界坐标系统下的起点(m_dStartX,m_dStartY)在逻辑坐标系统下的值
- long m_lStartX;
- long m_lStartY;
- //世界坐标系下用于显示图形的起点坐标
- double m_wStartX;
- double m_wStartY;
- //逻辑坐标系统与世界坐标系统的影射模式
- enumQGISWorldMapMode m_nWorldMapMode;
- //世界坐标的旋转角度,只有当m_nWorldMapMode=WMM_AXIS_ROTATE时候起作用
- double m_dRotateAngle;//度数[0-360]
- private:
- CQGISEllipsiodParams m_EllipsiodParams; //椭球参数
- CQGISDatumPlaneParams m_DatumPaneParams; //基准面参数
- CQGISMapProjectionParams m_MapProjectionParams; //投影转换参数
- int m_nUnitType; //系统单位:0-M,1-CM,2-MM,3-INCH,4-KM,5-dms, 6-度
- double m_dLogicalUnitsPtrMeterX;//逻辑坐标的X轴上一米相当于m_dLogicalUnitsPtrMeterX逻辑单位
- double m_dLogicalUnitsPtrMeterY;//逻辑坐标的Y轴上一米相当于m_dLogicalUnitsPtrMeterY逻辑单位
- double m_dMapScale; //地图比例尺分母
- double m_dDispScale;//地图显示比例,既将图纸放大m_dDispScale倍
- };
- #endif // !defined(AFX_QCOORDSYS_H__EF4412FA_08C3_498B_89C2_3BE7291147EE__INCLUDED_)