日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openlayer右键菜单_使用OpenLayers3 添加地图鼠标右键菜单

發布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openlayer右键菜单_使用OpenLayers3 添加地图鼠标右键菜单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

添加右鍵菜單,首先我們要監聽鼠標右鍵點擊的操作,我們知道鼠標右鍵事件名是 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 結構如下圖:

圖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 中查看或者下載完整的代碼:

  • 設置中心
  • 添加地標
  • 距離丈量

使用這個 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 事件綁定并無二致,所以沒有展開。

總結

以上是生活随笔為你收集整理的openlayer右键菜单_使用OpenLayers3 添加地图鼠标右键菜单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.av在线.com | 不卡av电影在线观看 | 日本a级一区| 久久人人人 | 日本丰满少妇一区二区三区 | 国产黄色一级 | 91视频大全 | 性av免费| 久久精品国产免费看久久精品 | 国产日韩精品电影 | 成人免费看片入口 | 成人看的视频 | 国产人妻一区二区三区四区五区六 | 欧美v亚洲 | 亚洲成人精 | 国产久久精品 | 99久久国 | 91久久免费视频 | 性开放视频 | 福利资源在线 | 国产综合在线观看 | 久久亚洲精选 | 操日韩 | 国产调教视频在线观看 | www毛片com | 青娱乐在线视频观看 | 美女娇喘 | 无码人妻丰满熟妇奶水区码 | 99久久99久久精品国产片果冰 | av不卡高清| 黑人爱爱视频 | 中文字幕人成人乱码亚洲电影 | 国产偷啪 | 欧美激情天堂 | 少妇高清精品毛片在线视频 | 视频在线免费 | www.jizzjizz | 日本黄色动态图 | 黄色成年人| 国产一级做a爰片久久毛片男 | 欧美在线性 | 亚洲综合久久av | 亚洲网站在线免费观看 | 午夜影片 | 国产三级精品在线 | 精品自拍av| 特黄特色特刺激免费播放 | 国产精品久久欧美久久一区 | 香蕉视频最新网址 | 免费观看日韩av | 亚洲玖玖玖 | 黑鬼大战白妞高潮喷白浆 | av手机在线看 | av免费在线观看网站 | av男人的天堂av | 亚洲精品二区 | 日韩成人黄色片 | 亚洲成av人片在www色猫咪 | 精品国偷自产一区二区三区 | 高清不卡av | 少妇大叫太粗太大爽一区二区 | 欧美xxxx精品 | 韩毛片| 又黄又色| 日韩亚洲欧美一区二区三区 | 人人人爽 | 97福利网| 91免费看网站| 在线免费观看一区二区 | 加勒比伊人 | 久久久精品一区二区三区 | 亚洲精品久久久久久久久久久久久 | 中文字幕系列 | 精品欧美一区二区三区久久久 | 色多多av| 久久爱伊人| 高潮一区二区 | 2020国产精品 | 色涩综合 | 一级黄大片 | 成人午夜免费视频 | av资源新版在线天堂 | 少妇性bbb搡bbb爽爽爽欧美 | 精品动漫一区二区三区在线观看 | 亚洲视频二 | 久久艹这里只有精品 | 免费av一区二区三区 | 成人短视频在线播放 | 久青草免费视频 | 国产成人精品综合久久久久99 | 一本大道熟女人妻中文字幕在线 | 91精品国产aⅴ一区 黄色a网 | 超碰香蕉 | 亚洲一区二区三区在线免费观看 | 超清av在线 | 亚洲高清无码久久 | 日韩国产一级 | 寡妇高潮一级视频免费看 | 亚洲精品在线视频 |