随笔 - 81  文章 - 1033  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

在浮躁的年代里,我们进取心太切,患得患失;虚荣心太强,战战兢兢。一心争强好胜,惟恐榜上无名。
I think I can fly , and flying like a bird !
程序员一名,已售出,缺货中!

我的邮件联系方式

用且仅用于MSN

博客点击率
free web counter
free web counter

常用链接

留言簿(36)

随笔档案

搜索

  •  

积分与排名

  • 积分 - 186168
  • 排名 - 309

最新评论

阅读排行榜

评论排行榜

    算是校友的Tom兄在MapEasy的Google Group中提问“能否在放大缩小事件中动态添加MapType?”,并给出了自己用来实现此功能的代码片段,但是无法达到想要的效果。下面根据Tom兄的代码进行分析,并给出一种实现方式,希望给其他需要的朋友一个借鉴。

    Tom兄代码(声明:下面代码的相关权益完全归Tom Xu所有):

 1 /**
 2  * 地图放大
 3  */
 4 this.zoomin = function() {
 5     var level = this.model.getZoom().getLevel();
 6     if (level < MapModel.maxZoomLevel) {
 7         this.model.setZoom(new Zoom(level + 1));
 8 //    if(level+1 == SatelliteLevel)
 9 //    {
10 //      if(MapModel.mapTypes.length == 1)
11 //        {
12 //            MapModel.mapTypes.push(new YTSMapType());
13 //        }
14 //    }
15 //    else
16 //    {
17 //        if(MapModel.mapTypes.length == 2)
18 //        {
19 //            MapModel.mapTypes.pop();
20 //        }
21 //    }
22     }
23 

    Tom兄原帖:
    当前只有一个基本的继承自MapType的地图类型,还有一个地图类型想在第一个地图放大到第N级时动态添加, 到其他级就删除,使用了下列代码,但不起作用,不知是不行还是需要配备其他操作?

    在Tom兄的代码中把地图放大的方法做了扩展,加入了判断现在缩放的级别是否和设定好的级别一致,如果一致则添加一个地图类型,否则把地图类型弹出。在此过程中加入了容错,判断现在mapTypes数组中地图类型个数是否正确。

    Tom兄的想法完全是正确的,在zoomin方法中直接设置maptype也是很优雅的实现方式,避免了修改mapeasy核心类,但是却忽略了一个很重要的步骤。我在一种更普遍的情况下(当大于一个给定级别时不显示,小于这个给定级别时候显示)给出我修改后的代码,并做一些说明。

 1 /**
 2  * 地图放大
 3  */
 4 this.zoomin = function() {
 5         var level = this.model.getZoom().getLevel();
 6         if (level < MapModel.maxZoomLevel) {
 7             //SatelliteLevel表示临界级别,判断只在通过这个级别的时候通知监听器修改了maptype,从而
 8减少不必要的操作
 9                 if(level+1 == SatelliteLevel){
10                         //当只有一个地图类型时,其实放大操作不涉及
11                         if(MapModel.mapTypes.length == 1){
12                                 MapModel.mapTypes.push(new Edushi2DMapType());
13                         //当有两个地图类型时,缩小操作不涉及
14                         }else if(MapModel.mapTypes.length == 2){
15                                 this.model.setCurrentMapType(MapModel.mapTypes.length-2);
16                                 MapModel.mapTypes.pop();
17                         }
18                         //注意,在这里以command方式通知监听器修改了maptype,并设置了当前的地图类型。
19                    command.exec("maptype",new Array(this.model.getId(), this.model.currentMapType));
20                }
21                this.model.setZoom(new Zoom(level + 1));
22        }
23
24

    缩小操作类似。中间那段可以重构出来给放大和缩小方法共用。

    因为为了不侵犯核心类,所以当通知监听器修改地图类型和设置了新的缩放级别时候会重复的画地图。解决的方法是对核心类进行简单修改,或者直接侵入修改对象属性(不是调用setXXX(),getXXX())。

    大家可以仔细琢磨MapEasy中的两种监听者的方式,一种是地图模型本身继承监听类,实现监听,完成自身的方法修改某些属性的监听功能;另一种即为非常有用的command方式的监听者,可以在Action中加入监听,从而在外部调用监听方法。

    监听器几乎是MapEasy完成绝大多数用户交互的灵魂,请大家务必精读相关代码!
posted on 2007-02-06 16:53 cresposhi 阅读(2475) 评论(6)  编辑  收藏

FeedBack:
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2007-02-06 17:49 BeanSoft
不错, 大家都来分享一下, 很快就能壮大!  回复  更多评论
  
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2007-02-06 20:54 梅颖
四月肥?
  回复  更多评论
  
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2007-02-06 22:34 施伟
是啊,需要大家都来分享。再次感谢beansoft兄贡献的好想法  回复  更多评论
  
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2007-02-07 10:50 梅颖
我也想贡献哈  回复  更多评论
  
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2008-01-22 15:00 longlong
我有两个MapType,一个是WMSMapType,一个是RSMapType,分别是矢量地图和影像地图,单独的情况下都能显示,现在我想做他们的叠加,怎么做呢?

  回复  更多评论
  
# re: MapEasy答疑(一) 能否在放大缩小事件中动态添加MapType 2009-03-01 14:46 深圳夜
高人,MAPEASY在移动过程中占用非常多的内存,怎么解决呀。
我QQ491560009  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问