??????另外有一個問題也困擾我一段時間,就是如何設(shè)置中心坐標(biāo)的問題.我希望得到的效果是:當(dāng)打開地圖時,不是定位到地圖的左上角,我是希望定位到地圖的中心,但是我不明白這一句:mapbuilder.outputMap(new Point(-100, 65), 1);這時里面的值是怎么設(shè)置的,如果我的地圖的長度*寬度為1995*1433,那么是否可以這樣設(shè)置:mapbuilder.outputMap(new Point(997, 716), 1);這樣設(shè)置后,是否可以定位到我的地圖的中心呢??
?
??????然后我們對這段代碼進(jìn)行逐行分析:
??????8:用參數(shù)zoomLevel構(gòu)造一個Zoom對象,從而定義了一個比例模型,可以猜測就是用這個比例模型來構(gòu)造地圖的。后面的代碼會證實這個猜測是對的。
??????9:這里點對象取得對應(yīng)的坐標(biāo)對象---point.getCoord(),這個時候其實也很容易猜測是把這個坐標(biāo)作為客戶端顯示的中心坐標(biāo)。
注:特別注意這里是客戶端顯示的中心坐標(biāo),而并不代表這是整個地圖的中心坐標(biāo),因為某個地圖的中心坐標(biāo)是固定的,不能進(jìn)行設(shè)置的。??????10:這里證實了我們上面的猜想,把剛才構(gòu)造得到的Zoom對象設(shè)置到地圖。
??????11:同樣把我們得到的坐標(biāo)設(shè)置為地圖的顯示中心坐標(biāo)。
??????另:至于給地圖設(shè)置了對應(yīng)的比例模型Zoom對象和顯示中心坐標(biāo)centerCoord后地圖怎么就會按照這樣的比例并且以這個坐標(biāo)為中心顯示不是本文關(guān)心的,具體可以查閱mapModel相關(guān)代碼,我們這里假定信任mapModel的代碼可以實現(xiàn)它們!
??????12:設(shè)置地圖默認(rèn)的中心坐標(biāo)和比例模型,你可能會有疑問:剛才已經(jīng)設(shè)置了這兩個屬性,為什么還要在這里設(shè)置默認(rèn)的呢?其實設(shè)置默認(rèn)的這兩個參數(shù)和上面分別設(shè)置這兩個參數(shù)是有如下兩點區(qū)別的:
??????a.?當(dāng)分別設(shè)置這兩個參數(shù)時,mapModel會通知監(jiān)聽器?(Listener)讓指定的繪圖類重繪地圖。(當(dāng)然如果是第一次調(diào)用就不能稱之為重繪,而是繪制,這里這樣措辭是為了表示設(shè)置時具有重繪的特征)而設(shè)置默認(rèn)的兩個參數(shù)時并不會通知監(jiān)聽器,只是純粹實現(xiàn)在外部修改(設(shè)置)這兩個參數(shù)的功能。
??????b.當(dāng)調(diào)用mapModel的重置方法(reset)時,mapModel會根據(jù)設(shè)置的默認(rèn)參數(shù)來重繪地圖,而并不再理會當(dāng)初分別設(shè)置的這兩個參數(shù)。
??????為什么存在兩種方式是顯而易見的,設(shè)置默認(rèn)參數(shù)是因為地圖一般會設(shè)定一個初始化或者默認(rèn)情況下的中心坐標(biāo),需要記錄下來并且在整個應(yīng)用過程中一般不可能會改變,更多的是為了記錄下這個信息;而分別設(shè)置這兩個參數(shù)更象是對地圖對象的一種外力,驅(qū)使地圖把當(dāng)前的中心點或者比例調(diào)整到輸入的參數(shù),并且馬上就通知監(jiān)聽器把地圖按照我當(dāng)前的要求繪制出來。其實利用默認(rèn)參數(shù)進(jìn)行重置操作的時候也是調(diào)用的分別設(shè)置的方法來完成地圖重新繪制的。這兩者的關(guān)系的聯(lián)系和區(qū)別是很重要的,需要重點理解。
??????13:為當(dāng)前地圖創(chuàng)建一個地圖面板部件,初始化時為地圖附加一些監(jiān)聽事件,并把自己綁定在其上,在事件發(fā)生的時候為地圖做一系列的工作,其中最重要的就是繪制地圖。
??????14:繪制地圖。
??????15:為當(dāng)前地圖創(chuàng)建一個工具部件,主要用于工具欄的繪制等工作。
??????16:繪制工具欄。
注:在上面我們說到在10,11步中會繪制地圖,但在這兩步的時候地圖還沒有進(jìn)行第13步的綁定一個地圖面板部件,即并沒有在監(jiān)聽器中加入對繪制地圖的監(jiān)聽事件,所以其實是不會繪制的。(具體原理可以參見監(jiān)聽類)
??????分析到這里答案已經(jīng)很明顯了,只要把你需要設(shè)置的中心點坐標(biāo)(Coordinate)以點(Point)的形式連同比例模型(Zoom)以級別(Level)的形式傳給outputMap方法。
??????至于問題中舉的例子,我想需要結(jié)合
MapEasy答疑(三) row,column,level與瓦片顯示的關(guān)系【很多朋友反復(fù)問到的問題】 這篇文章中提到的MapModel.bound也就是地圖的坐標(biāo)范圍的概念搞清楚它和點或者坐標(biāo)在的圖上顯示與其的關(guān)系。這篇文章里面詳細(xì)講解了地圖上的地物(當(dāng)然包括點)都是根據(jù)這個bound坐標(biāo)范圍來確定的。你問的問題雖然給出了地圖的大小但是并沒有指定地圖的坐標(biāo)系,所以是不能確定怎么樣定中心點的。
??????還是按照你上面的例子,如果定義MapModel.bound = new Bound(0, 1995e16, 0, 1433e16),那么照你的方式設(shè)置mapbuilder.outputMap(new Point(997, 716), 1);是會在中心坐標(biāo)的。(如果精確一點應(yīng)該是設(shè)置為mapbuilder.outputMap(new Point(997.5, 716.5), 1);)
??????如果把坐標(biāo)系改變,設(shè)置為更常用的MapModel.bound = new Bound(-997.5e16, 997.5e16, -716.5e16, 716.0e16)的形式,這個時候要把地圖中心點作為顯示的中心點應(yīng)該這樣設(shè)置:mapbuilder.outputMap(new Point(0, 0), 1);
注:點對象(Point)與坐標(biāo)對象(Coordinate)之間的參數(shù)數(shù)值為e16倍的關(guān)系,也就是坐標(biāo)系的和地物之間的精確度差e16倍。下面給出點對對象的源代碼,可能更容易理解,以免混淆。注意觀察第三行代碼。
如
?1
function?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 閱讀(3679)
評論(4) 編輯 收藏