能否在放大缩小事件中动态添加MapType

4 views
Skip to first unread message

gis...@gmail.com

unread,
Feb 5, 2007, 12:21:29 AM2/5/07
to MapEasy
当前只有一个基本的继承自MapType的地图类型,还有一个地图类型想在第一个地图放大到第N级时动态添加, 到其他级就删除,使用了下列代码,但不
起作用,不知是不行还是需要配备其他操作?

/**
* 地图放大
*/
this.zoomin = function() {
var level = this.model.getZoom().getLevel();
if (level < MapModel.maxZoomLevel) {
this.model.setZoom(new Zoom(level + 1));
// if(level+1 == SatelliteLevel)
// {
//
// if(MapModel.mapTypes.length == 1)
// {
// MapModel.mapTypes.push(new YTSMapType());
// }
//
// }
// else
// {
//
// if(MapModel.mapTypes.length == 2)
// {
// MapModel.mapTypes.pop();
// }
//
// }
}
}

crespo

unread,
Feb 6, 2007, 1:18:10 AM2/6/07
to MapEasy
你的问题在于虽然设置了地图的mapTypes数组,但并没有制定当前地图crrentMapType,而且最重要的是你并没有告知监听器你已经更改了
maptype。
修改的步骤包括:
1。设置地图模型的maptypes
2。设置当前地图crrentMapType(不设置肯定会出错,比较容易漏掉)
3。告知监听器已经修改了maptype。(可以告知mapmodel自身,也可以以command方式通知)
实现的方式很多,下面结合你的思路对代码简单修改,避免修改mapeasy核心对象方法。

/**
* 地图放大
*/
this.zoomin = function() {
var level = this.model.getZoom().getLevel();
if (level < MapModel.maxZoomLevel) {

//SatelliteLevel表示临界级别,判断只在通过这个级别的时候通知监听器修改了maptype,从而
减少不必要的操作
if(level+1 == SatelliteLevel){
//当只有一个地图类型时,其实放大操作不涉及
if(MapModel.mapTypes.length == 1){
MapModel.mapTypes.push(new Edushi2DMapType());
//当有两个地图类型时,缩小操作不涉及
}else if(MapModel.mapTypes.length == 2){
this.model.setCurrentMapType(MapModel.mapTypes.length-2);
MapModel.mapTypes.pop();
}
//注意,在这里以command方式通知监听器修改了maptype,并设置了当前的地图类型。
command.exec("maptype",new
Array(this.model.getId(),this.model.currentMapType));
}
this.model.setZoom(new Zoom(level + 1));
}
}

缩小操作类似。
中间那段可以重构出来给放大和缩小方法共用。
因为为了达到不侵犯核心类,所以当通知监听器修改地图类型和设置了新的缩放级别时候会重复的画地图。解决的方法是对核心类进行简单修改,或者直接侵入修
改对象属性(不是调用setXXX(),getXXX)。

Tom Xu

unread,
Feb 6, 2007, 8:46:07 PM2/6/07
to MapEasy
太感谢了, 我试一下。

Tom Xu

unread,
Feb 6, 2007, 9:28:49 PM2/6/07
to MapEasy
看来设计模式还是要加强一下, 看了一些资料,但用的时候还是经常会忽视了.
Reply all
Reply to author
Forward
0 new messages