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