基于AGS JS開發(fā)自定義貼圖圖層
1.前言
假設(shè)一個(gè)景區(qū)有多張圖片需要在地圖上展示,并且隨著地圖的縮放而縮放(不是單純的以氣泡來(lái)展示)。如果利用傳統(tǒng)方案,則是我們首先將圖片糾正賦予地理信息,然后根據(jù)地圖級(jí)別進(jìn)行切圖,最后以瓦片的形式疊加至地圖上,工作量是很大的。然而考慮到圖片本身不會(huì)太大(小于3M),那么有沒(méi)有其他方法來(lái)解決呢。這里我和大家一起探討幾種解決思路。
2.解決思路
2.1基于grahpic和symbol來(lái)解決
2.1.1思路描述
簡(jiǎn)單說(shuō)就是獲取圖片左上角和右下角對(duì)應(yīng)的地理坐標(biāo),給grahpic的geometry賦上左上角坐標(biāo),grahpic的symbol賦予圖片的url、以及通過(guò)地理坐標(biāo)轉(zhuǎn)換獲取到的兩點(diǎn)屏幕坐標(biāo)間的screenwidth和screenheight。這里尤其要注意symbol的xoffset和yoffset兩個(gè)屬性值需(+screenwidth/2,-screenheight/2)。最后監(jiān)聽(tīng)地圖的縮放事件,做相關(guān)的symbol的width和height計(jì)算即可。
2.1.2討論
優(yōu)勢(shì)是實(shí)現(xiàn)簡(jiǎn)單:
a.直接利用AGS已有對(duì)象完成。
b.不用考慮拖拽時(shí)的坐標(biāo)變化等。
劣勢(shì):當(dāng)?shù)貓D放大到一定級(jí)別,symbol的長(zhǎng)寬大過(guò)地圖屏幕范圍時(shí)則symbol將不再渲染。
2.2直接添加DIV+IMG來(lái)解決
2.2.1思路描述
直接在Map所在的ParentDIV中為圖片創(chuàng)建的DIV+IMG,原理與思路一相同,通過(guò)換算地理坐標(biāo)的屏幕坐標(biāo)來(lái)設(shè)置各IMG的長(zhǎng)寬以及DIV的left和top。這里尤其需要注意的是對(duì)地圖拖拽事件同樣需要監(jiān)聽(tīng)并進(jìn)行相關(guān)處理。
2.2.2討論
優(yōu)勢(shì):地圖縮放到任意級(jí)別都能同樣縮放展示圖片。
劣勢(shì):圖片本身無(wú)法響應(yīng)地圖事件,比如當(dāng)鼠標(biāo)在圖片上,縮放、拖拽均不能進(jìn)行。
2.3繼承AGS的Layer來(lái)自定義開發(fā)貼圖圖層
除需要繼承Layer外,其他思路與思路二沒(méi)有太大區(qū)別。但是可以規(guī)避思路一中圖片超過(guò)屏幕范圍無(wú)法顯示的問(wèn)題,也能規(guī)避思路二中的鼠標(biāo)在圖片上時(shí)無(wú)法進(jìn)行地圖操作的問(wèn)題。
2.4總結(jié)
考慮到思路一和思路二中的明顯劣勢(shì)問(wèn)題,采用思路三是更好的選擇。
3.詳細(xì)實(shí)現(xiàn)(繼承AGS的Layer開發(fā)貼圖圖層)
3.1繼承l(wèi)ayer重寫相關(guān)方法
在Map的DOM中新增一個(gè)DIV:

當(dāng)圖層從Map中去除時(shí)去掉所有監(jiān)聽(tīng)事件:

3.2監(jiān)聽(tīng)縮放事件進(jìn)行重繪
對(duì)于每一個(gè)IMG的width和height要根據(jù)目前四角坐標(biāo)對(duì)應(yīng)的屏幕坐標(biāo)進(jìn)行換算:

3.3監(jiān)聽(tīng)平移事件進(jìn)行坐標(biāo)變化

4.幾點(diǎn)注意
a.當(dāng)繼承的是Layer時(shí),setMap函數(shù)需要返回的必須是用DOJO生成的DIV。假如繼承的是GraphicLayer,返回的不能為DIV,因?yàn)镚rahpicLayer其是SVG構(gòu)造。
b.為提高顯示效率,平移重繪的最好方法是直接改變DIV的左上角位置,而不是對(duì)所有IMG進(jìn)行刪除再重新添加。
5.結(jié)果展示
以歸元寺為例子:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS中使用mailto實(shí)現(xiàn)將用戶在網(wǎng)頁(yè)中輸入的內(nèi)容傳遞到本地郵件客戶端
這篇文章主要介紹了mailto實(shí)現(xiàn)將用戶在網(wǎng)頁(yè)中輸入的內(nèi)容傳遞到本地郵件客戶端的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
微信小程序開發(fā)實(shí)現(xiàn)首頁(yè)彈框活動(dòng)引導(dǎo)功能
自己x實(shí)現(xiàn)的一個(gè)比較簡(jiǎn)單微信彈窗功能,主要就是教會(huì)大家對(duì)微信彈窗的用法和理解,這篇文章主要給大家介紹了關(guān)于微信小程序如何實(shí)現(xiàn)首頁(yè)彈框活動(dòng)引導(dǎo)功能的相關(guān)資料,需要的朋友可以參考下2021-08-08
在iFrame子頁(yè)面里實(shí)現(xiàn)模態(tài)框的方法
今天小編就為大家分享一篇在iFrame子頁(yè)面里實(shí)現(xiàn)模態(tài)框的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
關(guān)于在Typescript中做錯(cuò)誤處理的方式詳解
錯(cuò)誤處理是軟件工程重要的一部分,如果處理得當(dāng),它可以為你節(jié)省數(shù)小時(shí)的調(diào)試和故障排除時(shí)間,我發(fā)現(xiàn)了與錯(cuò)誤處理相關(guān)的三大疑難雜癥:TypeScript的錯(cuò)誤類型,變量范圍和嵌套,讓我們逐一深入了解它們帶來(lái)的撓頭問(wèn)題,感興趣的朋友可以參考下2023-09-09
Javascript HTML5 Canvas實(shí)現(xiàn)的一個(gè)畫板
這篇文章主要為大家詳細(xì)介紹了Javascript HTML5 Canvas實(shí)現(xiàn)的一個(gè)畫板的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能
這篇文章主要介紹了使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能,需要的朋友可以參考下2014-10-10
html5+javascript制作簡(jiǎn)易畫板附圖
這篇文章主要介紹了使用html5+javascript制作的簡(jiǎn)易畫板,需要的朋友可以參考下2014-04-04
JavaScript中的this原理及6種常見(jiàn)使用場(chǎng)景詳解
這篇文章主要介紹了JavaScript中的this原理及6種常見(jiàn)使用場(chǎng)景詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
JavaScript中關(guān)于數(shù)組的調(diào)用方式
這篇文章主要介紹了JavaScript中關(guān)于數(shù)組的調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

