手把手教你用VC++做等角割圆锥投影的程序
手把手教你用VC++做投影!(以典型的等角割圆锥投影为例,附源代码)
10:00 Post By:2002-5-28 10:
贴子已被锁定
鉴于近来好多人讨论地图投影问题,在此献上一点开发经验!! //欢迎提意见!!!!!!!!!! ///////头文件 // project.h: interface for the CConformalConicProjection class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_PROJECT_H__5BA1F118_AD54_4F10_BBDC_882AFB664FCF__INCLUDED_) #define AFX_PROJECT_H__5BA1F118_AD54_4F10_BBDC_882AFB664FCF__INCLUDED_ #include #include #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CConformalConicProjection : public CObject { public: CConformalConicProjection(); virtual ~CConformalConicProjection(); private: CString Earthspheroid; //地球椭球 double a,b,e; //地球椭球参数 double Westmost,Eastmost; //经度范围 double Southmost,Northmost; //纬度范围 double Mid_longitude; //中央经线 double LongiChange,LatiChange;//经纬线网密度 double Scale; //比例尺 double Standard1,Standard2; //标准纬线 double A,K; //投影常数 double radius; //制图区最低纬线的投影半径 public: void TransferPara(CString Earthspheriod, double Westmost,double Eastmost, double Southmost,double Northmost, double Standard1,double Standard2, double LongiChange,double LatiChange, double Mid_longitude,double Scale); //给对象属性赋值 double CalR(double latitude); //计算纬圈半径 double CalU(double latitude); //计算符号 double CalRadius(double latitude);//计算指定纬线的投影半径 void CalConstant
(); //计算投影常数及最低纬线投影半径 int Round(double a); //四舍五入 inline double DegreeToRadian(double degree) //度转化为弧度 { return degree*3.[1**********]97/180.0; } double CalPointx(double longi,double lati); //计算指定点的x坐标 double CalPointy(double longi,double lati); //计算指定点的y坐标 }; #endif // !defined(AFX_PROJECT_H__5BA1F118_AD54_4F10_BBDC_882AFB664FCF__INCLUDED_) /////////实现文件 // project.cpp: implementation of the CConformalConicProjection class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "WW.h" #include "Project.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction //////////////////////////////////////////////
//////////////////////// CConformalConicProjection::CConformalConicProjection() { Earthspheroid = _T("克拉索夫斯基椭球"); a = 6378245;b = 6356836; e=sqrt((a*a-b*b)/(b*b)); Westmost=DegreeToRadian(-180); Eastmost=DegreeToRadian(180); Southmost=DegreeToRadian(-90); Northmost=DegreeToRadian(90); Mid_longitude=DegreeToRadian(0); Scale=1/90000000.0; LongiChange=DegreeToRadian(5); LatiChange=DegreeToRadian(5); Standard1=DegreeToRadian(-50); Standard2=DegreeToRadian(80); } CConformalConicProjection::~CConformalConicProjection() { } //改变参数 void CConformalConicProjection::TransferPara(CString m_Earthspheroid, double m_Westmost,double m_Eastmost, double m_Southmost,double m_Northmost, double m_Standard1,double m_Standard2, double m_LongiChange,double m_LatiChange, double m_Mid_longitude,double m_Scale) { CConformalConicProjection::Earthspheroid=Earthspheroid; if( Earthspheroid == _T("克拉索夫斯基椭球") ) {a = 6378245;b = 6356836;} else if( Earthspheroid == _T("1967年大地坐标系") ) {a = 6378160;b = 6356775;} else if( Earthspheroid == _T("1975年大地坐标系") ) {a = 6378140;b = 6356755;} else if( Earthspheroid == _T("1980年大地坐标系") ) {a = 6378137;b = 6356752;} else if( Earthspheroid == _T("1980年大地坐标系") ) {a = 6378136;b = 6356751;} e=sqrt((a*a-b*b)/(b*b)); Westmost=DegreeToRadian(m_Westmost); Eastmost=DegreeToRadian(m_Eastmost); Southmost=DegreeToRadian(m_Southmost); Northmost=DegreeToRadian(m_Northmost); Mid_longitude=DegreeToRadian(m_Mid_longitude); LongiChange=DegreeToRadian(m_LongiChange); LatiChange=DegreeToRadian(m_LatiChange); Standard1=DegreeToRadian(m_Standard1); Standard2=DegreeToRadian(m_Standard2); Scale=1/double(m_Scale); } ///计算 void CConformalConicProjection::CalConstant() { double i,j,r1,U1; i=log10(CalR(Standard1)/CalR(Standard2)); j=log10(CalU(Standard2))-log10(CalU(Standard1)); A=i/j; r1=CalR(Standard1); U1=CalU(Standard1); K=100*Scale*r1*pow(U1,A)/A; radius=CalRadius(Southmost); } int CConformalConicProjection::Round(double a) { double c; c=a-floor(a); if(fabs(c)
A); return r; } //转换接口(参数为弧度) double CConformalConicProjection::CalPointx(double longi,double lati) { CalConstant(); double x; lati=DegreeToRadian(lati); longi=DegreeToRadian(longi); x=radius-CalRadius(lati)*cos(A*(Mid_longitude-longi)); return x; } double CConformalConicProjection::CalPointy(double longi,double lati) { CalConstant(); double y; lati=DegreeToRadian(lati); longi=DegreeToRadian(longi); y=CalRadius(lati)*sin(A*(Mid_longitude-longi)); return y;
}