百度地圖電子圍欄功能的實現

来源:https://www.cnblogs.com/CherishTheYouth/archive/2019/04/16/CherishTheYouth_20190416.html
-Advertisement-
Play Games

最近公司項目需求,要做一個百度地圖電子圍欄的功能,在網上查了一下資料,看了很多博客,大多數都寫的不是很詳細,我看的雲里霧裡的,最後終於集合所有的幾篇資料,自己做出了一個簡單的demo,下麵將過程記錄和分享一下,希望給予有需要同學一些幫助,我這個人說話比較啰嗦,所以寫的一定會很詳細的,哈哈!閑言少敘, ...


       最近公司項目需求,要做一個百度地圖電子圍欄的功能,在網上查了一下資料,看了很多博客,大多數都寫的不是很詳細,我看的雲里霧裡的,最後終於集合所有的幾篇資料,自己做出了一個簡單的demo,下麵將過程記錄和分享一下,希望給予有需要同學一些幫助,我這個人說話比較啰嗦,所以寫的一定會很詳細的,哈哈!閑言少敘,開始了。

本篇內容實現的過程中將會解決如下幾個問題:

(1)實現百度地圖滑鼠繪製多邊形功能;

(2)實現根據給定的坐標繪製多邊形的功能;

(3)判斷某個坐標點是否在繪製的區域內;

(4)繪製的坐標點如何在資料庫中保存;

下麵按照實際需求一步一步來講解和實現:

  • 1 實現多邊形繪製功能

1.1 從百度地圖官方庫下載滑鼠繪製多邊形功能demo

  如何繪製一個多邊形,我在看網上博客的時候,大部分人都是直接貼一堆代碼上來,我最開始一直迷迷糊糊,以為是別人自己寫的代碼,所以得逐句去讀,很煩。後來乾脆直接去官方文檔上去找,就來果然找到了,原來這個功能,百度地圖官方有現成的實現,直接copy那部分代碼就可以用。

1>百度搜百度地圖開放平臺>開發文檔>web開發>JavaScript API >示例DEMO >滑鼠示例 > 滑鼠繪製點線面

 

 

進入這個地方就可以看到示例代碼了,如下:

可以把中間的代碼複製到自己的html頁面中,更改一下百度密鑰,打開代碼就能看到效果了。

需要註意的是:改代碼中用到的幾個js文件,不要忘了添加。

代碼如下:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
    body, html{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";}
    #allmap {width: 100%; height:500px; overflow: hidden;}
    #result {width:100%;font-size:12px;}
    dl,dt,dd,ul,li{
        margin:0;
        padding:0;
        list-style:none;
    }
    p{font-size:12px;}
    dt{
        font-size:14px;
        font-family:"微軟雅黑";
        font-weight:bold;
        border-bottom:1px dotted #000;
        padding:5px 0 5px 5px;
        margin:5px 0;
    }
    dd{
        padding:5px 0 0 5px;
    }
    li{
        line-height:28px;
    }
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script>
    <!--載入滑鼠繪製工具-->
    <script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
    <link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
    <!--載入檢索信息視窗-->
    <script type="text/javascript" src="http://api.map.baidu.com/library/SearchInfoWindow/1.4/src/SearchInfoWindow_min.js"></script>
    <link rel="stylesheet" href="http://api.map.baidu.com/library/SearchInfoWindow/1.4/src/SearchInfoWindow_min.css" />
    <title>滑鼠繪製工具</title>
</head>
<body>
    <div id="allmap" style="overflow:hidden;zoom:1;position:relative;">    
        <div id="map" style="height:100%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;"></div>
    </div>
    <div id="result">
        <input type="button" value="獲取繪製的覆蓋物個數" onclick="alert(overlays.length)"/>
        <input type="button" value="清除所有覆蓋物" onclick="clearAll()"/>
    </div>
    <script type="text/javascript">
    // 百度地圖API功能
    var map = new BMap.Map('map');
    var poi = new BMap.Point(116.307852,40.057031);
    map.centerAndZoom(poi, 16);
    map.enableScrollWheelZoom();  
    var overlays = [];
    var overlaycomplete = function(e){
        overlays.push(e.overlay);
    };
    var styleOptions = {
        strokeColor:"red",    //邊線顏色。
        fillColor:"red",      //填充顏色。當參數為空時,圓形將沒有填充效果。
        strokeWeight: 3,       //邊線的寬度,以像素為單位。
        strokeOpacity: 0.8,       //邊線透明度,取值範圍0 - 1。
        fillOpacity: 0.6,      //填充的透明度,取值範圍0 - 1。
        strokeStyle: 'solid' //邊線的樣式,solid或dashed。
    }
    //實例化滑鼠繪製工具
    var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: false, //是否開啟繪製模式
        enableDrawingTool: true, //是否顯示工具欄
        drawingToolOptions: {
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
            offset: new BMap.Size(5, 5), //偏離值
        },
        circleOptions: styleOptions, //圓的樣式
        polylineOptions: styleOptions, //線的樣式
        polygonOptions: styleOptions, //多邊形的樣式
        rectangleOptions: styleOptions //矩形的樣式
    });  
     //添加滑鼠繪製工具監聽事件,用於獲取繪製結果
    drawingManager.addEventListener('overlaycomplete', overlaycomplete);
    function clearAll() {
        for(var i = 0; i < overlays.length; i++){
            map.removeOverlay(overlays[i]);
        }
        overlays.length = 0   
    }
