0

OpenLayers.Control.GetFeature の BBOX を常に long/lat 座標に強制するために、誰かが私を正しい方向に向けることができるかどうか疑問に思っています。私はこれを OpenLayers.Class で取得しようとしているので、新しいコントロールは OpenLayers.Control.GetFeature を継承し、BBOX を少し変更するだけです。これは私がやったことです:

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 が firebug に表示されないので、問題は OpenLayers.Control.myGetFeature と OpenLayers.Class にあると思います。「selectBox」関数が必要なように思えますが、サブクラス自体はリターンによって読み取られません。

これについて助けてください、事前に感謝します、

4

2 に答える 2

0

最終的にうまくいきました。トリックは、プロトタイプとselectBoxを使用してから、ベースマップ投影とdisplayProjectionの間、この場合は900913と4326の間の変換を適用することです.私はここでアイデアを得ました: http://osgeo-org.1560 .n6.nabble.com/Order-Priority-of-Control-GetFeature-and-Control-WMSGetFeatureInfo-on-click-td4997282.html

于 2013-01-31T23:51:19.877 に答える
0

コード サンプルにいくつかの構文エラーがあります。これらのエラーのデバッグに役立つように、今後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;
    }
});
于 2013-01-30T18:01:43.363 に答える