隨筆 - 81  文章 - 1033  trackbacks - 0
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          在浮躁的年代里,我們進(jìn)取心太切,患得患失;虛榮心太強(qiáng),戰(zhàn)戰(zhàn)兢兢。一心爭(zhēng)強(qiáng)好勝,惟恐榜上無名。
          I think I can fly , and flying like a bird !
          程序員一名,已售出,缺貨中!

          我的郵件聯(lián)系方式

          用且僅用于MSN

          博客點(diǎn)擊率
          free web counter
          free web counter

          常用鏈接

          留言簿(36)

          隨筆檔案

          搜索

          •  

          積分與排名

          • 積分 - 187516
          • 排名 - 309

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          作者:施偉,原文出處: http://www.aygfsteel.com/crespo9907/archive/2007/03/05/mapeasy_answer5.html,轉(zhuǎn)載請(qǐng)保留。

          ????yzhrain在論壇中寫道:

          ??????非常感謝你的指導(dǎo)!

          ??????另外有一個(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è)置后,是否可以定位到我的地圖的中心呢??
          ?
          ??????再次感謝MapEasy的各位大俠,祝愿MapEasy越做越好!


          ??????指導(dǎo)確實(shí)不敢當(dāng),互相交流提高罷了。yzhrain既然提到了這個(gè)中心坐標(biāo)的問題,并且也寫到了中心坐標(biāo)的設(shè)置是由mapbuilder.outputMap(point, level)這個(gè)方法來設(shè)定的,其實(shí)思路是正確的,我們就來詳細(xì)的分析一下outputMap這個(gè)方法的源代碼,問題也就自然明晰了。

          ??????首先請(qǐng)看outputMap方法:

          ?1????/**
          ?2?????*?定位中心點(diǎn)和縮放比例并輸出地圖
          ?3?????*
          ?4?????*?@param?point?默認(rèn)顯示區(qū)域中心點(diǎn)
          ?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????}

          ??????然后我們對(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ì)象的源代碼,可能更容易理解,以免混淆。注意觀察第三行代碼。

          ?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?????*?計(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)  編輯  收藏

          FeedBack:
          # re: MapEasy答疑(五) 中心坐標(biāo)設(shè)置問題 2007-03-12 12:03 穎穎
          沒有人回復(fù)?呵呵,應(yīng)該都去研究問題了吧,我在這里支持哈你,雖然你都沒有幫我解決哈問題。  回復(fù)  更多評(píng)論
            
          # re: MapEasy答疑(五) 中心坐標(biāo)設(shè)置問題 2007-04-23 10:38 愛才天涯
          假設(shè)在地圖上有了幾個(gè)標(biāo)注的點(diǎn), 重繪地圖之后,還要執(zhí)行加點(diǎn)的操作,有沒有更好的辦法呢? 就象移動(dòng)鼠標(biāo)之后一樣,不需要再加點(diǎn)……
          像鷹眼的功能……
          http://www.kookou.cn  回復(fù)  更多評(píng)論
            
          # re: MapEasy答疑(五) 中心坐標(biāo)設(shè)置問題 2007-04-26 23:23 cresposhi
          @愛才天涯
          最近碰到些事情沒時(shí)間來回復(fù)blog,我還是不太明白你指的是什么意思,能不能詳細(xì)一點(diǎn)說明。  回復(fù)  更多評(píng)論
            
          # re: MapEasy答疑(五) 中心坐標(biāo)設(shè)置問題[未登錄] 2010-03-26 14:23 lynne
          怎么樣在地圖上劃線呢,mapeasy好像沒有提供出這個(gè)接口....  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 天峻县| 馆陶县| 武胜县| 平乡县| 循化| 南木林县| 潜江市| 葵青区| 太谷县| 汕尾市| 恭城| 博湖县| 甘南县| 双辽市| 文成县| 辽阳市| 抚顺县| 桐乡市| 东辽县| 阳高县| 永年县| 巴塘县| 南安市| 阿坝县| 乐至县| 临安市| 台安县| 高雄市| 黄梅县| 南平市| 波密县| 龙南县| 新宾| 宜昌市| 金塔县| 肇源县| 东乡族自治县| 新巴尔虎左旗| 渝中区| 岫岩| 和硕县|