簡體   English   中英

具有OpenLayers.Control.GetFeature的OpenLayers.Class

[英]OpenLayers.Class with OpenLayers.Control.GetFeature

我想知道是否有人可以指向我正確的方向,以迫使OpenLayers.Control.GetFeature的BBOX始終位於長/緯度坐標中。 我正在嘗試通過OpenLayers.Class來實現這一點,因此新控件將僅在BBOX中進行少量修改即可繼承OpenLayers.Control.GetFeature。 這是我所做的:

OpenLayers.Control.myGetFeature = OpenLayers.Class(OpenLayers.Control.GetFeature,{
        selectBox: function(position){
            var opts = OpenLayers.Control.GetFeature(position);
            var baseSRSutm = this.map.getprojectionObject();
            var layerSRSdd = new OpenLayers.Projection('EPSG:4326');
            opts.params.bbox = this.map.getExtent().transform(baseSRSutm,layerSRSdd).toBBOX(null,firstLayer.reverseAxisOrder());
        }
        return opts;
    });

但我發現缺少一些“}”。 這是使用OpenLayers.Class做我想要的正確方法嗎?

任何幫助深表感謝。

PS。 我正在使用OpenLayers 2.11

編輯:

移動“返回選擇”; 函數內部解決了上述問題,但它抱怨缺少CLASS_NAME。 除此之外,它仍然抱怨相同,但是在單擊或單擊幾次后,它發送了請求,但是發送的bbox仍在UTM中,問題可能出在哪里? 這是代碼:

var mycontrol = function(){
        var protocol = new OpenLayers.Protocol.HTTP({
            url: 'http://www.....',
            format: new OpenLayers.Format.GeoJSON({
                ignoreExtraDims: true,
                'internalProjection': new OpenLayers.Projection('EPSG:900913'),
                'externalProjection': new OpenLayers.Projection('EPSG:4326')
            })
        });

        OpenLayers.Control.myGetFeature = OpenLayers.Class(OpenLayers.Control.GetFeature,{
            selectBox: function(position){
                var opts = OpenLayers.Control.GetFeature(position);
                var baseSRSutm = this.map.getprojectionObject();
    console.log('this is the baseSRSutm' + baseSRSutm); // doesnt appear in firebug
                var layerSRSdd = new OpenLayers.Projection('EPSG:4326');
                opts.params.bbox = this.map.getExtent().transform(baseSRSutm,layerSRSdd).toBBOX(null,firstLayer.reverseAxisOrder());
    console.log('this is the opts.params.bbox' + opts.params.bbox); // doesnt appear in firebug
                return opts;
            },
            CLASS_NAME: "OpenLayers.Control.myGetFeature"
        });

      return new OpenLayers.Control.myGetFeature({
            protocol: protocol,
            box: true,
            click: true,
            single: false,
            clickTolerance: 10,
            eventListeners:{
                // some stuff
            }
        });
    };

因為console.log沒有出現在螢火蟲中,所以我認為問題出在OpenLayers.Control.myGetFeature和OpenLayers.Class中。 在我看來,“ selectBox”功能是我需要的功能,但是子類本身不會被返回讀取。

請對此提供幫助,在此先感謝,

您的代碼示例有一些語法錯誤。 將來嘗試使用諸如jsHint之類的JavaScript代碼來幫助調試這些錯誤。 這是您的固定代碼:

OpenLayers.Control.myGetFeature = OpenLayers.Class(OpenLayers.Control.GetFeature,{
    selectBox: function(position){
        var opts = OpenLayers.Control.GetFeature(position);
        var baseSRSutm = this.map.getprojectionObject();
        var layerSRSdd = new OpenLayers.Projection('EPSG:4326');
        opts.params.bbox = this.map.getExtent().transform(baseSRSutm,layerSRSdd).toBBOX(null,firstLayer.reverseAxisOrder());
        return opts;
    }
});

關於您關於自定義GetFeature的問題,我認為您的方向正確。 這與我采用的方法相同。 OpenLayers在示例中建議使用略有不同的方法,但是它執行相同的功能:

var control = new OpenLayers.Control.GetFeature();
OpenLayers.Util.extend(control, {
    selectBox: function(position){
        var opts = OpenLayers.Control.GetFeature(position);
        var baseSRSutm = this.map.getprojectionObject();
        var layerSRSdd = new OpenLayers.Projection('EPSG:4326');
        opts.params.bbox = this.map.getExtent().transform(baseSRSutm,layerSRSdd).toBBOX(null,firstLayer.reverseAxisOrder());
        return opts;
    }
});

終於成功了,訣竅是使用原型和selectBox,然后在基礎地圖投影和displayProjection之間進行轉換,在這種情況下,介於900913和4326之間。我在這里得到了這個主意: http://osgeo-org.1560 .n6.nabble.com / Order-Priority-of-Control-GetFeature-and-Control-WMSGetFeatureInfo-on-click-td4997282.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM