OpenLayers項目分析——(九)控件

OpenLayers中的控件,是通過加載到地圖上而起作用的,也算地圖表現的一部分。同時,控件需要對地圖發生作用,所以每個控件也持有對地圖(map對象)的引用。

  前面說過,控件是於事件相關聯的。具體的說就是控件的實現是依賴於事件綁定的,每個OpenLayers.Control及其子類的實例都會持有一個handler的引用的。

  那麼,怎麼來創建並添加一個控件呢?用下面的語句:

  //實例化一個控件

  var control1 = new OpenLayers.Control({div: myDiv});

  //向地圖中添加控件

  var map = new OpenLayers.Map('map', { controls: [] });

  map.addControl(control1 );

對一些常用的OpenLayers控件,項目本身都封裝好了,用下面的語句添加:

  map.addControl(new OpenLayers.Control.PanZoomBar());

  map.addControl(new OpenLayers.Control.MouseToolbar());

   map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));

   map.addControl(new OpenLayers.Control.Permalink());

   map.addControl(new OpenLayers.Control.Permalink('permalink'));

   map.addControl(new OpenLayers.Control.MousePosition());

   map.addControl(new OpenLayers.Control.OverviewMap());

    map.addControl(new OpenLayers.Control.KeyboardDefaults());

  先看看OpenLayers. Control基類的實現過程,再選擇幾個典型的子類分析一下。

  OpenLayers. Control:

  //設置控件的map屬性,即控件所引用的地圖

    setMap: function(map) {

        this.map = map;

        if (this.handler) {

            this.handler.setMap(map);

        }

    }

  //drew方法,當控件準備顯示在地圖上是被調用。當然,這個方法只對有圖標的控件起 

  //作用。

    draw: function (px) {

        if (this.div == null) {

            this.div = OpenLayers.Util.createDiv();

            this.div.id = this.id;

            this.div.className = this.displayClass;

        }

        if (px != null) {

            this.position = px.clone();

        }

        this.moveTo(this.position);        

        return this.div;

    }

  前面說過,OpenLayers.Control及其子類的實例都是會持有一個handler的引用的,因爲每個控件起作用時,鼠標事件都是不一樣的,這需要動態的綁定和接觸綁定。在OpenLayers.Control中是通過active和deactive兩個方法實現,就是動態的激活和註銷。

  //激活方法

    activate: function () {

        if (this.active) {

            return false;

        }

        if (this.handler) {

            this.handler.activate();

        }

        this.active = true;

        return true;

    }

  //註銷方法

    deactivate: function () {

        if (this.active) {

            if (this.handler) {

                this.handler.deactivate();

            }

            this.active = false;

            return true;

        }

        return false;

    }

  

  再來看OpenLayers.Control的子類,即各類“特色”控件。選鷹眼控件OpenLayers. Control. OverviewMap和矢量編輯工具條控件OpenLayers. Control. EditingToolbar來說。

  順便說一句,OpenLayers中的控件有些是需要圖標的,像EditingToolbar,有些是不需要的,像OpenLayers. Control. DragPan。

 

  OpenLayers. Control. OverviewMap:

  “鷹眼”實際上也是地圖導航的一種形式,在外部形態上跟圖層開關控件有點兒像。

添加鷹眼控件的語句:

   map.addControl(new OpenLayers.Control.OverviewMap());

  在它實現的成員函數中,draw函數是核心,繼承基類OpenLayers.Control,在地圖中顯示這個控件。

  此控件關聯了一些瀏覽器事件,比如

    rectMouseDown: function (evt) {

        if(!OpenLayers.Event.isLeftClick(evt)) return;

        this.rectDragStart = evt.xy.clone();

        this.performedRectDrag = false;

        OpenLayers.Event.stop(evt);

    }。

 

  OpenLayers. Control. EditingToolbar:

  OpenLayers從2.3版就對矢量編輯進行了支持,就是圖上右上角幾個圖標。完成點、線、面的編輯功能。

  同樣,它也是用drew方法激活:

    draw: function() {

        Var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);

        this.activateControl(this.controls[0]);

        return div;

    }

  

  下面的代碼是使用此控件的具體過程:

  Var  map, layer;    

     map = new OpenLayers.Map( 'map', { controls: [] } );

     layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 

             "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );

     map.addLayer(layer);

     vlayer = new OpenLayers.Layer.Vector( "Editable" );

     map.addLayer(vlayer);

     map.addControl(new OpenLayers.Control.PanZoomBar());

     map.addControl(new OpenLayers.Control.EditingToolbar(vlayer));

            

     map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);

發佈了99 篇原創文章 · 獲贊 47 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章