作者:施偉,原文出處: http://www.tkk7.com/crespo9907/archive/2007/03/05/mapeasy_answer5.html,轉載請保留。
????yzhrain在論壇中寫道:
??????非常感謝你的指導!
????yzhrain在論壇中寫道:
??????非常感謝你的指導!
??????另外有一個問題也困擾我一段時間,就是如何設置中心坐標的問題.我希望得到的效果是:當打開地圖時,不是定位到地圖的左上角,我是希望定位到地圖的中心,但是我不明白這一句:mapbuilder.outputMap(new Point(-100, 65), 1);這時里面的值是怎么設置的,如果我的地圖的長度*寬度為1995*1433,那么是否可以這樣設置:mapbuilder.outputMap(new Point(997, 716), 1);這樣設置后,是否可以定位到我的地圖的中心呢??
?
??????再次感謝MapEasy的各位大俠,祝愿MapEasy越做越好!
??????指導確實不敢當,互相交流提高罷了。yzhrain既然提到了這個中心坐標的問題,并且也寫到了中心坐標的設置是由mapbuilder.outputMap(point, level)這個方法來設定的,其實思路是正確的,我們就來詳細的分析一下outputMap這個方法的源代碼,問題也就自然明晰了。
??????首先請看outputMap方法:
??????指導確實不敢當,互相交流提高罷了。yzhrain既然提到了這個中心坐標的問題,并且也寫到了中心坐標的設置是由mapbuilder.outputMap(point, level)這個方法來設定的,其實思路是正確的,我們就來詳細的分析一下outputMap這個方法的源代碼,問題也就自然明晰了。
??????首先請看outputMap方法:
?1
????/**//**
?2
?????*?定位中心點和縮放比例并輸出地圖
?3
?????*
?4
?????*?@param?point?默認顯示區域中心點
?5
?????*?@param?zoomLevel?縮放比例
?6
?????*/
?7
????this.outputMap?=?function(point,?zoomLevel)?
{
?8
????????var?defaultZoom?=?new?Zoom(zoomLevel);
?9
????????var?centerCoord?=?point.getCoord();
10
????????this.mapModel.setZoom(defaultZoom);
11
????????this.mapModel.setViewerCenterCoord(centerCoord);
12
????????this.mapModel.setDefault(centerCoord,?defaultZoom);
13
????????var?mapPaneWidget?=?new?MapPaneWidget(this.mapModel);
14
????????mapPaneWidget.setContainer(this.container);
15
????????mapPaneWidget.paint();
16
????????//?工具欄
17
????????var?toolsWidget?=?new?ToolsWidget(this.mapModel);
18
????????toolsWidget.paint();
19
????}


?2

?3

?4

?5

?6

?7



?8

?9

10

11

12

13

14

15

16

17

18

19

??????然后我們對這段代碼進行逐行分析:
??????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倍。下面給出點對對象的源代碼,可能更容易理解,以免混淆。注意觀察第三行代碼。
如
?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
}



?2

?3

?4

?5



?6

?7

?8

?9



10

11

12

13


14

15

16



17

18

19

20

??????我想到此問題也就自然解開了,還是希望這篇文章對你有所幫助!