3S基础知识:MapInfo MapX中如何保存专题地图

  众所周知,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)本身和数据库连接有关,有时候不能自动恢复,因此需要进行手动的恢复操作,即最后一句代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值