http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> MapInfo >> 正文

MapInfo MapX中如何保存专题地图

作者:rodger    文章来源:3snews.net    点击数:    更新时间:2006-11-18
摘要:
众所周知,MapInfo MapX是一个灵活的控件。尽管功能不是面面俱到,但凭借入门简单、易学易用的特性广受青睐,即使微软的DotNet大军压境,MapInfo也推出了基于DotNet的桌面开发组件,这却丝毫没有对MapX广泛的群众基础产生动摇。说这么多广告词的意思无非是告诉大家,我这篇文章不是老古董,因为很多东西有人还不了解。
MapX采用GST(GeoSet)组织地图数据,但作为一个直观的控件,需要避免前期掌握很多专业概念的障碍,因此MapX直接采用以地图为中心的概念体系,将地图直接放到控件中,从而绕开了复杂的数据加载和组织过程。但由此造成了很多问题,当入门用户正在为自己的程序中出现了地图而沾沾自喜的时候,他们不曾知道,后面还有一堆事情等着他们呢。数据绑定是一个在地图为中心概念中一个绕不过去的东西,也是MapX的一个难点,其实这样设计是把所有的数据看作一个来源来对待,整体结构简化了很多。只是,在多数时候,人们以为MapX实在是太简单了,简单到心想事成的地步,忘了自己所扮演的仍然是个开发者。
说得多了,GST文件本身采用一种自定义的文本格式来说明数据,这种文件中可以存很多内容,但由于没有数据源作为支持,以至于很多原先设计的内容无法实现。不过,这在后来的版本中得到了弥补。下面就是说我要说的如何进行弥补了。
其实,这个方法也不是针对GST文件来的,而是为了在Web上扩展应用得来的。Web服务器端运行控件用于导入数据导出图片的过程中,维护地图状态是非常重要的。因此,MapInfo 在MapX中提供了一个对象叫state的对象,这个对象的作用就是来缓存MapX中的对象和数据的。同时这个对象可以通过序列化和反序列化将对象导入到文件、流或者字符串中,实现地图状态的保存。
地图状态有很多,对于单一地图的最简单就是保存三要素:中心点坐标和视野。其他如图层集合、数据集合、专题图样式等等复杂对象虽然也需要保存,一般都是动态生成的,不需要永久保留(仅对MapX程序而言)。各种内容说得有点多,先来看看state对象的基本情况吧。
方法
 
  State.Save 保存对象
 State.Reset 重置对象
  State.Restore 恢复对象
  
 State.WriteToFile 将对象写入文件 
 State.ReadFromFile 从文件中读取对象
  
属性

  State.Stream  对象的序列化字符串(非明码)

可以看到这个对象非常简单,它可以存储各种类型包括简单类型的整型、字符串等,也可以是地图对象、数据集、图元、样式等等。来看下面一段代码,实现了专题地图的保存过程。
Private Sub Command1_Click()
Dim slayers As New MapXStateLib.State

Map1.GeoSet = "worldcap.gst"
Map1.DataSets.Add miDataSetLayer, Map1.Layers(1)
Map1.DataSets(1).Themes.Add miThemeIndividualValue, "Place_Name"

slayers.Save Map1.DataSets
slayers.Save Map1.Object
slayers.WriteToFile "test"

Map1.GeoSet = "ASIA.GST"

slayers.ReadFromFile "test"
slayers.Restore Map1.DataSets
slayers.Restore Map1.Object

Map1.DataSets.Restore "DataSet1", Map1.Layers(1)

End Sub
代码简单明了,不需要做太多说明,需要注意的有两点:
第一、state对象采用堆保存所有对象,提取对象无需严格按照保存的顺序恢复对象,但是不能多次恢复,否则会出错
第二、由于数据集(dataset)本身和数据库连接有关,有时候不能自动恢复,因此需要进行手动的恢复操作,即最后一句代码。

Tags:GIS,ArcSDE  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图