百度地圖 - 基礎學習(6): 鼠標繪制工具添加、圖形幾何運算(長度、面積等)


地圖鼠標繪制,打算分兩部分學習,主要是牽涉東西太多。今天主要是 鼠標繪制工具添加及配置,以及圖形長度和多邊形面積的計算

一、鼠標繪制工具 DrawingManager

鼠標繪制工具主要采用開源庫 DrawingManager,通過此工具用戶可以在地圖任意位置上畫點、畫圓、畫折線、畫多邊形、以及畫矩形,並顯示線的距離及面的面積。

1、鼠標繪制工具添加

<!--在頁面的頭部加載進鼠標繪制工具開源庫的文件-->
<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" />

2、工具初始化及配置

// 繪制模式樣式配置
styleOptions: {
  strokeColor: "red", // 邊線顏色。
    fillColor: "red", // 填充顏色。當參數為空時,圓形將沒有填充效果。
    strokeWeight: 3, // 邊線的寬度,以像素為單位。
    strokeOpacity: 0.8, // 邊線透明度,取值范圍0 - 1。
    fillOpacity: 0.6, // 填充的透明度,取值范圍0 - 1。
    strokeStyle: "solid" // 邊線的樣式,solid或dashed。
},

// 實例化鼠標繪制工具
addDrawingManager() {
  let that = this;
  this.drawingManager = new BMapLib.DrawingManager(that.mapInstance, {
    isOpen: false, // 是否開啟繪制模式
    enableDrawingTool: true, // 是否顯示工具欄,默認不顯示
    drawingToolOptions: {
      anchor: window.BMAP_ANCHOR_TOP_RIGHT, // 工具顯示位置
      offset: new BMap.Size(5, 5), // 偏離值
      drawingModes: [
        window.BMAP_DRAWING_CIRCLE,
        window.BMAP_DRAWING_POLYLINE,
        window.BMAP_DRAWING_POLYGON
      ] // 工具欄上可以選擇需要顯示的繪制模式,將需要顯示的DrawingType以數組形式傳入。默認是全部
      // BMAP_DRAWING_MARKER:畫點,BMAP_DRAWING_CIRCLE:畫圓,BMAP_DRAWING_POLYLINE:折線,BMAP_DRAWING_POLYGON:多邊形,BMAP_DRAWING_RECTANGLE:矩形
      // 注:工具欄第一項(拖動地圖)不在Modes設置范圍內
    },
    circleOptions: that.styleOptions, // 圓的樣式
    polylineOptions: that.styleOptions, // 折線樣式
    polygonOptions: that.styleOptions, // 多邊形樣式
    rectangleOptions: that.styleOptions // 矩形樣式
    // 注:此處各種繪制模式樣式采用了同一個配置,實際開發中,可以根據實際需要進行不同配置,從而在樣式上區分各種模式
  });
  // this.drawingManager.enableCalculate(); // 打開距離或面積計算
},

3、添加各種繪制監聽事件

// 添加繪制監聽事件
addDrawingManagerEvent() {
  let that = this;
  // 點繪制事件監聽
  this.drawingManager.addEventListener("markercomplete", function(
    e,
    overlay
  ) {
    console.log(e);
    console.log(overlay);
  });
  // 圓繪制事件監聽
  this.drawingManager.addEventListener("circlecomplete", function(
    e,
    overlay
  ) {
    console.log(e);
    console.log(overlay);
  });
  // 折線繪制事件監聽
  this.drawingManager.addEventListener("polylinecomplete", function(
    e,
    overlay
  ) {
    console.log(e);
    console.log(overlay);
  });
  // 多邊形繪制事件監聽
  this.drawingManager.addEventListener("polygoncomplete", function(
    e,
    overlay
  ) {
    console.log(e);
    console.log(overlay);
  });
  // 矩形繪制事件監聽
  this.drawingManager.addEventListener("rectanglecomplete", function(
    e,
    overlay
  ) {
    console.log(e);
    console.log(overlay);
  });

  // 鼠標繪制事件總監聽(無論哪種繪制,繪制完成都會調用)
  this.drawingManager.addEventListener("overlaycomplete", function(e) {
    // e.drawingMode; // 當前的繪制模式
    // e.overlay; // 對應的繪制模式返回對應的覆蓋物
    // e.calculate; // 需要開啟計算模式才會返回這個值,當繪制線的時候返回距離、繪制多邊形、圓、矩形時候返回面積,單位為米,
    // e.label; // 計算面積時候出現在Map上的Label對象
    let overlayList = null, geoUtilsValue = null;
    switch (e.drawingMode) {
      case "circle": {
        // 圓(細看,圓實際上是一個由41個坐標構成的多邊形)
        overlayList = e.overlay.ha;
        break;
      }
      case "polyline": {
        // 折線
        overlayList = e.overlay.ha; // 折線點坐標數組
        break;
      }
      case "polygon": {
        // 多邊形
        overlayList = e.overlay.Ao; // 多邊形各點坐標數組
        break;
      }
      case "rectangle": {
        // 矩形
        overlayList = e.overlay.Ao; // 矩形各點坐標數組
        break;
      }
    }
  });
},

