现在的位置: 首页 > 综合 > 正文

ArcObjects学习的重要工具 Object Model Diagrams

2012年12月25日 ⁄ 综合 ⁄ 共 25239字 ⁄ 字号 评论关闭

引用自 GIS的天下 http://www.cnblogs.com/goed/

ArcObjects学习的重要工具 Object Model Diagrams

ArcObects是以一组的基础的类库组成的,在使用这些类的时候经常可能会发现这样那样的问题,比如

(1)不知道到底应该使用哪个类来操作:

(2)有的时候使用某个类的时候会出现有的类不能实例化而有的类又不能直接定义而必须从某个实例中初始化而得到:

实际应用中我们有一些工具可以使用:Object Model Diagrams, ArcObjects Developer Help System, ESRI’s object browser(EOBrowser)。其中ArcObjects Developer Help System和EOBrowser 可能大家用得也比较多,但是Object Model Diagrams可能就用得不多,不太注意。其实Object Model Diagrams是ArcObjects学习和使用很有用的工具,通过这些图可以更好的理解各种类之间的关联,结合Com的知识,可以加深对ArcObjects的认识,使对其的使用更高效。

下面首先结合图说一下Object Model Diagrams中的一些概念:

1)Class(类):AO中有三种类。

Abstract class(抽象类):抽象类算一个超类,不能用来实例化一个对象,比如Line就是一个抽象类,其他的线是Line之上,Line给出了所有线的共同特性和方法;

CoClass:这种类可以直接通过new方法实例化出一个对象;

Class:这种类不能直接new出一个对象,但是可以通过实例的属性得到或者通过某个方法生成一个对象。

2)Interface(接口):接口跟类的关系,一个类可以提供很多个接口。

3)Relationships Between Classes:类之间的关系有Association(关联),Type Inheritance(继承),instantiation(实例化),Composition(组成)。

a)Association表示一个类的实例可以和几个其他类的实例相关联,比如一个Line Symbol对象只能和一个线对象相关。

b)Type Inheritance是一个类可以通过继承,得到其父类的属性和方法,比如Line这个超类之上可以有其他类型的特定线类。

c)Instantiation是某个类的某个方法可以实例化其他类的实例,比如:IWorkspaceFactory类的OpenFromFile()方法可以实例化一个IFeatureWorkspace类的实例。

d)Composition是一个强制的关系,是一个类的实例包含了其他的类的实例,比如一个points会包含很多个point,当这么多的point的生命周期没有结束,points对象就不能从内存中卸载掉。

清楚了类的类型和类之间的关系,对于合理的应用类,正确的实例化和卸载类,提高开发的可靠性,清楚类的运行机制很有帮助。

示例:

现在通过一个实例给出如何利用Object Model Diagram,ArcObjects Developer help和EOBrowser来寻找完成一个操作所需要设计的类和方法。实例如下:访问C:\data\US.mdb这个GeoDatabase中的”Status”这个Feature Class。首先,知道这个操作与GeoDatabase有关,可以打开GeoDatabase这个Object Model Diagram,利用PDF的查找功能查找Access这个关键字(Access是访问数据库的关键字,如果Diagram不大,可以游览整个Diagram寻找),可以发现一个AccessWorkspaceFactory类,但是在Developer Help中可以看到AccessWorkspaceFactory类提供了三个接口IWorkspaceFactory,IWorkspaceFactory2,ILocalDatasetCompact。其中接口IWorkspaceFactory有一个OpenFromFile()方法可以打开一个database,可以定义一个IWorkspaceFactory接口来应用这个方法,但是需要实例化一个类来实现这个方法,但WorkspaceFactory是一个抽象类,而AccessWorkspaceFactory类继承了WorkspaceFactory,所以可以用AccessWorkspaceFactory类来实现IWorkspaceFactory接口使用OpenFromFile()方法。

然后,OpenFromFile()方法返回了一个IWorkspace接口,在Workspace类中有一个IFeatureWorkspace接口,可以通过这个把OpenFromFile()方法返回到一个IFeatureWorkspace上,IFeatureWorkspace类有一个OpenFeatureClass()方法。所以可以用这样的代码来实现上面的示例:

Dim pWSF as IWorkspaceFactory
Dim pWS as IWorkspace
Dim pFWS as IFeatureWorkspace
Dim pFC as IFeatureClass

Set pWSF = New AccessWorkspaceFactory
Set pWS = pWSF.OpenFromFile(“C:\data\US.mdb”,0)
Set pFWS = pWS ‘QueryInterface
Set pFC = pFWS.OpenFeatureClass(“States”)

利用Object Model Diagrams 可以清楚的了解类的关系,一个类到底有什么接口,接口之间是什么关系,用某一个方法会返回什么样的类型的结果,如果利用这些结果,如果能够很好的利用这些类图的话,对于ArcObjects会有一个更深的理解!

-----------------------------------------------------

转帖来自http://zhmzhgis.blog.sohu.com/19315350.html

posted @ 2009-12-05 11:47 Goed 阅读(83) | 评论(0) | 编辑
AO快速入门 ArcObjects QuickStart

AO快速入门ArcObjects QuickStart

一.What is ArcObjects

1.AO是什么?

AO 是ESRI公司ArcGIS家族中应用程序ArcMap, ArcCatalog和 ArcScene的开发平台,它是基于Microsoft COM技术所构建的一系列COM组件集。应该澄清的是到目前为止,AO还不是一个独立的应用产品, 是依附在你的ArcGIS DeskTop产品中的软件开发包。也就是说,你购买了ArcGIS Desktop的任何一个产品,不管是ArcView还是ArcInfo,你都有了这套强大的AO组件集,利用AO提供的组件对象来进行应用开发。

2.AO的功能

通过AO你可完成以下甚至更多的GIS功能:

空间数据的显示、查询检索、编辑和分析;

创建各种专题图和统计报表;

高级的制图和输出功能;

空间数据管理和维护;

…………

