亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用OpenLayers3 添加地圖鼠標右鍵菜單

2019-11-20 10:53:52
字體:
來源:轉載
供稿:網友

添加右鍵菜單,首先我們要監聽鼠標右鍵點擊的操作,我們知道鼠標右鍵事件名是 contextmenu,當鼠標在 html 元素之上,點擊鼠標右鍵,便會觸發 contextmenu 事件,在 contextmenu 事件的回調函數中實現相應的顯示菜單功能即可。

      那么在 openlayers 中,在地圖中添加這個事件,我們從哪里下手呢?首先我們得了解 openlayers 的初始化頁面的過程。

openlayers 初始化頁面過程

      openlayers 也是一個前端庫,那么它肯定離不開 html 的運用,比如,我們首先需要在頁面放置一個顯示地圖的 html 元素,一個 div 元素(假設其 id 屬性設置為 “map”,后面簡稱為 map div),然后在地圖初始化的時候指定這個元素,openlayers 會首先在這個元素中創建一個 class 為 ol-viewport 的 div 元素,其尺寸保持與 map div 相同,然后在 ol-viewport div 中創建一個 canvas 元素,在這個 canvas 元素中渲染請求到的地圖;其次,還會添加一個 class 為 ol-overlaycontainer 的 div 元素,用來放置 overlay;最后,添加一個 class 為 ol-overlaycontainer-stopevent 的 div 元素,主要是放置 openlayers 的控件,上一篇添加 自定義擴展控件 的文章開篇有講過,這里不是重點,我們不詳細介紹了。

最后形成的 html dom 結構如下圖:

形成的DOM結構

圖1 形成的DOM結構

      我們會想到在這個 map div 元素添加事件,然后右鍵彈出菜單,這個想法很自然,也確實可以實現,然而我們要想到后面的事情,至少對事情有一個全局的認識再下手,我們顯示出菜單后,往往是要根據相應的地圖所在位置進行一定的操作,那么我們的 contextmenu 的事件對象包含發生點擊的屏幕坐標,但是如何根據屏幕坐標獲得地圖中的相應坐標系下的坐標將會比較困難。

困難在哪里呢?主要有以下的三點:

首先,事件對象所含的坐標是相對于整個瀏覽器的視口、頁面或者整個屏幕的;
其次,而顯示地圖的元素往往又是隨意的大小和位置;
最后,屏幕的坐標系和地圖的坐標系又往往完全不同,如何將相對與地圖元素的坐標再轉化為地圖坐標系下的坐標?

      首先,我們需要獲得事件坐標相對于 map div (包含地圖的元素)的坐標,然后將相對于 map div 的坐標轉化為地圖中的實際坐標。第一步中,我們可以通過計算獲得,但是第二步必須通過 openlayers 來完成,因為只有 openlayers 對地圖的坐標系最清楚,這在 openlayers 中也有相關的功能。慶幸的是,openlayers 中我們可以一步完成上述操作,只需要一個函數:map.getEventCoordinate(event),在下面的具體實現中,我會詳細講到這個函數。

下面我們看看具體如何實現吧。

鼠標右鍵菜單具體實現

為了方便,文章中的代碼使用了 JQuery。

文章中的實例完整代碼可以到我的 GitHub 中查看或者下載,有用的話別忘了點一下 star。

下面我們一步一步地添加右鍵菜單功能,我們分為三步:

對 html 元素添加 contextmenu 事件;

獲取地圖相應的點擊坐標;

地圖相應位置添加菜單 。

對 html 元素添加 contextmenu 事件

      html 元素的鼠標右鍵事件名為 contextmenu,這個事件所有主流瀏覽器都支持,這里不要混淆 html 新增的屬性 contextmenu,這個屬性目前只有 firefox 支持,我們只是使用 oncontextmenu 這個事件。對包含地圖的任何 html 元素綁定這個事件都可以,openlayers 會處理坐標轉換這些問題。如下,map.getViewport() 會返回 openlayers 初始化頁面時創建的 class 為 ol-viewport 的 div 元素,也就是直接包含地圖的元素。因為瀏覽器都有默認的右鍵菜單,所以我們要取消默認的菜單,只要調用 e.preventDefault(); 即可:

