跌倒的马铃薯

 

MapXtreme2004的Web选择控件(二)

 

        前段时间写了一篇有关选择控件的随笔。主要分析了一下它的模型结构,这篇随笔将具体分析它的选择图层集合的一些问题。

公共的选择图层集合

Dim Mapcontrol1 as new mapcontrol
    
'Mapcontrol1. SelectableLayers 是一个只读的arraylist类型属性
Mapcontrol1. SelectableLayers.add(layerName) '添加可选择图层
Mapcontrol1. SelectableLayers.remove(layerName)'删除可选择图层

       在一个Web程序里面,所有的Mapcontrol(地图控件)实例都公用一个选择图层集合。当改变了任何一个Mapcontrol(地图控件)实例其中的选择图层集合内容都将影响到其他Mapcontrol(地图控件)实例的选择图层集合。这种实现有利的地方在于没有加载Mapcontrol(地图控件)的web页也能够对地图进行控制。比如有一个专门的地图图层加载页面,这样可以在加载时控制图层的可选择性;或者有一个配置页专门配置图层的可选择性。但是这对于一个web程序拥有多个Mapcontrol(地图控件)是有害的。他们的可选择图层设置将相互覆盖,引起一些莫名其妙的问题。要想解决此问题我们还需要更深入了解才行。

客户端的选择图层集合数据

    当浏览器请求完成后,Mapcontrol(地图控件)会将选择图层集合用脚本的形式写到客户端去。如下代码:

var _selectlayer = new MapInfoWebSelectLayer();
    _selectlayer.name 
= "图层一";
    _selectlayer.selectable 
= "False";
    _selectlayers_MapControl1.Layers[_selectlayers_MapControl1.Layers.length] 
= _selectlayer;
    
var _selectlayer = new MapInfoWebSelectLayer();
    _selectlayer.name 
= "图层二";
    _selectlayer.selectable 
= "True";
    _selectlayers_MapControl1.Layers[_selectlayers_MapControl1.Layers.length] 
= _selectlayer;
    
var _selectlayer = new MapInfoWebSelectLayer();
    _selectlayer.name 
= "图层三";
    _selectlayer.selectable 
= "True";
    _selectlayers_MapControl1.Layers[_selectlayers_MapControl1.Layers.length] 
= _selectlayer;



其中的selectable属性标识了图层是否可以选择。并且写到客户端的信息只包含加载的图层部分。这部分的数据到底有什么用呢?每当地图工具在地图上操作时,这些数据将回送到服务器端覆盖选择图层集合数据如下图中的(访问3部分)。


 

在这里需要非常注意的几点:

1.每次刷新,Mapcontrol(地图控件)都会将内存中最新的选择图层集合写到客户端去。

2.地图工具操作时会将保存在客户端的选择数据覆盖服务器端选择数据。

3.非地图工具操作时没有变化。图中的(访问2)

4.当已经打开了一个包含Mapcontrol的页面A,却要在另外一个没有Mapcontrol的页面B控制图层可选性或者是添加图层时,需要在B完成后刷新一下A,这时A上的最新选择图层集合才能写到客户端。不然A上的地图工具操作后将覆盖B的选择图层集合最新设置。

5.客户端也能够控制图层可选性,当然之后得使用地图工具刷新一下,而不是使用非地图工具。

6.程序一开始就将所有能选择的图层名放到选择图层集合是没有意义的。几番操作后将只剩下已经加载的图层了。

7.卸载图层时不需要在选择图层集合中删除,理由同6

从上图可以看出能够对地图图层可选性进行控制的几个切入点首先是包含地图控件的页面每次回送后,可以在服务端处理。其次是在(访问1)和(访问2)之间的 其他未包含地图控件页面内处理。最后是客户端脚本处理。不知道为什么Mapinfo的开发人员要使用如此怪异的方式来控制图层的可选性。大概是仅仅为了能够在客户端控制地图的可选性吧。

也许你看这还没有看明白怎么回事,毕竟我的水平有限。最后提供一个终极解决方案:将需要图层的选择集合保存到Session里面,在每次页面回送时再一项项写到Mapcontrol1. SelectableLayers里面。

posted on 2006-08-24 17:58  Ivan  阅读(1681)  评论(1编辑  收藏  举报

导航