其实是ArcMap、ArcCatalog和ArcScene这三个应用程序都是由AO搭建起来的,因此从理论上讲这些应用程序能完成的任务,通过 AO同样可以完成(但重新搭建一个ArcMap式的应用程序先不考虑其代价,就可靠性和稳定性而言就值得怀疑,在以后的内容里我会谈到这个问题)。我们现在绝大部分时候要做的---就是要利用ESRI提供的这些AO组件来进行积木式的组装任务。 AO已经提供了许多底层的基本功能,而你的任务是按照应用需求将这些底层功能组装集合成一个更强大的COM对象。我们现在知道AO是基于微软的COM技术来构建的,因此它的开放性和扩展性很强大。这儿的开放性是指在开发环境的选择上可以有VBA、VB、VC++、DEPHI等多种支持COM标准的开发工具,而扩展性是指AO组件没有提供的功能,如需要定义一种新的数据格式,你就可以利用COM技术来写自己的COM组件,对AO组件库进行扩展补充。在 ESRI的文挡中曾经看过类似‘用AO开发功能是没有限制的,这取决于你的想象力。AO的确非常强大,看看ArcMap给我们展现出来的功能就知道了。由于采用了COM技术,因此你不但可以在AO的基础上构造自己的COM组件,而且可以自己来完成一个 COM组件来对AO进行补充。至于为什么AO会基于COM技术,就趋势而言,目前和以后GIS的发展会和主流IT技术融合的越来越紧密,毕竟任何一个软件产品最终是要拿来用的,所以除了提供专业的GIS功能外,从易用性和扩展性来说也是极其重要的,而COM技术提供了一个解决之道。是不是有些罗嗦,强调其重要性的理由无非是在开始我们对AO的开发前先需要您打针兴奋剂,虽然功能强大、使用方便的应用程序从来不是简单的几行代码和控件的拖来拖去就可以搞定的,还需要您不断地学习和掌握更多的新的东西,但对于一个开发人员而言这些投入是值得的,对于尝试利用AO做开发的人员也是如此。那我们还不开始吗?

3.需要的技术基础

如何进入AO软件的领域开发?对于高级的AO程序设计人员我想必须跨越四大技术障碍:

1).面向对象技术思想;

2).COM技术;

3).AO各组件对象的层次组织和相互关系;

4).支持COM的各种开发工具及其环境(如VB、VC、DEPHI等)

真正属于ESRI自己的东西无非就是这套AO组件库。对于初次进入AO开发领域的人员来说,我个人觉得(至于COM还有其它暂时可以先放一边,照猫画虎完成许多任务还是没有问题的了)可以先从ArcGIS Desktop的应用开始,对AO的层次及相关概念有一个了解(如Map、Layer、View、Label、支持的数据格式等),否则等看到AO的示例时可能会一下子云里雾里,两厢印证我觉得最有可能豁然贯通吧。

4.AO开发工具包

AO开发工具包的安装可以选择在安装ArcGIS Desktop时,也可以任何时候使用安装光盘下的\ArcGIS\ArcObjects Developer Kit目录下的Setup.exe文件进行安装。下面是AO开发包安装完成后的目录结构:

Arcobjects Developer Kit

Help --- 包含开发帮助文件:AODev.chm, ArcObjects.chm等

Kits --- 附加的开发者素材诸如投影引擎头文件,类别ID文件和ESRI 示例命令的源代码 (在最新的8.2版本中,该代码位置有所变化)

Object Model Diagrams --- 包括所有的PDF格式对象模型图

Samples --- 包含所有示例工程文件的源代码

Utilities --- 包含ESRI 对象浏览器等工具

5.AO开发资源

1).《ArcObjects Developer Help》 ----- 这是AO开发的首选资源,个人觉得一定程度上甚至可以和微软的MSDN相媲美。不管是AO的基础COM、AO的对象层次图都提供了说明,此外还提供了大量的开发示例。

2).《ArcObjects Online》 ----- 提供了最新的AO组件库文档,其中有一个关于AO的技术论坛相信会让大家有很多意外的收获;

3).《Exploring ArcObjects》 -----一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;

4).《Building a Geodatabase》 -----应用都是围绕数据来展开的,这本书主要是用来设计和创建Geodatabase的,但理解和掌握Geodatabase的层次和建摸方法,对AO的开发是很好的补充。

5).《Microsoft MSDN》----即使你的AO开发工具不是微软的,也建议安装一套完整的MSDN,想多了解和应用COM进行设计开发,MSDN是个宝藏。

二.AO的基础-----COM

组件化程序设计思想在今天应用已经非常普及,那么关于COM都有哪些东西呢? 在本节中我会介绍什么是CLASS,OBJECT,INTERFACE等COM等相关概念。

1.CLASS AND OBJECT(类和对象)

要介绍COM,就不能不提到面向对象思想,那么让我们先来看看什么是对象吧?在日常生活中,你我都是一个个对象,有姓名,有身高、体重等外在的特征,也有各自所具备的工作技能,也需要彼此间进行语言交流,同样在开发应用和GIS中也有对象的概念存在。

你在窗体上使用了一个控件,这个控件本身有大小、位置、颜色、名称等一系列称之为属性(Properties)的外在表示,而且也会有CLICK等称之为事件(Events)的通信动作存在。在AO的世界里,每个东西都是一个对象,有象Map、Form、Layer这些我们可以看到的对象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。那么对象是如何产生的呢?哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point,Line,Polygon,Layer,Table,如果你对GIS还不是很陌生的话)。不用太多的废话,就先实际进入AO来展示下什么是类和对象吧。

Map Class

Properties Methods

MapScale (1:3,800,000) AddLayer (+)

MapUnits (6234233.32,5234234.56) ClearSelection

(很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题)。

如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序中那个文本框的内容,而AddLayer这个方法呢好象就是那个用来增加图层的“+”的行为。

2.COM是什么?

(关于COM实在有太多的东西,以下的内容对AO的初始开发者而言,权当是一个了解吧,现在大可不必去深究)。

终于开始COM了,一个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不同的感受。COM是Microsoft的Component Object Model缩写,它不仅定义了组件程序之间进行交互的标准,而且也提供了组件程序运行所需要的环境(COM本身要实现一个称为COM库(COM library)的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列服务,一般来说,COM库由操作系统加以实现,我们不必关心其实现的细节,象大家经常看到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要应用于Microsoft Windows操作系统平台上。COM通常的发布形式是:以win32动态链接库(DLL)或可执行文件(EXE)的形式发布。

3.COM的目标和特性

建立在二进制代码级上的可重用性(通过包容和聚合);

语言无关性,只要其能生成符合COM规范即可;

对使用COM对象的客户程序而言的进程透明性;

4.对象、类和接口

对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表现在c++类的继承性。

接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。接口设计必须满足:

1). 必须直接或间接地从IUNKNOWN接口继承(该接口在AO中是省缺的);