$(map.getViewport()).on("contextmenu", function(event){  e.preventDefault();  // 書寫事件觸發后的函數});

獲取地圖相應的點擊坐標

獲取地圖相應的點擊坐標只需要一句即可,如下,

var coordinate = map.getEventCoordinate(event);

      函數參數是 oncontextmenu 對應的事件對象,該函數包含對 map.getCoordinateFromPixel() 的調用,map.getCoordinateFromPixel() 參數為 ol.pixel,是一個坐標,數組格式[x, y],其實現中又調用了 ol.vec.Mat4.multVec2(),該函數完成處理坐標轉換的實際工作。

地圖相應位置添加菜單

      這里我們結合 overlay 添加菜單,之前的文章介紹過 overlay,這里就不再具體展開了。首先,我們在 html 頁面添加一個目錄,具體的 css 樣式可以自己設定,想看完整源碼的可以到我的 GitHub 中查看或者下載完整的代碼:

<div id="contextmenu_container" class="contextmenu">  <ul>    <li><a href="#">設置中心</a></li>    <li><a href="#">添加地標</a></li>    <li><a href="#">距離丈量</a></li>  </ul></div>

使用這個 html 元素初始化一個 overlay,并將 overlay 添加到地圖中:

var menu_overlay = new ol.Overlay({  element: document.getElementById("contextmenu_container"),  positioning: 'center-center'});menu_overlay.setMap(map);

接下來,我們就可以在鼠標右鍵菜單的事件回調函數中,根據獲取的地圖坐標位置,設置 overlay 的顯示位置:

menu_overlay.setPosition(coordinate);

菜單隱藏

      當我們鼠標點擊右鍵,菜單出現,但是我們不能讓菜單總是顯示在地圖中,這時我們可以添加鼠標左鍵單擊,菜單消失功能,或者當選擇某項功能時,菜單消失。這個比較容易實現,只要一句便可以實現,放在鼠標左鍵事件的回調函數或者菜單功能執行函數中就行,如下:

menu_overlay.setPosition(undefined);

總結

      這篇文章中,主要講了 openlayers 初始化頁面地圖元素的過程,并介紹了在地圖上實現“鼠標右鍵菜單功能”,和隱藏菜單的實現。我們并沒有對菜單中的條目綁定事件,因為我們的重點在于實現右鍵菜單,對于菜單的條目要綁定什么功能,和普通的 javascript 事件綁定并無二致,所以沒有展開。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美va欧美va香蕉在| 538国产精品一区二区在线| 日韩av网站电影| 亚洲电影在线观看| 欧美亚洲国产成人精品| 91sao在线观看国产| 国产成人a亚洲精品| 欧美小视频在线观看| 韩国福利视频一区| 日韩欧美在线字幕| 亚洲天堂av电影| 最近2019年好看中文字幕视频| 欧美成人激情在线| 国产脚交av在线一区二区| 欧美丰满少妇xxxx| 久久成人精品一区二区三区| 国产69精品久久久久99| 亚洲色图欧美制服丝袜另类第一页| 亚洲午夜未删减在线观看| 亚洲区中文字幕| 日韩亚洲成人av在线| 久久亚洲精品网站| 最近2019年日本中文免费字幕| 欧美大人香蕉在线| 亚洲精品成人久久电影| 欧美在线视频一二三| 日韩电视剧免费观看网站| 高清一区二区三区四区五区| 欧美成人精品一区| 欧美大片在线影院| 久久影视电视剧免费网站| 丝袜亚洲另类欧美重口| 91精品久久久久久久久久另类| 97超级碰在线看视频免费在线看| 久久国产加勒比精品无码| 亚洲欧美日韩在线高清直播| 亚洲欧美中文字幕| 日本精品va在线观看| 国产精品一二三在线| 亚洲女人被黑人巨大进入| 日韩国产一区三区| 久久99亚洲热视| 久久香蕉国产线看观看av| 国a精品视频大全| www国产亚洲精品久久网站| 久热99视频在线观看| 色樱桃影院亚洲精品影院| 久久久久久久久国产| xxxxx成人.com| 精品国产一区二区三区久久狼5月| 日韩在线免费观看视频| 亚洲日本成人网| 色婷婷综合成人| 国产精品久久久av| 久久久久久久久久久av| 欧美肥臀大乳一区二区免费视频| 国产精品嫩草影院一区二区| 午夜美女久久久久爽久久| 97久久精品视频| 日韩欧美aⅴ综合网站发布| 中文字幕欧美日韩精品| 成人精品aaaa网站| 中文字幕九色91在线| 国产精品极品美女粉嫩高清在线| 国产999精品| 伊人亚洲福利一区二区三区| 久久久国产精品亚洲一区| 亚洲深夜福利网站| 日韩免费av在线| 日韩亚洲第一页| 黄色一区二区在线观看| 日韩精品视频在线免费观看| 中文字幕日韩精品在线观看| 日本视频久久久| 欧美激情精品久久久久久变态| 欧美综合一区第一页| 国产精品入口尤物| 欧美色另类天堂2015| 国产在线视频欧美| 欧美老少配视频| 91人成网站www| 国产精品福利网站| 国产一区av在线| 欧美自拍视频在线| 欧美激情网友自拍| 欧美激情在线一区| 欧美久久精品午夜青青大伊人| 久久视频这里只有精品| 91在线观看免费观看| 综合久久五月天| 欧美xxxx18性欧美| 国产精品久久色| 国色天香2019中文字幕在线观看| 97视频在线播放| 中文字幕精品一区二区精品| 亚洲爱爱爱爱爱| 欧美性开放视频| 91视频九色网站| 欧美一级淫片aaaaaaa视频| 91免费在线视频网站| 成人做爰www免费看视频网站| 中文字幕免费精品一区高清| 精品久久久久久久久久久久| 91在线看www| 中文字幕亚洲一区二区三区五十路| 欧美黑人国产人伦爽爽爽| 国产精品九九久久久久久久| 亚洲精品成人久久| 日韩风俗一区 二区| 狠狠久久亚洲欧美专区| 亚洲国产一区二区三区在线观看| 欧亚精品中文字幕| 永久免费看mv网站入口亚洲| 久久综合伊人77777尤物| 久久精品成人一区二区三区| 亚洲欧洲偷拍精品| 久久久久久久久网站| 日韩电影中文 亚洲精品乱码| 国语自产精品视频在线看一大j8| 欧洲成人免费aa| 成人精品福利视频| 亚洲精品国产精品乱码不99按摩| 日韩激情av在线免费观看| 九九久久精品一区| 不卡av电影院| 国产一区二区三区在线播放免费观看| 久久99热精品| 国产精品日韩一区| 91久久在线视频| 久久久久久久久久婷婷| 亚洲精品福利免费在线观看| 欧美日韩一区二区免费在线观看| 国产伊人精品在线| 国产精品第10页| 亚洲精品自拍偷拍| 国产精品一区二区性色av| 精品激情国产视频| 欧美视频在线视频| 亚洲第一视频网站| 国产视频亚洲精品| 日韩人体视频一二区| 日韩网站免费观看| 国产欧美 在线欧美| 免费99精品国产自在在线| 久久精品中文字幕免费mv| 亚洲全黄一级网站| 精品动漫一区二区三区| 97在线观看免费| 欧美激情第三页| 在线亚洲午夜片av大片| 红桃视频成人在线观看| 国产精品福利网| 海角国产乱辈乱精品视频| 欧美成人精品三级在线观看| 国产一区二区三区在线观看网站| 国产成人激情小视频| 国产精品人人做人人爽| 中文字幕日韩欧美| 欧美在线视频网| 欧美在线不卡区| 亚洲欧美国产高清va在线播| 国产精品视频不卡| 久久视频在线看| 91久久久久久久|