前往顾页

基于插件技术的GIS利用框架(C# + ArcEngine9.3)

时候:2012-08-18 17:23来源:知行网www.zhixing123.cn 编辑:麦田守望者

一向想把本来用Delphi写的GIS利用框架进行进级,可因为家庭和事情牵涉了太多的精神,没能如愿,比来一段时候,终究研墨执笔开端了框架的进级事情,用时一个多月,终究新奇出炉了,现在静下心来进行总结,以提炼我这一个多月的辛苦与汗水。


一、关于平台的挑选

实际上自己一向从未用过Visual Studio,更未用C#做过一个完整的项目,其实就开辟平台而言其实不存在太多的差别,就像.net框架和J2EE的包,和delphi的VCL,他们的思唯其实都是年夜同小异的,说话利用到了必然的高度,有了必然的堆集,转换到别的一种说话,坚苦就小多了。其实只需支撑COM的说话都可以用来进行GIS框架的开辟,之所以采取C#开辟新版本的GIS利用框架,对本身来讲不过是两点:第一,界面更加完美;第二,就是想查验一下本身的学习才气。


2、关于ArcEngine接口的挑选

这个问题我感觉很首要,看过很多人家的代码和成型的体系,仿佛都甘愿答应采取ToolbarControl这个东西,我研究了一段时候,这个东西不但节制费事,并且会带来很多负面问题,比如,我无法在ToolbarControl里插手本身的节制逻辑,并且更糟的是,对想要保存本身定制内容的法度员来讲,如许的封装显得过分了。别的,比如IEngineEditor接口的挑选,这个接口供应了很强年夜的服从,对编辑任务和编辑图层几近可以不消写甚么代码就可以实现,但是编辑任务和编辑图层两个列表都必须呈现在ToolbarControl中,这对我这个寻求完美的人来讲,无疑是个灾害,所以在我是框架里,丢弃了ToolbarControl和IEngineEditor这个对很多法度员来讲非常便利的东西,IEngineEditor的服从根基上完端赖本身代码来实现,编辑任务、编辑图层等都以插件的情势呈现在本身的框架里,既做到了界面气势同一,也做到了服从完整可以自定义。当然这面前的代价是你本身编写行数不菲的代码。


3、关于事件

开辟GIS利用框架,最核心的一个问题就是事件的措置了,究竟成果有了事件,所有的插件工具才气有机地构成一个团体,这也是所有插件工具进行协同事情的根本地点。COM供应了连接点的机制来进行事件的公布,而C#则较为简朴,可以直接经由过程事件代办代理的情势来措置,如许一来,所有客户插件感兴趣的MapControl事件和PageLayoutControl事件便可以便利的经由过程事件代办代理来获得框架的调用。


4、关于反射

.net 的反射机制的确是个好东西,获得插件的范例信息轻而易举,只是自己没有深切研究,在这里也就不赘叙了。


5、关于插件的加载与保存

实际上有很多种体例可以对定制的成果进行保存,比如:布局化存储文件,xml等等,在本文论及的框架里,挑选了后者,不但是因为插件的加载与否,若何加载只需求简朴的进行XML建设便可以实现,并且也便于伶仃调式某个插件或某一组插件。
 

选用甚么样的第三方组件库来进行插件的封装是开辟GIS框架的一个首要问题,直接影响到你框架容器加载插件的体例和插件工具的办理机制;别的开辟平台的挑选也需求考虑,但是挑选有很多种,本文论及的框架开辟环境建设以下:

一、Visual Studio 2008

小我感觉比 Visual Studio 2005 运行不变。

2、ArcEngine 9.3

当然您也能够挑选9.2,或其他版本。

3、DevExpress 第三方组件库

这个第三方组件库服从忒强年夜,并且界面也比较富丽,说实话,不消不晓得,用到前面发明还是有些问题的,不过不影响全局就是了,比如它的下拉列表,要用事件代办代理来公布它的事件还真让你想不到有这么费事,不过还好,工夫不负故意人,专心研究还是出来成果的。建议挑选其他的第三方组件库,这个真不好用。

4、.net framework

挑选甚么样的.net framework版本完整取决于本身,但是版本越高当然bug也就越少,服从自然也就越强年夜。


开辟东西有了,用于实例化插件的第三方组件包也有了,.net framework也选好了,ArcEngine也敲定了,一切筹办伏贴,框架开辟可以开端啦。
 

我们在进行GIS框架的开辟时,有个问题必须先得明白上去,这就是你的插件详细有哪些表示情势,这直接关系到你的框架接口的设想、插件的加载及保存。详细一点,就是说,你的界面大将会呈现哪些UI元素,若何进行办理。比方:Combobox、Edit、MenuItem诸如此类的插件。看过一些文章,年夜都具有子菜单的菜单项和东西栏都当作插件来措置,在本文论及的框架中,没有此类插件,但却一样做到了同一加载,同一办理。

一、号令插件 IAxCommand

接口定义:

public interface IAxCommand : PluginEngine.Interface.IAxPlugin
{

}

这个接口没有任何属性体例,实际上加载到本文框架中的号令插件和东西插件必须别离实现esriSystemUI.ICommand接口和esriSystemUI.ITool接口,这里声明IAxCommand接口只是为了便利插件池工具对所有号令和东西进行办理罢了,前面会有所提及。


2、东西插件 IAxTool

接口定义:

public interface IAxTool : PluginEngine.Interface.IAxPlugin
{
IPoint SnappedPoint { get; } //捕获到的点
}

年夜家可以发明,这个接口只需一个属性,实际上,在本文框架中,为了改变ArcMap那种只需草图东西可以进行捕获的尴尬,对捕获的环境、捕获代办代理的代码全由本身实现,如许一来,对想要进行捕获的其他ITool接话柄现类,只需同时实现 IAxTool 接口就可以进行捕获了。


3、列表框插件 IAxCombobox

接口定义:

/// 下拉列表插件接口
public interface IAxCombobox : PluginEngine.Interface.IAxPlugin
{
/// 下拉列表的称呼
string Name { get; }
/// 下拉列表的题目
string Caption { get; }
/// 是不是显现题目
bool ShowCaption { get; }
/// 下拉列表的Items
System.Collections.ICollection Items { get; }
/// 下拉列表的笔墨
string Text { get; }
/// 下拉列表的类别
string Category { get; }
/// 下拉列表是不是可用
bool Enabled { get; }
/// 下拉列表是不是可编辑
bool Editable { get; }
/// 下拉列表的宽度
int Width { get; }
/// 下拉列表下拉的最年夜行数
int DropDownRows { get; }
/// 提示笔墨
string Tooltip { get; }
/// 呈现在状况栏的动静笔墨
string Message { get; }
/// KeyPress事件
void OnKeyPress();
/// KeyDown事件
void OnKeyDown();
/// EditValueChanged事件
void EditValueChanged(string newText);
/// 列表建立时触发的体例
/// <param name="hook">框架工具</param>
void OnCreate(IAxApplication hook);
}

对一个下拉列表范例的插件,我们只需求定义下面这些属性和体例、事件差不多就够了,后续章节中,我就针对编辑任务列表这个下拉列表插件做详细介绍。


4、编辑框插件 IAxEdit

接口定义:
public interface IAxEdit : PluginEngine.Interface.IAxPlugin
{
/// 编辑框的称呼
string Name { get; }
/// 编辑框的题目
string Caption { get; }
/// 是不是显现题目
bool ShowCaption { get; }
/// 编辑框的笔墨
string Text { get; }
/// 编辑框的类别
string Category { get; }
/// 编辑框是不是可用
bool Enabled { get; }
/// 编辑框是不是只读
bool ReadOnly { get; }
/// 编辑框的宽度
int Width { get; }
string Tooltip { get; }

///状况栏动静
string Message { get; }
/// KeyPress事件
void OnKeyPress();
/// KeyDown事件
void OnKeyDown();
/// 编辑框建立时触发的体例
/// <param name="hook">框架的工具</param>
void OnCreate(IAxApplication hook);
}

定义这个插件接口,可以显现诸如舆图比例尺信息等。


5、菜单组插件 IAxSubItem

接口定义:

public interface IAxSubItem : PluginEngine.Interface.IAxPlugin
{
/// 子菜单的笔墨
string Caption { get; }
/// 子菜单所属的类别
string Category { get; }
/// 子菜单称呼
string Name { get; }
/// 子菜单宽度
int Width { get; }
/// 子菜单产生是触发的体例
/// <param name="hook">框架工具</param>
int Visible { get; } //-1-Never, 0-OnlyInCustomizing, 1-Always

void OnCreate(IAxApplication hook);
}

IAxSubItem这个接话柄际上是个容器接口,在终究加载这个插件的时候,投止于其之上的其他插件工具都经由过程XML建设文件有所记录。


6、视图插件 IAxContentsView

接口定义:

public interface IAxContentsView : PluginEngine.Interface.IAxPlugin
{

/// 位图
int Bitmap { get; }
/// 句柄
int hWnd { get; }
/// 称呼
string Name { get; }
/// 题目
string Caption { get; }
/// 子控件
System.Windows.Forms.Control ObjecthWnd{ get; }
/// 是不是可见
bool Visible { get; set; }
/// 视图的页号
int Index { get; set; }
/// 视图以后挑选的工具

object SelectedItem { get; }
/// OnCreate
void OnCreate(IAxApplication hook);
/// Refresh
void Refresh();

------分开线----------------------------
标签(Tag):Arcgis
------分开线----------------------------
保举内容
猜你感兴趣