使用百度地圖實現地圖網格

来源:https://www.cnblogs.com/zhengcj/archive/2018/02/05/8418005.html
-Advertisement-
Play Games

前言:最近要使用百度地圖實現樓盤可視化的功能,因此最基礎的功能就是將地圖網格化以後實現不同地域的樓盤劃分; 1,自行去百度地圖的開放平臺申請秘鑰哈,這裡我就把自己的秘鑰貼出來了;ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4 2,新建一個簡單頁面,下麵我把自己的頁面貼出來 3 ...


前言:最近要使用百度地圖實現樓盤可視化的功能,因此最基礎的功能就是將地圖網格化以後實現不同地域的樓盤劃分;

1,自行去百度地圖的開放平臺申請秘鑰哈,這裡我就把自己的秘鑰貼出來了;ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4

2,新建一個簡單頁面,下麵我把自己的頁面貼出來

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css">
        html {
            height: 100%
        }

        body {
            height: 100%;
            margin: 0px;
            padding: 0px
        }

        #container {
            height: 100%
        }
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4"></script> 
<script type="text/javascript" src="ziroom-map.js"></script>
 </head>
 <body> 
<div id="container"></div>
 <script> 
var myMap = new ZMap("container"); </script>
 </body>
 </html>

3,其中引入了ziroom-map.js,這是我們公司的名字啦,我把代碼貼出來,這個js是封裝了百度的js的api的,有人如果要問為什麼封裝,直接使用不可以麽?那我的回答是:封裝可以將具體業務和地圖相結合,使代碼更清晰,並且可以持久化當前地圖的狀態,利於實現對地圖的操作。

var ZMap = function (id, center, level) {
    this.initCenter = new ZPoint(116.404, 39.915);//初始化的中心點,同時為了定義網格的中心點
    this.id = id;//div的id
    this.level = level ? level : 13;//地圖級別
    this.center = center ? center : this.initCenter;//中心點

    this.map = null;//百度地圖實例
    this.xgrids = [];//經線
    this.ygrids = [];//緯線
    this.beSelectBounds = {};
    this.bounds = null;//當前地圖的四個頂點
    this.span = null;//當前網格的跨度

    this.init();

}
ZMap.prototype = {
    init: function () {//全局初始化
        var zMap = this;
        this.map = new BMap.Map(this.id);
        this.map.centerAndZoom(this.center.point, this.level);
        this.map.enableScrollWheelZoom();
        this.map.disableInertialDragging();
        this.map.addControl(new BMap.NavigationControl({
            anchor: BMAP_ANCHOR_BOTTOM_RIGHT,
            type: BMAP_NAVIGATION_CONTROL_ZOOM
        })); //縮放按鈕
        this.map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, offset: new BMap.Size(80, 25)})); //比例尺
        this.map.disableDoubleClickZoom();
        this.map.setMapStyle({style: 'googlelite'});
        this.initProperty();
        this.initGrid();

        //添加移動後的點擊事件
        this.map.addEventListener("dragend", function () {
            zMap.initProperty();
            zMap.initGrid();
        });
        //添加放大或縮小時的事件
        this.map.addEventListener("zoomend", function () {
            zMap.initProperty();
            zMap.initGrid();
        });
        //設置點擊事件
        this.map.addEventListener("click", function (e) {
            var point = e.point;
            //獲取當前點是在哪個區塊內,獲取正方形的四個頂點
            var points = zMap.getGrid(point);

            //判斷當前區域是否已經被選中過,如果被選中過則取消選中
            var key = '' + points[0].lng + points[0].lat + points[2].lng + points[2].lat;//使用兩個點的坐標作為key
            if (zMap.beSelectBounds[key]) {
                zMap.map.removeOverlay(zMap.beSelectBounds[key]);
                delete zMap.beSelectBounds[key];
                return;
            }
            var polygon = new BMap.Polygon(points, {strokeColor: "red", strokeWeight: 2, strokeOpacity: 0.5});
            zMap.map.addOverlay(polygon);
            zMap.beSelectBounds[key] = polygon;

        });
    },
    initProperty: function () {//初始化當前地圖的狀態
        this.level = this.map.getZoom();
        this.bounds = {
            x1: this.map.getBounds().getSouthWest().lng,
            y1: this.map.getBounds().getSouthWest().lat,
            x2: this.map.getBounds().getNorthEast().lng,
            y2: this.map.getBounds().getNorthEast().lat
        };
        this.span = this.getSpan();//需要使用level屬性
    },
    initGrid: function () {//初始化網格
        var zMap = this;
        //將原來的網格線先去掉
        for (var i in zMap.xgrids) {
            this.map.removeOverlay(zMap.xgrids[i]);
        }
        zMap.xgrids = [];
        for (var i in zMap.ygrids) {
            this.map.removeOverlay(zMap.ygrids[i]);
        }
        zMap.ygrids = [];
        //獲取當前網格跨度
        var span = zMap.span;
        //初始化地圖上的網格
        for (var i = zMap.bounds.x1 + (zMap.initCenter.point.lng - zMap.bounds.x1) % span.x - span.x; i < zMap.bounds.x2 + span.x; i += span.x) {
            var polyline = new BMap.Polyline([
                new BMap.Point(i.toFixed(6), zMap.bounds.y1),
                new BMap.Point(i.toFixed(6), zMap.bounds.y2)
            ], {strokeColor: "black", strokeWeight: 1, strokeOpacity: 0.5});
            zMap.xgrids.push(polyline);
            zMap.map.addOverlay(polyline);
        }
        for (var i = zMap.bounds.y1 + (zMap.initCenter.point.lat - zMap.bounds.y1) % span.y - span.y; i < zMap.bounds.y2 + span.y; i += span.y) {
            var polyline = new BMap.Polyline([
                new BMap.Point(zMap.bounds.x1, i.toFixed(6)),
                new BMap.Point(zMap.bounds.x2, i.toFixed(6))
            ], {strokeColor: "black", strokeWeight: 1, strokeOpacity: 0.5});
            zMap.ygrids.push(polyline);
            zMap.map.addOverlay(polyline);
        }
    },
    getSpan: function () {//獲取網格的跨度
        var scale = 0.75;
        var x = 0.00064;
        for (var i = this.level; i < 19; i++) {
            x *= 2;
        }
        var y = parseFloat((scale * x).toFixed(5));
        return {x: x, y: y};
    },
    getGrid: function (point) {//返回當前點在所在區塊的四個頂點
        var zMap = this;
        //先找出兩條縱線坐標
        var xpoints = this.xgrids.map(function (polyline) {
            return polyline.getPath()[0].lng;
        }).filter(function (lng) {
            return Math.abs(lng - point.lng) <= zMap.span.x;
        }).sort(function (a, b) {
            return a - b;
        }).slice(0, 2);

        //再找出兩條橫線的坐標
        var ypoints = this.ygrids.map(function (polyline) {
            return polyline.getPath()[0].lat;
        }).filter(function (lat) {
            return Math.abs(lat - point.lat) <= zMap.span.y;
        }).sort(function (a, b) {
            return a - b;
        }).slice(0, 2);

        return [
            new BMap.Point(xpoints[0], ypoints[0]),
            new BMap.Point(xpoints[0], ypoints[1]),
            new BMap.Point(xpoints[1], ypoints[1]),
            new BMap.Point(xpoints[1], ypoints[0])
        ];

    },
    reset: function () {//重置
        this.map.reset();
    }
}

