OpenLayers 點擊顯示經緯度Demo

来源:https://www.cnblogs.com/smileZAZ/archive/2022/06/17/16386379.html
-Advertisement-
Play Games

這裡給大家分享我在OpenLayers 地圖開發工作中總結出的一下代碼和註意點,希望對大家有所幫助 效果如下: 核心代碼展示:附帶講解註釋 var map = new ol.Map({ // 初始化地圖 target: 'map',// 選擇地圖對象 layers: [ new ol.layer.T ...


這裡給大家分享我在OpenLayers 地圖開發工作中總結出的一下代碼和註意點,希望對大家有所幫助

效果如下:

核心代碼展示:附帶講解註釋

 var map = new ol.Map({ // 初始化地圖
            target: 'map',// 選擇地圖對象
            layers: [
                new ol.layer.Tile({// 初始化Tile外部圖層
                    source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                        url:
                            'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}', // XYZ切片服務地址
                        wrapX: false
                    })
                }),
                new ol.layer.Tile({// 初始化Tile外部圖層
                    source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                        url:
                            'http://t{0-7}.tianditu.com/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=5d27dc75ca0c3bdf34f657ffe1e9881d',// XYZ切片服務地址
                        wrapX: false
                    })
                })
            ],
            view: new ol.View({ 
                projection: 'EPSG:4326', //設置地圖坐標系
                center: [113.87, 22.691],//設置地圖中心點
                zoom: 12//設置地圖層級
            }),
        });
        const BGLayer = new ol.layer.Tile({// 初始化Tile外部圖層
            source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                url: 'http://t{0-7}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=5d27dc75ca0c3bdf34f657ffe1e9881d',// XYZ切片服務地址
                wrapX: false
            })
        })
        BGLayer.setVisible(false) //設置圖層顯示隱藏
        map.addLayer(BGLayer)//添加圖層
        //實例化矢量點要素,通過矢量圖層添加到地圖容器中
        //這樣就實現了預先載入圖文標註
        var iconFeature = new ol.Feature();
        //設置點要素樣式
        iconFeature.setStyle(createLabelStyle(iconFeature));
        //矢量標註的數據源
        var vectorSource = new ol.source.Vector({
            features: [iconFeature]
        });
        //矢量標註圖層
        var vectorLayer = new ol.layer.Vector({
            source: vectorSource
        });
        map.addLayer(vectorLayer);
        //矢量標註樣式設置函數,設置image為圖標ol.style.Icon
        function createLabelStyle(feature) {
            return new ol.style.Style({
                image: new ol.style.Icon({
                    anchor: [40, 42],
                    scale: 0.5, // 圖標縮小顯示
                    anchorOrigin: 'top-right', // 標註樣式的起點位置
                    anchorXUnits: 'pixels', // X方向單位:分數
                    anchorYUnits: 'pixels', // Y方向單位:像素
                    offsetOrigin: 'bottom-left', // 偏移起點位置的方向
                    opacity: 1, // 透明度
                    src: 'dian.png'  //圖標的URL
                }),
                text: new ol.style.Text({
                    textAlign: 'center',            //位置
                    textBaseline: 'middle',         //基準線
                    font: 'normal 14px 微軟雅黑',    //文字樣式
                    fill: new ol.style.Fill({       //文本填充樣式(即文字顏色)
                        color: '#000'
                    }),
                    stroke: new ol.style.Stroke({
                        color: '#F00',
                        width: 2
                    })
                })
            });
        }
        var newFeature = new ol.Feature({
            geometry: new ol.geom.Point([0,0])  //幾何信息
        });
        newFeature.setStyle(createLabelStyle(newFeature));      //設置要素樣式
        vectorSource.addFeature(newFeature);
        map.on('click', function (evt) {
            var coordinate = evt.coordinate;        //滑鼠單擊點的坐標
            //新建一個要素ol.Feature
            newFeature.set('geometry',new ol.geom.Point(coordinate))
            document.getElementsByClassName("list-box")[0].innerHTML = '<p> 經度:' + coordinate[0].toFixed(3) + '     緯度:' + coordinate[1].toFixed(3) + '</p>'
        });
        map.on('moveend', function (evt) {
            if (map.getView().getZoom() >= 16) {
                BGLayer.setVisible(true)
            } else {
                BGLayer.setVisible(false)
            }
        })

 點點陣圖片:

 完整demo代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" />
    <script type="text/javascript" src="https://openlayers.org/en/v5.3.0/build/ol.js"></script>
    <title>點擊出點位</title>
    <style>
        *{padding: 0;margin: 0}
        .list-box {
            width: 300px;
            height: 100px;
            background: white;
            box-sizing: border-box;
            padding: 20px;
            line-height: 60px;
            overflow: auto;
            position: fixed;
            right: 10px;
            top: 10px;
            z-index: 999;
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="map"></div>
    <div class="list-box">
    </div>
    <script>
        var map = new ol.Map({ // 初始化地圖
            target: 'map',// 選擇地圖對象
            layers: [
                new ol.layer.Tile({// 初始化Tile外部圖層
                    source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                        url:
                            'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}', // XYZ切片服務地址
                        wrapX: false
                    })
                }),
                new ol.layer.Tile({// 初始化Tile外部圖層
                    source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                        url:
                            'http://t{0-7}.tianditu.com/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=5d27dc75ca0c3bdf34f657ffe1e9881d',// XYZ切片服務地址
                        wrapX: false
                    })
                })
            ],
            view: new ol.View({ 
                projection: 'EPSG:4326', //設置地圖坐標系
                center: [113.87, 22.691],//設置地圖中心點
                zoom: 12//設置地圖層級
            }),
        });
        const BGLayer = new ol.layer.Tile({// 初始化Tile外部圖層
            source: new ol.source.XYZ({// 初始化XYZ切片服務圖層
                url: 'http://t{0-7}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=5d27dc75ca0c3bdf34f657ffe1e9881d',// XYZ切片服務地址
                wrapX: false
            })
        })
        BGLayer.setVisible(false) //設置圖層顯示隱藏
        map.addLayer(BGLayer)//添加圖層
        //實例化矢量點要素,通過矢量圖層添加到地圖容器中
        //這樣就實現了預先載入圖文標註
        var iconFeature = new ol.Feature();
        //設置點要素樣式
        iconFeature.setStyle(createLabelStyle(iconFeature));
        //矢量標註的數據源
        var vectorSource = new ol.source.Vector({
            features: [iconFeature]
        });
        //矢量標註圖層
        var vectorLayer = new ol.layer.Vector({
            source: vectorSource
        });
        map.addLayer(vectorLayer);
        //矢量標註樣式設置函數,設置image為圖標ol.style.Icon
        function createLabelStyle(feature) {
            return new ol.style.Style({
                image: new ol.style.Icon({
                    anchor: [40, 42],
                    scale: 0.5, // 圖標縮小顯示
                    anchorOrigin: 'top-right', // 標註樣式的起點位置
                    anchorXUnits: 'pixels', // X方向單位:分數
                    anchorYUnits: 'pixels', // Y方向單位:像素
                    offsetOrigin: 'bottom-left', // 偏移起點位置的方向
                    opacity: 1, // 透明度
                    src: 'dian.png'  //圖標的URL
                }),
                text: new ol.style.Text({
                    textAlign: 'center',            //位置
                    textBaseline: 'middle',         //基準線
                    font: 'normal 14px 微軟雅黑',    //文字樣式
                    fill: new ol.style.Fill({       //文本填充樣式(即文字顏色)
                        color: '#000'
                    }),
                    stroke: new ol.style.Stroke({
                        color: '#F00',
                        width: 2
                    })
                })
            });
        }
        var newFeature = new ol.Feature({
            geometry: new ol.geom.Point([0,0])  //幾何信息
        });
        newFeature.setStyle(createLabelStyle(newFeature));      //設置要素樣式
        vectorSource.addFeature(newFeature);
        map.on('click', function (evt) {
            var coordinate = evt.coordinate;        //滑鼠單擊點的坐標
            //新建一個要素ol.Feature
            newFeature.set('geometry',new ol.geom.Point(coordinate))
            document.getElementsByClassName("list-box")[0].innerHTML = '<p> 經度:' + coordinate[0].toFixed(3) + '     緯度:' + coordinate[1].toFixed(3) + '</p>'
        });
        map.on('moveend', function (evt) {
            if (map.getView().getZoom() >= 16) {
                BGLayer.setVisible(true)
            } else {
                BGLayer.setVisible(false)
            }
        })
    </script>