2). 接口必须有唯一的标识符号;接口不变性,一旦分配和公布了IID,接口定义的任何因素都不能改变。

用COM 开发意味着使用接口,也可以称为基于接口的设计模型。对象间的所有通信都是通过它们的接口来进行的,COM接口是抽象的,意味着相关的接口没有实现,和接口相关的代码来自于一个类实现。如何实现接口对于不同对象是不同的,因此对象只是继承接口的类型,而不是它的实现,这称为类型继承。功能用接口被抽象地构造,并且用类去真正实现。在COM中类和接口通常被当作‘做什么’和‘怎么做’,接口定义一个对象能做什么,类定义它怎么去做。

COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。几个类可以有同样的接口,但是它们的实现可能是极不相同的。通过实现这些接口,COM实现了面向对象的多态性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口。

三. AO对象的使用

在第二章中我们谈到了许多关于COM的概念,象类,对象,接口,方法等,那么一个实际的AO开发中是如何体现这些COM概念的呢---既然AO是基于COM 的。在本节中,我将使用VB代码来说明如何使用AO的对象,并对如何阅读OMD(Object Model Diagram)进行介绍。

1.AO对象的使用

让我们直接用AO相关的代码来开始这段旅程吧,如果你觉得的是的话。:)

Dim pMap as IMap

Set pMap = New Map

PMap.name =”地图名称为-Tour”

…………………….

…………………….

Pmap.ClearLayers

Pmap.Clear //ERROR

如何运行这段代码是下一章的内容,先看看为什么代码会这么写吧,里面奥妙不少。

Dim pMap as Imap

我们知道在COM中对对象的访问是通过接口来完成,因此不能象许多可视化控件那样,可以直接通过其名称来调用属性或执行其方法。那么这句其实就是定义了一个接口变量(题外注释:其实准确地讲应该是一个指向接口的指针变量才对,好在VB把这一切都给演示了)。有了这个接口变量还不行,因为接口是定义在对象上的,那么下来的步骤应该是产生一个对象,而对象又是从那里来的呢---类。

于是就有了这样的代码Set pMap = New Map。

在这句中不单纯只是实例化出一个Map对象,并且将上句的pMap接口变量做为了该对象的缺省接口。OK,现在我们就可以通过这个接口来对地图名进行修改,或者调用ClearLayer方法来删除掉该地图中的所有图层了。再看看增加最后一句的执行情况—会出错,至于为什么,原因很简单,不同的接口中的方法或属性只能通过其接口来访问,而Clear方法属于Map类的另外一个接口IactiveView所有。可以通过查询接口(Query Interface)来’切换‘到IactiveView上。代码如下

Dim mView as IactiveView

set mview=pmap

mview.clear

2.OMD的作用

OMD(对象模型图)是基于OMT(Object Modeling Technique)的表示方法,先来看看OMD能帮我们做些什么?

1). 该类支持哪些接口;

2). 完成任务需要哪些对象;

3). 如何使用该类的对象;

4). 是否可以直接实例化类;

5). 接口有哪些方法和属性;

6). 是否有其它类也支持该接口;

7). 对象间的关系

3.OMD符号解释

在OMD 中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。AO中的Dataset或Geometry classes是抽象类的示例,一个Geometry类型对象不能被创建,但是一个Polyline可以被创建。这个Polyline对象实际上在类的基础上实现了Geometry中定义的接口,因此在基类对象中被定义的接口可以从coclass来访问。

在OMD中的关系类型主要有类型继承(Type inheritance)、创建(Instantiation)、组成(Composition)以及关联(Associations)等。类型继承我们在COM一章过提到过,实际上就是继承完全继承了超类的接口,这点可以利用AO对象浏览器工具清楚的看到,而组成关系指的是对象间的主次关系,也就是说主体的生命存在与否决定着次体的存在与否。

4.AO的组织划分

整个AO的OMD看起来密密麻麻,让人有些头晕眼花的感觉。还好,ESRI对整个AO进行了结构的组织分割,按照不同的应用领域可以找到相应的PDF格式的OMD。从AO开发帮助中我们可以发现划分为以下的几个子系统:

1). 3D Analyst Extension ---用于3D可视化和表面建模的组件对象;

2). Application Framework ---让开发者在ArcMap和ArcCatalong中通过程序来定制用户界面;

3). ArcCatalog --- 能够让开发者扩展数据对象模型并集成定制对象和视图到ArcCatalog应用框架中;.

4). ArcMap --- 提供了ArcMap应用程序的核心功能,用于操作和显示地图文档;

5). ArcMap Editor--- 包括了对象编辑器扩展组件对象,要做编辑开发来这吧;

6). Display --- GIS的一个重要应用就是数据表现,对国内的许多最终用户更是热衷于此,利用这里包含的对象可以完成诸如地图符号显示、图形编辑反馈轨迹、坐标转换和屏幕控制等功能;

7). Geocoding --- 主要用于创建和管理地理编码服务等;

8). Geodatabase--- AO开发中一个不可或缺,毕竟GIS的应用都是围绕数据展开的,所以有关的GIS数据创建、加载、管理和存储等都是通过这里的对象进行的;

9). Geometry--- 不管是要素还是图形,涉及到空间信息的获取和应用来这儿找吧;

10). IMS ---提供了连接到ArcIMS服务器并访问ArcIMS图象和要素服务的功能;

11). NetWork--- 提供了网络创建、管理和完成分析操作等功能,打算定制和开发特定网络应用可以利用NetWork对象;

12). OutPut ---有入就有出,如果想把制作好的地图输出怎么办,通过这里提供的对象来完成吧;

13). Raster --- 用于访问和管理栅格数据的的AO对象;

14). Spatial Reference--- 用于完成空间参考的设置;

15).StreetMap USA Extension---这个和国内的用户关系不大。

诚然,在AO的开发中对象的层次和相互关系是极其重要的,稍有撼缺的是OMD中的对象层次组织看起来有些纷乱,个人觉得《Exploring ArcObjects》里的对象模型图更适合入门使用-----它将一些常用和重要的对象抽取出来并以上下层次结构来表示。

四. AO开发

