全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
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)本身和数据库连接有关,有时候不能自动恢复,因此需要进行手动的恢复操作,即最后一句代码。