</body>

</html>

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 前言 開始搭建RK3568的基礎虛擬機,具備基本的通用功能,主要包含了串口工具minicom,遠程登陸ssh,遠程傳輸filezilla,代碼編輯工具vscode。 虛擬機 文檔對對虛擬機做了一些基本要求,如下圖: 為了儘量在前期減少錯誤,應選擇 ...
  • 下載證書 申請證書 證書下載 文件格式為: PEM格式的證書文件。 PEM格式的證書文件是採用Base64編碼的文本文件,您可以根據需要將證書文件修改成其他格式。 KEY格式的證書私鑰文件。 安裝證書 登錄Linux 證書上傳到伺服器 新建存放證書的目錄 mkdir /usr/local/nginx ...
  • CentOS目前官網提供的下載版本有6、7、8,最新的版本為8,不過個人推薦CentOS 7 的版本,因為相比較於最新版本,版本7更加地穩定。而相比於版本6,版本7新增了很多的功能。CentOS 7 是目前主流的版本,穩定成熟,是大多數伺服器首選的版本。話不多說,直入主題。 下載centos官方鏡像 ...
  • 唉。下麵是我花了不知道多少個小時踩過的所有坑總結出來的血淚史,希望能幫你們少踩一些坑吧,正常來講一步一步下來就不會出現任何問題了。 背景 用的是百度雲的雲伺服器(其他雲伺服器同理),系統是Ubuntu 20.04 LTS,Mysql版本8.0+,需求是在Windows上開發,可以隨時遠程連接讀寫服務 ...
  • 分享嘉賓:張政 京東 演算法工程師 編輯整理:AMS 周金星 出品平臺:DataFunTalk 導讀: 內容生態建設是近幾年互聯網快速發展的關鍵動因,也是AI化的重點方向之一。本文主要分享在京東廣告業務下內容理解體系的建設情況,從標簽化、內容準入、質量美學評價等多個角度探討內容理解能力的應用;同時整體 ...
  • SQL的函數 函數的定義 函數是指一段可以直接被另一段程式調用的程式或代碼; 字元串函數 MySQL常用的字元串函數 函數 功能 concat(s1,s2,···sN) 字元串拼接,將s1···sN拼接為一個字元串 lower(str) 將字元串str全部轉換為小寫 upper(str) 將字元串s ...
  • 華為應用內支付服務(In-App Purchases,IAP)為開發者提供便捷的應用內支付體驗和簡便的接入流程。開發者的應用集成IAP SDK後,調用IAP SDK介面,啟動IAP收銀台,即可實現應用內支付。在集成過程中,開發者可能會遇到報錯的問題,這時我們可以通過查找日誌中的tag的方法對問題快速 ...
  • 今天把平臺屬性的管理基本完成了,後臺管理做到現在基本也開始熟悉,確實就是對ElementUI的一個熟練程度。 一.平臺屬性管理 1.動態展示數據 先把介面弄好,應該在第三級標題選擇後進行發請求 靜態頁面搭建 渲染數據 屬性值列表,用到一個新組件 tag,並且這裡有多個屬性值,所以要遍歷,既然要在裡面 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...