</script>
</body>
</html>

 

 現象如下:

 

 1.2 獲取繪製多邊形個個頂點的坐標

   我們畫出多邊形的最終目的其實都是一樣的,想把這個區域的坐標信息保存到資料庫,然後下次能夠根據這個區域的坐標信息,把這個區域顯示在地圖上。那麼我們首先得知道這個區域的坐標是什麼,所以接下來說下如何獲取繪製的區域的坐標。

首先我們先看下代碼:

這裡的添加滑鼠繪製工具監聽時間,用於獲取繪製結果,實際上就是在這裡把多邊形的頂點放入overlays這個對象中,那麼我們如何獲取這些點的坐標呢,還是從官方文檔里找答案,看下麵:

1>在剛纔的JavaScript API界面側欄找到類參考項>覆蓋物類>PolyLine>getPath()

 

 

 

 就是使用這個getPath()方法來獲取。

具體用法如下:

 在上面代碼中新增按鈕 "獲取覆蓋物信息" ,然後添加一個getLayerInformation()的方法,點擊進行測試,代碼如下:

//html代碼
<input type="button" value="獲取繪製覆蓋物信息" onclick="getLayerInformation()">

//js代碼

function getLayerInformation(){
        console.log(overlays[0].getPath());
}

 overlays[0]表示第一個多邊形,然後我們繪製一個多邊形,點擊一下,看下控制台列印的結果:

這樣就可以獲取了多邊形頂點坐標了。

 

2.已知經緯度坐標,繪製多邊形

 接下來看一下已知一些坐標點如何繪製一個多邊形,在代碼中增加一個按鈕 “繪製多邊形” ,然後定義一個有坐標信息的數組:

代碼如下:

<input type="button" value="繪製多邊形" onclick="drawPolygon()">

 

js代碼:

 function drawPolygon(){
        let point = [
            {
                lng:"116.291611",
                lat:"40.061946"
            },
            {
                lng:"116.291539",
                lat:"40.059295"
            },
            {
                lng:"116.296102",
                lat:"40.057252"
            },
            {
                lng:"116.303109",
                lat:"40.060179"
            }
        ];
        let polArry = [];
        point.forEach(item => {
            let p = new BMap.Point(item.lng,item.lat);
            polArry.push(p);
        });
        let polygon = new BMap.Polygon(polArry,styleOptions);
        map.addOverlay(polygon);
    }

 

 結果如下:

點擊 “繪製多邊形” 按鈕:

3.判斷坐標點是否在某個區域內

  在不瞭解之前,我一直以為需要一個演算法來判斷是否在多邊形內,後來發現,百度已經為我們寫好了這個演算法,我們直接使用即可。

判斷坐標點是否在某個區域,需要引入一個js文件,GeoUtils.js ,這個文件同樣在百度提供的資料中可以找到,具體見下圖:

 

 在引入這個文件後,我們在頁面中添加兩個輸入框,輸入經緯度,在添加一個按鈕,來判斷該坐標是不是在區域內:

代碼如下:

html:

<div id="result">
        <input type="button" value="獲取繪製覆蓋物個數" onclick="alert(overlays.length)"/>
        <input type="button" value="獲取繪製覆蓋物信息" onclick="getLayerInformation()">
        <input type="button" value="繪製多邊形" onclick="drawPolygon()">
        <input type="button" value="清除所有覆蓋物" onclick="clearAll()"/>
        <label for="">經度:</label> <input type="text" id="ILng">
        <label for="">緯度:</label> <input type="text" id="ILat">
        <input type="button" value="判斷點是否在多邊形內" onclick="IsInPolygon()">
    </div>  

 