上述步驟完成后,鼠標繪制工具就可以使用了。

(添加工具完成,當前只添加了畫圓、折線、多邊形三種模式)、(畫圓)、(多邊形)

 

二、圖形幾何運算 GeoUtils

單純畫出的各種圖形實際上用處不大,真正有用的是在這些圖形上的進一步交互,如:1、判定某個坐標是否在區域內;2、計算兩點之間的距離;3、判斷點(某個地址)是否在折線(行程線路)上 等等。

DrawingManager 自身帶有一定的計算功能(默認關閉),通過調用 DrawingManager類的 enableCalculate() 方法打開,打開后也可以調用另一個方法 disableCalculate() 予以關閉。

this.drawingManager.enableCalculate(); // 打開距離或面積計算
this.drawingManager.disableCalculate(); // 關閉距離或面積計算

以北京景山公園為例:百度資料顯示是23公頃[即0.23平方千米]地圖上框出來的面積是:0.26514128平方千米左右,實際上相差不大(還是比較准)。

(密閉多邊形框圖面積計算值)、(enableCalculate()方法返回的結果單位為平方米)(折線合成多邊形框圖計算值)、(enableCalculate()方法無法計算折線合成多邊形的面積,只能計算長度)

雖然 DrawingManager類自身帶有一定計算功能,但計算功能相對而言比較弱勢(只能計算折線長度、密閉多邊形面積),從上面例子就可以看出(折線合成多邊形的面積,都只能另外找方法計算)。所以在這次的圖形計算學習中,關閉了DrawingManager類自帶的計算功能,改用另一個開源庫 GeoUtils

 

開源庫GeoUtils,GeoUtils類提供了若干幾何算法,用來幫助用戶判斷點與矩形、 圓形、多邊形線、多邊形面的關系,並提供計算折線長度和多邊形的面積的公式。 

1、GeoUtils類的引入

GeoUtils類的引入才是最坑的,文檔上只說【該類提供的都是靜態方法,勿需實例化即可使用】,而且是掛載在 BMapLib 上使用的,給人一種 GeoUtils類 和 DrawingManager類一樣,都是BMapLib的子類,直接調用就行,但是當你正調用的時候就報各種 undefined。

原因是 GeoUtils類雖然是掛載在 BMapLib 使用的,但 GeoUtils卻是一個獨立庫,需要單獨引用。

<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>

2、GeoUtils類 方法的使用

BMapLib.GeoUtils.getPolygonArea(overlayList)    
// 多邊形(不規則密閉多邊形矩形)計算面積,該方法只能計算閉合的多邊形自相交多邊形無法計算。具體使用可翻閱文檔:http://api.map.baidu.com/library/GeoUtils/1.2/docs/symbols/BMapLib.GeoUtils.html
// 密閉多邊形面積計算
overlayList = e.overlay.Ao; // 多邊形(密閉多邊形、矩形)各點坐標數組
geoUtilsValue = BMapLib.GeoUtils.getPolygonArea(overlayList) / 1000000 + "平方千米"; // 多邊形計算面積(除以1000000,將平方米換算成平方千米)
alert(geoUtilsValue);

這次以北京歡樂水魔方水上公園為例:百度資料顯示是500畝[即0.3333333 平方千米]地圖上框出來的區域計算是:0.33334941175584426平方千米,兩者相當接近,精度非常高了。

(密閉多邊形面積計算)、(BMapLib.GeoUtils.getPolygonArea() 方法計算面積值)

3、百度地圖 - 基礎學習(7): GeoUtils類其他方法的使用(折線長度、點是否在區域內)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM