基于VC++的世界地图投影实现方法

阅读: 评论:0

2008年1月
西
建筑
第34卷第3期Vol.34No.3Jan.2008
·5·
SHANXI
ARCHITECTURE
文章编号:100926825(2008)0320005203
基于V C ++的世界地图投影实现方法
3
朱云
张健雄
姜进胜
摘要:提出了兰勃特投影代替高斯投影的新想法,在分析和阐述Visual C ++面向对象的开发环境和绘图功能的基础上,利用Visual C ++编程实现了世界地图的兰勃特投影。该投影具有投影变形小、控制效果好、灵活性强的优点,对电子地图系统及旅游管理系统的建立具有参考价值。关键词:数字地图投影,Visual C ++,面向对象编程语言中图分类号:TP198
文献标识码:A
地图投影是地图从生产到使用都不可缺少的数学基础,同时它又是地图学的重要组成部分。随着现代科学技术的发展,地图投影的研究领域也在不断的拓宽与加深,当前它在地理信息系统和遥感技术应用中已占有相当的比重。地球椭球体表面是个曲面,而地图通常是二维平面,因此在地图制图时首先考虑把曲面转化为平面。球面上任一点的位置是用地理坐标(φ,λ)表示的,而平面上点的位置是用直角坐标(x ,y )或极坐标(λ,ρ)表示的,要想将地球表面点的位置转移到平面上去,则必须采用一定的数
学方法来确定其地理坐标与平面直角坐标或极坐标之间的关系。这种在球面与平面之间建立点与点之
间对应函数关系的数学方法,称为地图投影[1]。文中研究利用Visual C ++编程实现世界多种地图投影的方法,对于电子地图以及旅游系统的建立有一定的帮助作用。
1实现的平台和面向对象的开发环境1.1
额济纳旅游景点大全实现的平台
Visual C ++语言是目前为止功能最强、最受欢迎、应用最广
泛的、高效的Windows 应用程序开发工具,它是在C 语言基础之上发展起来的,是C 语言的超集[2]。Visual C ++是应用程序开
发系统,尤其是运行在Windows 下的应用程序的完整开发系统。
平津战役纪念馆观后感
Windows 的优点是直观、有趣,但Windows 下带有消息驱动体系
和精心设计的API 的环境图形性质,这使得用户使用Windows 很
容易,而对编程者却又很麻烦。Visual C ++在MFC (Microsof t
Foundatio n Class )类库2.0版本下不仅有效地利用了Windows 的
优点,而且克服了其缺点。MFC 类库除提供了一般的应用程度
2V is isu
u a l C ++的基本绘图功能在Windows 程序中实现绘图功能都是由一系列函数实现的,
如M FC 中的设备上下文类(包括CDC 类及其派生类)、Windows 编程中需要用到的基本数据类型(如CPoint ,CSize ,CRect 等)等。通过这些对象类可以实现笛卡儿坐标系和计算机屏幕坐标系之间的转换、图形放大、缩小、平移和开窗;读写两种类型的地图数据文件;按图层控制地图要素,并在每一图层数据中实现图例符号的显示以及不同投影类型的转换。
除设备上下文外,在Windows 中进行绘制通常还需要各种绘制工具,这些工具称作图形对象,封装于M FC 中的Windows GD I 对象类。图形对象类有:CBrush (用于填充)、CPen (用于绘制对象的边线)、CFo nt (用于绘制文本)、CBit map (用于提供操作位图的接口)和CPalette (用作应用程序和彩输出设备之间的接口)。另外,在CDC 类中还定义了一些图形输出函数:Move To ,Line To ,
Polyline 等。由此可以看出,在Visual C ++中绘图也就是通过图
形对象和图形输出函数共同作用完成的。
3地图投影功能的实现
3.1应用CGeoLayerWit hProjection 对象类
地图投影功能是通过CGeoLayerWit hProjection 来实现的,它
是地图层对象类CGeoLayer 的派生类,该类具有投影坐标计算和
转换的功能。
3.1.1地图层对象类CGeoLayer
计算机地图制图制极坐标图中,将地图数据按照其类型划分[5]结构类外,还专门提供了一组可视化对象类(Visual Object Class ),
为地图层。每个地图层地图对象保存在一个数据文件中,为地如菜单类(Class Menu )、按钮类(Class Button )、视窗口类(Class View )等,这为可视化软件系统的开发提供了很大方便[3]。
1.2面向对象的开发环境
面向对象程序设计语言将程序描述的事物看成一个整体,称
为对象(object )。事物的属性基本可以分成两部分,即内部状态(性质)和对数据的操作方法及由此造成
的对外部的影响。对象的数据用于描述内部状态,而代码完成对数据的操作。因此,对象就是包含数据和代码的完全独立的实体。类(class )就是具有相同属性的所有对象的逻辑原型,是对象的规则和设计。同一类的对象具有相同的性质和方法,每一个具体的对象都是类的一个实体,创建对象就是把类实例化[4]。在Visual C ++中,函数遵循“先声明、定义,再调用”的原则。
图层定义了对象类CGeoLayer ,它的属性有:Parent ,LayerName ,
Layer Type 等。
3.1.2
晋江旅游景点哪里好玩CGeoLayerWit hProjection 类的声明
CGeoLayerWit hProjection 类的声明的部分代码如下:class CGeoLayerWit hProjection :public CGeoLayer ;{public :
int m —lineNum ;//线数;int m —PtNum ;//点数;
double m —xWorldMin ,m —yWorldMin ,m —xWorldMax ,m —
yWorldMax ;//坐标的最小值和最大值;
void Set ProjectionType (int type ,double scale );
收稿日期:20072092213:河南省重点科技攻关项目(项目编号:0302032700)
作者简介:朱
云(19832),女,河南理工大学测绘与国土信息工程学院硕士研究生,河南焦作454003
张健雄(19662),男,博士,副教授,河南理工大学测绘与国土信息工程学院,河南焦作454003姜进胜(19832),男,助理工程师,山东正元地理信息工程有限责任公司烟台分公司,山东烟台
264002
第34卷第3期⋯⋯
·6·
2008年1月
山西建
Bpoint CalProjection (int type ,double l ,double b );//投影变
换;
void SetMap Extent (double x1,double y1,double x2,double y2);void Adjust Scale ();//计算比例关系;
塔山阻击战电影完整
void XYWorldToScreen (double x ,double y ,int xx [],int yy []);//世界坐标转换为屏幕坐标。
void XYScreen ToWorld (int x ,int y ,double xx [],double yy []);//屏幕坐标转换为世界坐标。
⋯⋯
protected :
int m —ProjectionType ;//投影类型;double m —Scale ;//比例尺;
{
⋯⋯
}
m —pt0=pt ;return pt ;}
3.3兰勃特投影的实现3.3.1兰勃特投影的原理[6,7]
兰勃特投影也叫正轴等积方位投影,它使得投影图上面积和实际地面相应面积相等,不仅对一点是这样的,扩展到整个制图区域也是如此,它常用于小比例尺的地图中。其基本公式为:
π
ρ=2R sin z ,A =λ,z =2
2
-B ,X =ρcos (δ),Y =ρsin (δ)。
}
3.2投影坐标计算功能的实现代码
在CGeoLayerWit hProjection 类中,投影坐标计算的功能是通
斯坦福大学录取条件
过类成员函数Set Projection Type 设置投影类型和比例尺,以及类成员函数Cal Projection 实现由经纬度转换为直角坐标的计算过程。它通过传递投影类型及经纬度值进行计算,当投影类型为0时不作投影处理,否则调用投影计算过程Cal Projection 完成坐标的转换。CalProjection 函数将根据投影类型分别调用不同的投影计算过程。部分代码如下:
void C GeoLayerWit hProjectio n ::Set Projectio n Type (int type ,double scale )
{
m —ProjectionType =type ;m —Scale =scale ;}
Bpoint C GeoLayerWit hProjectio n ::Cal Projectio n (int type ,double l ,double b )
济宁是哪个省的城市{Bpoint pt ;pt.x =0.0;pt.y =0.0;
static double Pi =3.1415926535897;static double eR =6378245.0;l =l ×Pi /180.0;//经度。b =b ×Pi /180.0;//纬度。
double x ,y ;
if (type ==1)//正轴等角方位投影(球面投影)。{
x =(Pi/2.0-b )/2.0;
if (x =Pi/2.0)x =x -0.087266462599716478846184
5384244306;
if (x =-Pi/2.0)x =x +0.087266462599716478846184
5384244306;
pt.x =2.0×eR ×cos (l )×tan (x )/m —Scale ;pt.y =2.0×eR ×sin (l )×tan (x )/m —Scale ;}
else if (type ==2)//正轴等积方位投影(兰勃特投影)。
⋯⋯
else if (type ==11)//普通多圆锥投影(美国多圆锥投影)。
其中,B ,λ为原始经纬度;ρ,δ为极坐标的极径和方位角;X ,Y 为平面坐标;z ,A 为天顶距和方位角;R 为地球半径。
3.3.2
兰勃特投影的实现算法
不同的地图投影调用上述程序中的不同算法,兰勃特投影的算法定义为:
Bpoint pt ;pt.x =0.0;pt.y =0.0;
static double Pi =3.1415926535897;static double eR =6378245.0;l =l ×Pi /180.0;//经度。b =b ×Pi /180.0;//纬度。
double x ,y ;
if (type ==2)//正轴等积方位投影(兰勃特投影)。{
pt.x =2.0×eR ×cos (l )×sin ((Pi/2.0-b )/2.0)/m —Scale ;
pt.y =2.0×eR ×sin (l )×sin ((Pi/2.0-b )/2.0)/m —Scale ;}
4结语
文中以Visual C ++为平台,完成了从地球曲面经纬度坐标
到平面笛卡儿坐标的转换,并以兰勃特投影为例,给出了绘制出具有投影的世界地图的方法。对话框的设计和编辑以及世界地图的漫游功能还有待于进一步完善。参考文献:
[1]马耀峰,胡文亮,张.地图学原理[M ].北京:科学出版社,2004.[2]刘
斌,王忠.面向对象程序设计———Visual C ++[M ].北京:清华大学出版社,2003.
[3]王泽根.可视化编程与数字地图制图[J ].测绘通报,2000(6):
12213.
[4]马明栋.Visual C ++6.0控制测量程序设计[M ].呼和浩特:
内蒙古大学出版社,2002.60261.
[5]孙以义.计算机地图制图[M ].北京:科学出版社,2000.51252.
[6]胡毓锯,龚敛问,黄伟.地图投影[M ].北京:科学出版社,
1981.
[7]任留成,吕泗洲,施全杰.空间地图投影分类研究[J ].测绘学
院学报,2002,19(3):2302231.

本文发布于:2023-06-13 10:36:22,感谢您对本站的认可!

本文链接:http://www.035400.com/whly/4/158806.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:投影   对象   地图   实现   计算   功能   平面   类型
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2024-2030 Comsenz Inc.Powered by © 文化旅游网 滇ICP备2022007236号-403 联系QQ:1103060800网站地图