js:

    function IsInPolygon(){
        let lng = $("#ILng").val();
        let lat = $("#ILat").val();
        let point = new BMap.Point(lng,lat);
        let marker = new BMap.Marker(point);
        map.addOverlay(marker);
        if(BMapLib.GeoUtils.isPointInPolygon(point,polygon)){
        console.log("在區域內");
        }else{
        console.log("不在區域內");
        }
       
    }

 

 核心的部分就是這個方法:

BMapLib.GeoUtils.isPointInPolygon(point,polygon)

 

 第一個參數是輸入的坐標點,第二個參數是判斷的多邊形,這裡我用的多邊形是上一步繪製的多邊形,所以測試時,先點擊 “繪製多邊形” ,然後再輸入坐標,再點擊 “判斷是否在多邊形內”。

具體結果如下:

  

  

 

 

 4.在資料庫中如何存儲這些坐標的點

這個問題,我只提供一個思路,因為不同的多邊形坐標個數不同,所以我們不能把每一個坐標點的經度和緯度當成一個單獨的欄位,我給出的做法是,採用字元串拼接的方式去處理,把每個坐標的經度用 一種特殊符號拼接起來當成一個欄位,緯度同理,存到資料庫中,然後顯示的時候,提前對這些坐標進行解析,得出實際坐標點,就可以了。

如下所示:

 用 #  拼接

緯度:
lat1#lat2#lat3#lat4#lat5.....#latn

經度:
lng1#lng2#lng3#lng4#lng5......#lngn

 

字元串拼接的方法是:split,具體用法可自行百度。

 

 

好了,本篇內容就寫到這裡了,下麵給出代碼文件,和一個參考資料壓縮包(這個包很好,很有用);

網盤鏈接:

鏈接:https://pan.baidu.com/s/1OYSIMJ36U4f3LH3_i35dgQ 
提取碼:xd98 

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 以下都是我在使用Devc++的過程中出現過的錯誤,通過查找資料解決問題,今天小小地記錄、整理一下。 1.[Error] invalid conversion from 'const char*' to 'char' [-fpermissive] 出現該錯誤的原因是:使用字元串操作函數 strcmp, ...
  • 工作流為流程中的一種,可以實現無需用戶干預的業務流程自動化,用戶通常使用工作流流程來發起不需要任何用戶交互的自動化。本文介紹工作流的基本概念與簡單使用。 ...
  • 如何你希望你的 WPF 程式能夠以 Windows 的保護機制保護起來,不被輕易反編譯的話,那麼這篇文章應該能幫到你。 介紹 MSIX 是微軟於去年的 Windows 開發者日峰會 上推出的全新應用打包解決方案。其目的是取代舊式的軟體打包方式,可用於 Win32、WindowsForm 、 WPF ...
  • 1、OpenFileDialog 1 private void FileOpen_Click(object sender, EventArgs e) 2 { 3 OpenFileDialog openFile = new OpenFileDialog();//創建OpenFileDialog對象 4 ...
  • 這個系列的初衷是便於自己總結與回顧,把筆記本上面的東西轉移到這裡,態度不由得謹慎許多,下麵是我參考的資源: ASP.NET Core 中文文檔目錄 記在這裡的東西我會不斷的完善豐滿,對於文章裡面一些局限於我自己知識積累的觀點,希望沒有跳走堅持看完的朋友,能夠予以指正和鼓勵. 這個系列的初衷是便於自己 ...
  • sql 事務隔離級別有四種分種為: 一 Read Uncpommitted(未提交讀) 二 Read Committed(提交讀) 三 Repeated Read(可重覆讀) 四 Serializable(序列) 先測試 Read Uncpommitted 先開一個程式,斷點打到事務提交上, 再開第 ...
  • var SRMP = new byte[4]; Array.Copy(Encoding.UTF8.GetBytes(1.ToString("x2")), SRMP, Encoding.UTF8.GetBytes(1.ToString("x2")).Length); Array.Copy(Encodi... ...
  • 1.瀏覽器為什麼不能跨域? 瀏覽器有一個基本的安全策略--同源策略。為保證用戶的信息安全,它對不同源的文檔或腳本對當前文檔的讀寫操作做了限制。功能變數名稱,子功能變數名稱,埠號或協議不同都屬於不同源,當腳本被認為是來自不同源時,瀏覽器雖然會發出這個請求,但是會攔截響應內容。 2.解決跨域問題 CORS(Cross ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...