絮语闲聊,权当消遣- 最近抽时间整理一些以前写的程序,也开始了解MO(ESRI MapObject)的应用,有些感受一起吐出。在GIS应用中最大的工作就是数据的采集整理了,虽然你可以采用MO、MAPX等一些地图控件,如果你够超人,甚至可以自己去做一个地图控件,来完成一个实用性也很个性化的系统出来。可是它终究只是一个应用系统而已。???你应该知道我要讲什么的了吧。所有的应用都是基于一定的数据结构,你可以在自己的应用开发中定义数据模型,但是数据的来源呢。不是CAD,就是 COVERAGE,SHAPE,你可以针对一两种数据格式进行转换,只是现实中的数据类型是多样的,总不能都去写吧,况且你的数据格式能否得到认可呢。再想想看你要做多少工作---那是一个GIS平台才能完成的事情。这就是许多情形下我们为什么没法完全用底层或地图控件去写一个完整GIS系统主要的原因吧。

在本章中,会实现一个特定功能的DLL,用来说明AO开发的几种模式,AO工具包的使用,如何应用写好的组件。在ArcObjects Developer Help中有许多完整和详尽的示例代码,这儿主要想就方法做一个简要的说明。

1.选择一个开发模式

AO 可选的的开发方式可以分为两种,一种是在ArcMap应用框架基础上进行定制开发,另一种是脱离ArcMap应用框架去开发独立的应用程序。通常情况下,我们都是在ArcMap框架下进行定制开发。开发环境可以选择ArcMap本身自带的VBA,也可以选择VB、VC、DEPHI(AO 8.2以上的版本开始支持C#)。

2.选择一个开发工具

作为首选的是VB语言,这样不管是在VBA,还是编写COM组件,你都有最充足的资源可以使用(AO开发文档中最多的SAMPLE就是VB代码了)。第二种是VC(我更愿意将VC做为一个强有力的后备工具),第三种是DEPHI。

3.最简单的“Hello,world”程序

讨论开发工具多少有点离题,现在让我们来转回到一个出名的小应用程序—“Hello,world”,许多语言都是以此做为第一个应用的,我也就不例外了。

打开ArcMap应用程序,选择TOOLS菜单下的MACROS子菜单,打开其中的VBA环境。选择Project工程下的ArcMap Object ,双击打开其中的ThisDocument对象,在右边的编辑环境中选择对象列表中的MxDocument对象,在任务列表中选择 OpenDocumen,然后键入以下的代码:

//Private Function MxDocument_OpenDocument() As Boolean

Dim pmap As IMap

Set pmap = New Map

pmap.Name = "Hello,world"

MsgBox pmap.Name

//End Function

然后按CTRL+S保存后退出ArcMap。

VC开发AO,以 “Hello,world”来写一个组件并在ArcMap中来使用。

1). 启动VC,使用ATL COM AppWizard创建一个DLL工程;

2). 在INSERT菜单下选择NEW ATL OBJECT来增加一个ATL COM对象,

3). 给这个COM对象就起个“world”的名字吧,选择Custom接口类型

4). 在工作空间上选择Cworld类,并右键选择Implement Interface,在类型库中引入ESRI OBJECT Library,选择你要实现的接口(这儿我们选择Icommand)

5). 增加一个全局变量(IApplicationPtr m_ipApp;)来引用到一个应用程序。注意到没有,这儿的接口变量定义和VB的有什么不同,除了本身的语法。就是接口多了‘Ptr’。因此,在VC中如何使用AO的对象你现在应该猜到一些了吧。

6). 下面的工作就是实现接口了。看看Iworld接口中都有哪些东西,哦,这个OnClick()应该是我们想要做些事情的地方了。

// STDMETHODIMP CZoomIn::OnClick(){

IDocumentPtr ipDoc;

m_ipApp->get_Document(&ipDoc);

IMxDocumentPtr ipMxDoc(ipDoc);

IMapPtr ipmap;

ipMxDoc->get_FocusMap(&ipmap)

ipmap->put_Name(_bstr_t("Hello,world"));

…………

::MessageBox(NULL,_T("Hello World!"),_T("Wellcom AO"), MB_OK);

return S_OK;

}

7).编译连接工程;

8).在 ArcMap中注册后就可以将该按钮直接拖放到ArcMap中来使用了。(当你点击时,会弹出当前地图被修改后的名称----“Hello,world”。

4.AO程序实现的一般过程

不管是用VB还是VC或是其它,要做的第一步就是在集成环境因入AO对象库(Esricore.olb),剩下的工作在接口中实现你要做的事情。关于如何进入VB和VC开发的完整代码及说明,请参阅ArcObject Developer Help。

五.AO高级通用组件

可能是有感于独立AO应用程序开发群的迅速扩大,ESRI在其最新的ArcGIS8.2版本中不但继续提供对MapControl控件的开发支持,而且新增了一个PageLayoutControl控件,这对于有制图应用的开发者来说无疑带来了福音。许多时候可能会对组件和控件有些糊涂,其实Active X并不能代表整个COM,它只是COM对象的封装技术,由于COM对象使用的复杂性,因此才会创建框架(如Active X控件)来简化它。所以这两个控件也可称为AO高级通用组件,它由AO基础组件构造而成,面向通用功能,简化了用户开发过程,组件之间的协同控制消息都被封装起来。这级组件经过封装后,使二次开发更为简单。如一个简单的AO应用系统,若用基础AO组件对象开发,需要编写不少的代码,而利用高级通用组件,只需几句代码就够了。

1.MapControl控件

MapControl控件提供了类似ArcMap中的数据视图(Data View)的窗口,通过它你可完成以下甚至更多功能:

&O1548;显示图层地图。

&O1548;放大,缩小,漫游。

&O1548;生成图形元素,如点,线,圆,多边形。

&O1548;说明注记

&O1548;识别地图上被选中的元素,进行空间或属性查询。

&O1548;标注地图元素。

总之在ArcMap中能能够完成的大部分任务,通过MapControl控件也可以完成。通过设置MapControl General, Layers, Map 属性,你甚至不需要写一行代码可以获得一些GIS功能。关于MapControl控件有许多完整的应用示例,存放在http://www.cnblogs.com/goed/admin/file://ArcObjects/ Developer Kit\Samples\Controls目录下。

2.PageLayout控件

PageLayout控件提供了类似ArcMap中的版面视图的窗口,它有以下的属性、方法和事件:

&S226; 管理控件的外观设置

&S226; 管理控件的显示属性

&S226; 管理页面属性

&S226; 在控件中增加和查找元素

&S226; 加载地图文档到控件

&S226; 可以直接从资源管理器和ArcCatalog中拖放数据到控件中

&S226; 打印页面设计.

至于它的功能嘛,ArcMap的Layout 视图能完成的工作,使用PageLayoutControl同样可以完成,象增加和设置图例、打印输出等许多功能。关于PageLayout控件有许多完整的应用示例,也存放在http://www.cnblogs.com/goed/admin/file://ArcObjects/ Developer Kit\Samples\Controls目录下。

3.MapControl和MapObject的关系

确切地讲,MapControl和MapObject控件没有直接的联系。首先,MapControl控件是AO的一部分,至少到目前为止它还不是一个独立的产品,而MapObject是ESRI的一个独立的低端应用产品。第二,MapControl比MapObject功能要强大许多和完善许多, MapObject产品的定位就是提供一些基本的地图功能,高级的功能这得完全靠开发者自己去实现,而依托强大的AO组件库MapControl可以实现许多高级的GIS分析及应用。

-----------------------------------------

转帖来自http://www.cnblogs.com/kaixin110/archive/2008/05/29/1210159.html

posted @ 2009-12-05 11:38 Goed 阅读(141) | 评论(0) | 编辑
2009年11月29日
Code Snippet 代码智慧的结晶
善用VS中的Code Snippet来提高开发效率

前言

在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率。在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是需要经常编写一些类似或者说雷同的代码,我们需要一种方法将这些代码管理起来,减少重复输入。

一个常见的例子,在使用for语句结构时,可能会有这样的代码:
Code
int[] array = { 1, 2, 3, 4, 5 };
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}

或者
Code
List<string> names = new List<string> { "Anders", "Bill", "Clark", "David"};
for (int i = 0; i < names.Count; i++)
{
if (names[i].StartsWith("A"))
{
Console.WriteLine(names[i]);
}
}

显然,这两个for循环的代码很相似:输入for,选择一个变量用作索引,该变量有个上限值,还有几个括号和分号。而且绝大多数的for循环都是如此,那么该如何减少重复输入呢? 可以想到的一种方法是把一段for循环的代码保存在某个地方,比如一个文件内,在需要for的地方,拷贝进来,把变量名、初始值、上限修改一下就可以用了。

VS的开发者想的很周全,提供了Code Snippet功能,从而实现了上面的想法。它保存了for循环代码的模板,然后给它一个快捷键for。现在在编辑器中(需要是C#文件),输入for,连续按两下Tab键,就会出现下面的代码:

不仅有了for的基本代码,还定位到了变量的名字处,如果需要可以修改变量名,假设改为index,后面的两个i会自动改为index,然后按Tab,光标会跳至下一个深色显示的地方,即length,这里可以修改index的上限,然后回车,光标会跳至for循环的代码体:

是不是很方便呢?还有很多其它Snippet,比如输入cw,按两下Tab就出来Console.WriteLine()。

很多时候,同样的功能在不同语言内的表现是不同的,所以Code Snippet(以下简称Snippet)是特定于语言的,也就是说C#的Snippet不能用于VB.NET。VS2008中的Snippet支持C#、VB.NET、XML。

Snippet的管理

首先VS2008提供了很多内置的Snippet,另外我们也可以将自己编写的或者他人编写的导入VS中。通过菜单Tools -> Code Snippets Manager(或按Ctrl+K, Ctrl+B),打开Code Snippets Manager窗口:

可以看到上面的Language列表,现在选中的是C#。可以通过Import方式来导入新的Snippet。在使用NUnit时,由于测试代码的特点,会有很多重复输入,所以Scott Bellware提供了NUnit的Snippet,我把它放在自己的博客来了:BellwareNUnitSnippet。现在把包里的.snippet文件导入。

嗯,可以使用了。比如,输入tc,按两下Tab,出来的代码是这样的:

输入TestCase的名称,回车,这样就可以输入测试代码了。观察一下这个Snippet,它的变化之处只有一个,就是TestCase处。

接下来我们来分析一下Snippet文件的结构,这样才能编写自己的Snippet。

Snippet定义文件解析

下面来看看Snippet是如何实现的。根据上面tc的例子,我们可以猜想要存放Snippet,至少需要模板代码、占位符、语言类型、快捷键这几个关键信息,每个Snippet都是如此。事实上,VS把这些信息保存在XML文件中,这些信息都对应着某些节点,这个与上一篇里的模板清单文件类似。

存放Snippet的文件是XML文件,不过它的扩展名是.snippet。一个Snippet文件可以包含多个Snippet,就像上面的BellwareNUnit.snippet那样。它的基本结构如下:
XML Code
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Code Snippet for Debug.WriteLine method.</Title>
<Shortcut>dw</Shortcut>
<Author>Anders Cui</Author>
</Header>
<Snippet>
<Code Language="CSharp">
<![CDATA[
Debug.WriteLine(“Text”);
]]>
</Code>
</Snippet>
</CodeSnippet>
<!-- other snippets -->
</CodeSnippets>

现在新建一个XML文件,输入上面的代码,这里我们的Snippet是输入Debug.WriteLine代码。该文件的根节点为CodeSnippets,可以包含多个<CodeSnippet>节点。注意它的命名空间,有了这个,在VS内编辑时就方便多了。

重点关注<CodeSnippet>节点,它即表示一条Snippet。它必须包含一个Format Attribute(老是看到Attribute和Property的讨论,故在此保留),用以表示Snippet版本。另外它必须包含两个子节点:<Header>和<Snippet>。

对于<Header>节点,最重要的是Title和Shortcut,即Snippet的名称和快捷键;另外还有SnippetTypes,它可以包含若干个SnippetType节点,可有三种取值,Expansion、SurroundsWith、Refactoring。Expansion允许代码插入在光标处;SurroundsWith允许代码围绕在选中代码两边(就像#region那样);Refactoring指定了在C#重构过程中所使用的Snippet,在自定义Snippet中不能使用。如果该值不做设置,则Snippet可以放在任何地方。

要了解<Header>的更多信息,请参看这里。

对于<Snippet>节点,它是实现代码模板的地方。它包含四个子节点。

1、 <Code>节点
Delimiter:分隔符,默认值为$,后面你会看到它的用法。
Kind:Snippet的类型,比如方法体、方法声明、类型声明等。
Language:所适用的语言类型,如C#、VB.NET、XML。

在我们上面的例子中,已经有了Code节点了,注意这里把代码包含在<![CDATA[]]>中,因为代码很可能会包含一些特殊字符。

在上面的tc Snippet中,按下Tab后,VS会选中TestCase,这样修改起来更为方便,对于上面的dw Snippet,我们自然希望VS选中”Text”部分,这需要下面的<Declarations>节点。

2、<Declarations>节点

该节点包含若干个<Literal>和<Object>节点。它们可以看作是占位符。<Literal>用于指定一些文本值,<Object>则用于声明模板中的对象。
详细信息请参看<Literal>和<Object>。

这里需要把”Text”看作占位符,所以添加一个<Literal>节点:
XML Code
<Snippet>
<Code Language="CSharp">
<![CDATA[
Debug.WriteLine($text$);$end$
]]>
</Code>
<Declarations>
<Literal>
<ID>text</ID>
<ToolTip>Text to write</ToolTip>
<Default>"Text"</Default>
</Literal>
</Declarations>
</Snippet>

这里添加了一个占位符$text$,默认值为”Text”,行末的$end$是一个特殊的占位符,它表示当你按下回车后光标的位置。

3. <Imports>节点

用于指定使用Snippet时应当向文件内添加的命名空间引用,不过只支持VB.NET。

4. <References>节点

用于指定使用Snippet时应当向添加的程序集引用,同样只支持VB.NET:(

好了,现在可以测试一下我们的Snippet了,将文件保存为.snippet文件,然后导入。

还不错吧?

Code Snippet 函数

前面说到,<Imports>和<References>节点只能用于VB.NET,而这里的Code Snippet函数则只能用于C#。

在<Literal>和<Object>节点中,都包含了子节点<Function>,这些函数是VS的一部分,有时会比较有用。共有三个函数:

1. GenerateSwitchCases(EnumerationLiteral),根据提供的枚举类型生成一个switch语句和一系列case语句,事实上,C#中已有这样的一个例子:

回车确认:

2. ClassName(),返回Snippet所在类的名称。

3. SimpleTypeName(TypeName),在Snippet所在的上下文中推断出TypeName参数的最简单形式。
下面以SimpleTypeName为例来看一下这些函数的用法:
XML Code
<Snippet>
<Code Language="CSharp">
<![CDATA[
$NameOfDebug$.WriteLine($text$);$end$
]]>
</Code>
<Declarations>
<Literal>
<ID>text</ID>
<ToolTip>Text to write</ToolTip>
<Default>"Text"</Default>
</Literal>
<Literal Editable="false">
<ID>NameOfDebug</ID>
<Function>SimpleTypeName(global::System.Diagnostics.Debug)</Function>
</Literal>
</Declarations>
</Snippet>

这里比前面的Snippet添加了一个Literal,为什么需要这么做呢?我们知道System.Diagnostics命名空间默认情况下是没有引用的,如果使用Debug类,还需要引用System.Diagnostics。这里的妙处在于VS会推断NameOfDebug的最简单形式,如果没有引用System.Diagnostics,它会在Debug前面加上,否则就不会加上。

几条建议

首先,Snippet的定义都在XML中,因此也算得上是代码,所以在命名上与其它代码无异,都要选择更有意义或者相关性的名字。命名快捷键的一个做法是使用首字母的缩写,比如Assert.AreEqual(expected, actual);的快捷键为ae。

另外,记得填写ToolTip节点的内容,这些内容在使用Snippet时会看到。

其它工具

虽然Snippet可以简化代码输入,可是它本身的编写却并非很方便,使用一些可视化工具会更好,比如Snippet Editor,有兴趣可以试一下。

另外,这个世界还有很多人在编写Snippet,比如gotcodesnippets.com,所以在动手编写之前可以先搜索一下:)

小结

本文介绍了Code Snippet的使用和编写,它可以看作是代码片段的模板,在粒度上比项目/项模板更小,从而进一步提高了工作效率。

参考

《Professional Visual Studio® 2008 Extensibility》
作者:Anders Cui
出处:http://anderslly.cnblogs.com/

visual studio code snippet editor使用

近日发现VS2008中的code snippet挺好用的.网上找找没有这方法的讲解,只有自己摸了,,,它的主要功能自动创建一些代码如:

switch(expression)

{

case express :

break;

case express :

break;

case express :

break;

default:

break;

}

自动创建这样的代码框架.

如我们想输入if else 语句的时候,可以 按Ctrl + K + X 然后就会出来一个insert snippet (插入代码片断)的提示,然后选择Visual C# 因为本人正在学习C#.(C#个人感觉挺有前途的.)

再输入If按照VS的智能提示.intellisence 自动定位的if,按回车就OK了.

这时会插入一个IF() {}这样的代码框架.

我感觉着呢.我要是带有一个else的分支语句更好.所以就试着编辑这个东西.这个东西呢,在

我的计算机中是这个位置:C:\Program Files\Microsoft Visual Studio 9.0\VC#\Snippets\1033\Visual C#

当然跟自己安装VS的目录有关.找到if.snippet ,文件命名挺有规律的.打开编辑就行了,本文以switch 语句为例:

原来的switch语句只能输出这样的内容

switch(switch_on)

{

default:

}

这样很不方便.

从网上下载visual studio snippet editor 这个软件,比我们手动更改这里的XML格式的文件好多了.

可惜不能上传,如果能上传的话,把这个东西传上来,文件不大,只有200多K吧.

用这个东西打开switch.snippet.这个文件.

如图:

Me就把这个界面翻译一下吧.英语湊合啊
snippet ,就是要插入的代码片断如IF了,switch 了,就是那个目录里边的东西
tittle 就是标题,跟snnippet一样就可以了.
shortcut 就是快捷方式.就是少输几个字母而已.
author :就是作者了.
Description 就是描述这个东西的作用了.
snippet types .里边有个expansion 就是在外面的代码,和suroundswith刚好相反.大家可以试下.
suroundswith作用就是把某条语句放到你想插入的代码片断当中.
imports ,导入命名空间当中.
literals 和objects就是
里边有个ADd和edit 和delete,就是添加编辑,删除.
ID就是添加id号了,名字可以随便起了.最好和那些英文单词,明白意思的东西.tooltip 就是鼠标放上出来的提示了.defaultvalue ,就是默认的值了.这个东西.替换那个ID,在正面的Code中代码中,.替换这个$ID$.
function目前发现没有什么用.是说明这个东西的功能的.editorble是说明这个变量是否可编辑.就是literals 和objects 是否可编辑.到IDE中就会被 一个 青色的东西,蒙着.
language 选择个语言就行了,我这里选择的是Csharp
下面就是编辑代码的地方.
比如我们要加入个case语句.然后我们就在下面写上case 后面的东西是要被替换的.我们就定义一个ID
ID我这里定义成cases 默认值是condion_On后面跟条件的.这里.的editoble设置成true,意思是可以编辑的.这个condion_on是可以被编辑的.就是被一层东西蒙着的.再加个:号就行了.case $cases$:
我们可以再加个break,别的都一样,只是后面editorble设置成false就可以了.好了后.我们想加多少个Case都行,复制粘贴就行了.
case $cases$:

$breaks$
就这样.了挺方便实用的.

转至http://hi.baidu.com/fjwfly/blog/item/db9e9ddefd7cfd5795ee37a2.html

posted @ 2009-11-29 22:01 Goed 阅读(118) | 评论(0) | 编辑
2009年11月27日
GIS开发中的坐标系统1(转帖整理)
From http://www.hmgis.cn/post/70.html
如何确定地球上的一点的精确位置?这是地理坐标系统要回答的问题。由于地球是一个球体,把地球上的一点转换到二维的平面地图上,依赖用户选择的投影坐标系统。因此,将地球上的一点转换到平面地图上有两个阶段,即确定某点在地球上的唯一标识坐标和将唯一标识坐标进行投影平面化。
这就必须对在ArcGIS中经常使用的两种坐标系统——地理坐标系统和投影坐标系统——进行认识。
地理坐标系统(Geographic coordinate system),也可称为真实世界的坐标系,是确定地物在地球上位置的坐标系。它是以经纬度为地图的存储单位的,而经纬度是角度。要确定地球上一点的坐标必须对地球进行数字模拟,要求抽象出一个与地球相似的椭球体,并且这个椭球体拥有一下特点:可以进行量化计算的,具有长半轴、短半轴、偏心率。
由于推求椭球体的年代、使用的方法以及测定的地区不同,其结果往往并不一致,因此地球椭球体的参数值有很多种,如海福特(Hayford)、克拉索夫斯基(Krasovsky)、I.U.G.G等。中国在1952年以前采用海福特(Hayford)椭球体,从1953-1980年采用克拉索夫斯基椭球体。随着人造地球卫星的发射,有了更精密的测算地球形体的条件。1975年第16届国际大地测量及地球物理联合会上通过国际大地测量协会第一号决议中公布的地球椭球体,称为GRS(1975),中国自1980年开始采用GRS(1975)新参考椭球体系。由于地球椭球长半径与短半径的差值很小,所以当制作小比例尺地图时,往往把它当作球体看待,这个球体的半径为6371公里。
以下几行便是GRS_1980椭球及其相应参数。
Spheroid: GRS_1980
Semimajor Axis: 6378137.000000000000000000
Semiminor Axis: 6356752.314140356100000000
Inverse Flattening: 298.257222101000020000
然而有了这个椭球体以后还不够,地理坐标系统还需要一个大地基准面将这个椭球定位,这个基准面将定位地球上点的参照系统,定义经纬线的起点合方向。基准面的建立需要选择一个椭球,然后在地球上选择一个点作为“原点”,椭球上所有其它的点都相对于这个原点进行位置定义。
大地基准面除了全球基准面WGS84,WGS72外,不同的地方还可以使用自己的本地基准面,如中国常常使用的北京1954,西安80,欧洲基准面ED50等,这些基准面之间是可以互相转化的。
在坐标系统描述中,常常可以看到这么一行:
Datum: D_Beijing_1954
这表示大地基准面是D_Beijing_1954,即北京1954基准面。有了Spheroid(椭球体)和Datum(基准面)两个基本条件,地理坐标系统便可以使用。
下面是一个地理坐标系的完整参数:
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime Meridian: Greenwich (0.000000000000000000)
Datum: D_Beijing_1954
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000
地理坐标系统是最常用的坐标系对象,它所以经纬度来描述地面位置。
经度通常用字母λ表示。国际规定通过英国格林尼治天文台的子午线为本初子午线,作为计算经度的起点,该线的经度为0度,向东0-180度叫东经,向西0-180度叫西经。纬度通常以字母φ表示。纬度从赤道起算,在赤道上纬度为0度,纬线离赤道愈远,纬度愈大,至极点纬度为90度。赤道以北叫北纬、以南叫南纬。
地面上任一点的位置,通常用经度和纬度来决定。经线和纬线是地球表面上两组正交(相交为90度)的曲线,这两组正交的曲线构成的坐标,称为地理坐标系。地表面某两点经度值之差称为经差,某两点纬度值之差称为纬差。例如北京在地球上的位置可由北纬39°56'和东经116°24'来确定。
经纬度在度量上是不均匀的,比如经度在赤道上1度是111km,而在北纬60度是55.8km,在南北极点处则是0km。

投影坐标系统(Projection coordinate system)是将三维地理坐标系统上的经纬网投影到二维平面地图上使用的坐标系统,这是非常必要的。因此地理信息系统必然要考虑到地图投影,地图投影的使用保证了空间信息在地域上的联系和完整性,在各类地理信息系统的建立过程中,选择适当的地图投影系统是首先要考虑的问题。
由于地球椭球体表面是曲面,而地图通常是要绘制在平面图纸上,因此制图时首先要把曲面展为平面,但是球面是个不可展的曲面,即把它直接展为平面时,不可能不发生破裂或褶皱。为了防止这种情况的发生,地图学家采用了各种特殊的方式来展开这个球面,这些方法都是在保证某一特性不变的情况下牺牲其它的属性,如等角投影、等积投影和正形投影等。
在大比例地图的选用中,中国一般使用高斯-克吕格,在欧美这种投影方法称为投影横轴墨卡托投影。
下面是一个高斯-克吕格投影坐标系统中的一些参数:
Projection: Gauss_Kruger
Parameters:
False_Easting: 500000.000000
False_Northing: 0.000000
Central_Meridian: 117.000000
Scale_Factor: 1.000000
Latitude_Of_Origin: 0.000000
Linear Unit: Meter (1.000000)
Geographic Coordinate System:
Name: GCS_Beijing_1954
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime Meridian: Greenwich (0.000000000000000000)
Datum: D_Beijing_1954
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000
从参数中可以看出,每一个投影坐标系统都必定会有地理坐标系统。投影坐标系统,实质上就是平面坐标系统,其地图单位通常为米。投影坐标系使用x,y坐标来描述地面上的位置,它用地球椭圆球体spheroid来模拟地球,它使用projection表示投影计算方法,使用unit表示单位,用geocoordsys表示投影坐标系来源。
也就是说,要得到投影坐标就必须得有一个用于投影的球面坐标,然后才能使用投影算法去进行投影,即每一个投影坐标系统都必须要求有地理坐标系统参数。

-------------------------------------------------------------------------------------------------------------
From http://tech.cuit.edu.cn/forum/thread-1397-1-1.html
关于北京54和西安80是我们使用最多的坐标系
先简单介绍高斯-克吕格投影的基本知识,了解就直接跳过,我国大中比例尺地图均采用高斯-克吕格投影,其通常是按6度和3度分带投影,1:2.5万-1:50万比例尺地形图采用经差6度分带,1:1万比例尺的地形图采用经差3度分带。具体分带法是:6度分带从本初子午线开始,按经差6度为一个投影带自西向东划分,全球共分60个投影带,带号分别为1-60;3度投影带是从东经1度30秒经线开始,按经差3度为一个投影带自西向东划分,全球共分120个投影带。为了便于地形图的测量作业,在高斯-克吕格投影带内布置了平面直角坐标系统,具体方法是,规定中央经线为X轴,赤道为Y轴,中央经线与赤道交点为坐标原点,x值在北半球为正,南半球为负,y值在中央经线以东为正,中央经线以西为负。由于我国疆域均在北半球,x值均为正值,为了避免y值出现负值,规定各投影带的坐标纵轴均西移500km,中央经线上原横坐标值由0变为500km。为了方便带间点位的区分,可以在每个点位横坐标y值的百千米位数前加上所在带号,如20带内A点的坐标可以表示为YA=20 745 921.8m。
在Coordinate Systems\Projected Coordinate Systems\Gauss Kruger\Beijing 1954目录中,我们可以看到四种不同的命名方式:
Beijing 1954 3 Degree GK CM 75E.prj
Beijing 1954 3 Degree GK Zone 25.prj
Beijing 1954 GK Zone 13.prj
Beijing 1954 GK Zone 13N.prj
对它们的说明分别如下:
三度分带法的北京54坐标系,中央经线在东75度的分带坐标,横坐标前不加带号
三度分带法的北京54坐标系,中央经线在东75度的分带坐标,横坐标前加带号
六度分带法的北京54坐标系,分带号为13,横坐标前加带号
六度分带法的北京54坐标系,分带号为13,横坐标前不加带号
在Coordinate Systems\Projected Coordinate Systems\Gauss Kruger\Xian 1980目录中,文件命名方式又有所变化:
Xian 1980 3 Degree GK CM 75E.prj
Xian 1980 3 Degree GK Zone 25.prj
Xian 1980 GK CM 75E.prj
Xian 1980 GK Zone 13.prj
西安80坐标文件的命名方式、含义和北京54前两个坐标相同,但没有出现“带号+N”这种形式,为什么没有采用统一的命名方式?让人看了有些费解。

=======================================
大地坐标(Geodetic Coordinate):大地测量中以参考椭球面为基准面的坐标。地面点P的位置用大地经度L、大地纬度B和大地高H表示。当点在参考椭球面上时,仅用大地经度和大地纬度表示。大地经度是通过该点的大地子午面与起始大地子午面之间的夹角,大地纬度是通过该点的法线与赤道面的夹角,大地高是地面点沿法线到参考椭球面的距离。
方里网:是由平行于投影坐标轴的两组平行线所构成的方格网。因为是每隔整公里绘出坐标纵线和坐标横线,所以称之为方里网,由于方里线同时 又是平行于直角坐标轴的坐标网线,故又称直角坐标网。
在1:1万——1:20万比例尺的地形图上,经纬线只以图廓线的形式直接表现出来,并在图角处注出相应度数。为了在用图时加密成 网,在内外图廓间还绘有加密经纬网的加密分划短线(图式中称“分度带”),必要时对应短线相连就可以构成加密的经纬线网。1:2 5万地形图上,除内图廓上绘有经纬网的加密分划外,图内还有加密用的十字线。
我国的1:50万——1:100万地形图,在图面上直接绘出经纬线网,内图廓上也有供加密经纬线网的加密分划短线。
直角坐标网的坐标系以中央经线投影后的直线为X轴,以赤道投影后的直线为Y轴,它们的交点为坐标原点。这样,坐标系中就出现了四 个象限。纵坐标从赤道算起向北为正、向南为负;横坐标从中央经线算起,向东为正、向西为负。
虽然我们可以认为方里网是直角坐标,大地坐标就是球面坐标。但是我们在一副地形图上经常见到方里网和经纬度网,我们很习惯的称经纬度网为大地坐标,这个时候的大地坐标不是球面坐标,她与方里网的投影是一样的(一般为高斯投影),也是平面坐标

posted @ 2009-11-27 19:30 Goed 阅读(125) | 评论(0) | 编辑
MSDN帮助文档不能使用的解决办法【转帖整理】

遇到 “无法显示Microsoft文档资源管理器,因为指定的帮助集合“ms-help://ms.vscc.v90”无效”的解决办法

近期重装VS2008,装好MSDN帮助文档后,打开时遇到“无法显示Microsoft文档资源管理器,因为指定的帮助集合‘ms-help://ms.vscc.v90’无效”的问题,致使无法打开VS2008的MSDN帮助文档。解决方法如下:
执行 "C:\Program Files\Common Files\Microsoft Shared\Help 9\Microsoft Document Explorer 2008\Install.exe" ,选“修复”选项,修复完毕,成功打开MSDN帮助文档。
PS:VS2005应该执行"C:\Program Files\Common Files\Microsoft Shared\Help 8\Microsoft Document Explorer 2005\Install.exe" 。

------------------------------------------------------------------------------------------------------------------------------

MSDN无法显示问题的处理

首先确定msdn是否已经在注册表中注册过,执行如下命令,注意带“”

regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Help\hxds.dll"

如果上步不起作用,看一下是不是IE的临时文件太多了,清理一下IE的临时文件,

点击Delete File,需要等几分钟,删除完成后,再启动MSDN。

如果上步还无法显示MSDN,请确定您的杀毒软件是否屏蔽了MSDN。

抱歉!评论已关闭.