另外有一个问题也困扰我一段时间,就是如何设置中心坐标的问题.我希望得到的效果是:当打开地图时,不是定位到地图的左上角,我是希望定位到地图的中心,但是我不明白这一句:mapbuilder.outputMap(new Point(-100, 65), 1);这时里面的值是怎么设置的,如果我的地图的长度*宽度为1995*1433,那么是否可以这样设置:mapbuilder.outputMap(new Point(997, 716), 1);这样设置后,是否可以定位到我的地图的中心呢??
然后我们对这段代码进行逐行分析:
8:用参数zoomLevel构造一个Zoom对象,从而定义了一个比例模型,可以猜测就是用这个比例模型来构造地图的。后面的代码会证实这个猜测是对的。
9:这里点对象取得对应的坐标对象---point.getCoord(),这个时候其实也很容易猜测是把这个坐标作为客户端显示的中心坐标。
注:特别注意这里是客户端显示的中心坐标,而并不代表这是整个地图的中心坐标,因为某个地图的中心坐标是固定的,不能进行设置的。 10:这里证实了我们上面的猜想,把刚才构造得到的Zoom对象设置到地图。
11:同样把我们得到的坐标设置为地图的显示中心坐标。
另:至于给地图设置了对应的比例模型Zoom对象和显示中心坐标centerCoord后地图怎么就会按照这样的比例并且以这个坐标为中心显示不是本文关心的,具体可以查阅mapModel相关代码,我们这里假定信任mapModel的代码可以实现它们!
12:设置地图默认的中心坐标和比例模型,你可能会有疑问:刚才已经设置了这两个属性,为什么还要在这里设置默认的呢?其实设置默认的这两个参数和上面分别设置这两个参数是有如下两点区别的:
a. 当分别设置这两个参数时,mapModel会通知监听器 (Listener)让指定的绘图类重绘地图。(当然如果是第一次调用就不能称之为重绘,而是绘制,这里这样措辞是为了表示设置时具有重绘的特征)而设置默认的两个参数时并不会通知监听器,只是纯粹实现在外部修改(设置)这两个参数的功能。
b.当调用mapModel的重置方法(reset)时,mapModel会根据设置的默认参数来重绘地图,而并不再理会当初分别设置的这两个参数。
为什么存在两种方式是显而易见的,设置默认参数是因为地图一般会设定一个初始化或者默认情况下的中心坐标,需要记录下来并且在整个应用过程中一般不可能会改变,更多的是为了记录下这个信息;而分别设置这两个参数更象是对地图对象的一种外力,驱使地图把当前的中心点或者比例调整到输入的参数,并且马上就通知监听器把地图按照我当前的要求绘制出来。其实利用默认参数进行重置操作的时候也是调用的分别设置的方法来完成地图重新绘制的。这两者的关系的联系和区别是很重要的,需要重点理解。
13:为当前地图创建一个地图面板部件,初始化时为地图附加一些监听事件,并把自己绑定在其上,在事件发生的时候为地图做一系列的工作,其中最重要的就是绘制地图。
14:绘制地图。
15:为当前地图创建一个工具部件,主要用于工具栏的绘制等工作。
16:绘制工具栏。
注:在上面我们说到在10,11步中会绘制地图,但在这两步的时候地图还没有进行第13步的绑定一个地图面板部件,即并没有在监听器中加入对绘制地图的监听事件,所以其实是不会绘制的。(具体原理可以参见监听类)
分析到这里答案已经很明显了,只要把你需要设置的中心点坐标(Coordinate)以点(Point)的形式连同比例模型(Zoom)以级别(Level)的形式传给outputMap方法。
至于问题中举的例子,我想需要结合
MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 这篇文章中提到的MapModel.bound也就是地图的坐标范围的概念搞清楚它和点或者坐标在的图上显示与其的关系。这篇文章里面详细讲解了地图上的地物(当然包括点)都是根据这个bound坐标范围来确定的。你问的问题虽然给出了地图的大小但是并没有指定地图的坐标系,所以是不能确定怎么样定中心点的。
还是按照你上面的例子,如果定义MapModel.bound = new Bound(0, 1995e16, 0, 1433e16),那么照你的方式设置mapbuilder.outputMap(new Point(997, 716), 1);是会在中心坐标的。(如果精确一点应该是设置为mapbuilder.outputMap(new Point(997.5, 716.5), 1);)
如果把坐标系改变,设置为更常用的MapModel.bound = new Bound(-997.5e16, 997.5e16, -716.5e16, 716.0e16)的形式,这个时候要把地图中心点作为显示的中心点应该这样设置:mapbuilder.outputMap(new Point(0, 0), 1);
注:点对象(Point)与坐标对象(Coordinate)之间的参数数值为e16倍的关系,也就是坐标系的和地物之间的精确度差e16倍。下面给出点对对象的源代码,可能更容易理解,以免混淆。注意观察第三行代码。
如
1function Point(x, y) {
2
3 this.coord = new Coordinate(x * 1e16, y * 1e16);
4
5 this.getCoord = function() {
6 return this.coord;
7 }
8
9 this.setCoord = function(coord) {
10 this.coord = coord;
11 }
12
13 /**//**
14 * 计算两点间距离
15 */
16 this.countDistance = function(point) {
17 var distance = Math.sqrt(Math.pow(this.coord.x - point.getCoord().x, 2) + Math.pow(this.coord.y - point.getCoord().y, 2));
18 return distance;
19 }
20} 我想到此问题也就自然解开了,还是希望这篇文章对你有所帮助!
posted on 2007-03-07 00:09
cresposhi 阅读(3671)
评论(4) 编辑 收藏