MapXtreme是MapInfo公司推出的一个组件,用它可以开发桌面地理信息系统,也可以开发在浏览器上阅读的网络地理信息系统。
由于工作需要,笔者最近开始使用MapXtreme进行网络方面的工作。我把使用过程中的点滴感想写到这里,和对MapXtreme感兴趣的朋友共同交流,也请朋友们指出我的谬误。
MapXtreme资源:
可以从
www.mapinfo.com.cn网站下载MapXtreme的试用版以及相关文档。
MapXtreme2005中的控件可以分两大类:1。Windows窗体控件,可用于桌面开发;2。Web页面控件,可用于网络开发。对于 Web页面控件又可以分成两类,一类在MapInfo.Web.UI.WebControls名字空间中,一类在MapInfo.WebControls 名字空间中。前者在MapXtreme2004中就有,后者是新增加的,两者虽然都可用于Web页面开发,但使用时的还是有一定的差别,所以,这两类属于不同名字空间的控件最好不要混用。但是,显示图元属性的info工具(在MapInfo Professional中,标有字母i的按钮就是info工具)只存在于MapInfo.Web.UI.WebControls中。对于 MapInfo.WebControls名字空间,info工具通常用选择点的工具PointSelectionTool控件代替。
MapInfo推荐使用MapInfo.WebControls。
1。WorkSpace Manager(工作空间管理器)和.mws文件
MapXtreme2005会为使用者自动安装一个名为WorkSpace Manager的工具,这个工具可以把若干个图层组织起来,生成一个扩展名是.mws的文件,这个文件就是工作空间文件。.mws文件对于 MapXtreme很重要,大多数情况下,向网页上加载地图,就是加载.mws文件。
对于WorkSpace大家并不陌生,MapInfo Professional(桌面)就可以生成WorkSpace文件,用于保存当前地图的状态和环境。所谓地图的状态和环境主要是指:地图由哪些图层组成、图元用什么符号表示、标签用什么字段表示,还有图例、专题图、查询文件等。不过MapInfo Professional生成的WorkSpace文件扩展名是.wor,并且.mws与.wor不能互换。
由此可知,要想在网页中载入MapInfo地图,就要用WorkSpace Manager对图层进行组织,生成.mws文件。
2。地图的别名(MapAlias)
对于MapInfo.WebControls,MapAlias是一个重要的属性,编程时,通常用MapAlias代表地图。MapAlias 是字串型,MapAlias中的字串就是地图的别名。地图的初始别名在WorkSpace Manager中指定。指定的方法:
打开WorkSpace Manager,在左边的图层管理窗口中已经存在默认的地图别名Map1,选中Map1,点右键弹出快捷菜单,菜单中就有更改地图名称的命令。
3。在网页中载入地图
使用Microsoft Visual Studio的Visual C#开发环境。
向网页加载地图分设计时加载和运行时加载。
3.1。设计时加载
如果用MapInfo.Web.UI.WebControls,把地图控件拉入Web窗体后,点右键打开控件的属性窗口,从这里加载.mws文件。
用MapInfo.WebControls,把地图控件拉入Web窗体后,MapXtreme会自动在Web.config文件中写入加载.mws文件的配置语句:
如果你的.mws文件以及相关的.tab、.dat等MapInfo地图文件都放在当前开发的站点目录下,那么value自动加载.mws文件;如果当前站点没有.mws文件,value自动加载MapXtreme所带的
示例工作空间World.mws,就如上边的语句
所示。这时你就要手动修改value值,把你想加载的工作空间路径及文件名写进去。
再把放大、缩小、移动等工具控件拉入Web窗体,编译生成.dll文件,一个最简单的网络地理信息系统就可以运行了。
这一条语句可以加载多个工作空间,只要在不同的工作空间之间用分号分隔开就行了。不过要注意的是,各个工作空间中地图的别名不要重名,以免引出错误。
3.2。运行时加载
对于MapInfo.Web.UI.Webcontrols,可使用如下例程(C#):
private void Page_Load(object sender, System.EventArgs e)//这是页面载入事件函数
{
if (!Page.IsPostBack) {
MapInfo.Engine.Session.Current.MapFactory.Remove(MapControl1.MapAlias);
MapInfo.Engine.Session.Current.MapFactory.CreateEmptyMap(MapControl1.MapAlias, MapControl1.MapAlias, new Size(200,200));
MapInfo.Mapping.MapLoader ml = MapInfo.Mapping.MapLoader.CreateFromFile(@"World.tab");
//为地图指定新的会话
MapInfo.Mapping.Map map = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
if (map != null) {
ml.Load(map);
MapControl1.Map = map;
}
}
}
4。状态管理(StateManager)
MapXtreme 2005说,如果要为所使用的工具添加其它交互用法,那就要编写状态管理程序。状态管理程序要继承StateManager类,这个类属于MapInfo.WebControls名字空间。但是,MapXtreme 2004没有这个类。