var ZPoint = function (x, y, code) {
    this.code = code;
    this.point = new BMap.Point(x, y);
}

總結:好了這篇隨筆就這麼多了,歡迎大家指正。

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、完整的URL由以下幾部分組成: scheme:通信協議,常用的有:http/ftp。 host:主機,伺服器(電腦)功能變數名稱或IP地址 port:埠,整數,可選,省略時使用預設埠,http的預設埠是80. path:路徑,由零或多個“/”符號隔開的字元,一般用來表示主機的一個目錄或者文件地址 ...
  • 要求實現一個輕量級的在客戶端篩選的combobox,支持大數據量(超過1000個items),能快速檢索內容,並支持數據的設置和活動等基本操作。在這之前嘗試過使用Jquery UI的Autocomplete,但是當數據量太大時客戶端檢索速度太慢(甚至會導致瀏覽器卡死)。索性乾脆基於JQuery自己寫 ...
  • 一、命名規則說明 二、相對網頁外層重要部分css樣式命名 css命名其他說明 DIV+CSS命名小結:無論是使用“.”選擇符號開頭命名,還是使用“#”選擇符號開頭都無所謂,但我們最好遵循——主要的,重要的,特殊的,最外層的盒子用“#”選擇符號開頭命名,其他都用“.”選擇符號開頭命名,同時要考慮命名的 ...
  • JavaScript對象的創建方式 在JavaScript中,創建對象的方式包括兩種:對象字面量和使用new表達式。對象字面量是一種靈活方便的書寫方式,例如: 1 2 3 4 5 6 var o1 = { p:”I’m in Object literal”, alertP:function(){ a ...
  • 一、web框架 眾所周知,對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。 上述通過socket來實現了其本質,而對於真實開發中的python web程式來說,一般會分為兩部分:伺服器程式和應用程式。伺服器程式負責對socket伺服器進行封裝, ...
  • 1、在vue官網下載一個vue.min.js;http://www.runoob.com/vue2/vue-install.html,菜鳥課程提供下載地址 2、新建一個文件夾,將vue.min.js放進去; 3、新建一個html,引入上面的js; 4、編寫代碼: ...
  • electron官網提供的demo項目,在npm install 的時候總是報錯顯示安裝失敗, 解決辦法:翻牆即可成功安裝。 ...
  • 上拉載入的思路 1 上拉載入是要把屏幕拉到最底部的時候觸發ajax事件請求數據 2.所有要獲取屏幕的高度 文檔的高度 和滾動的高度 下麵的代碼是已經做好了相容的可以直接拿來用 3.首先要預設載入第一頁,在window.onload調用upDown這個方法 4.當頁面滾到底部的時候觸發up()這個方法 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...