Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用OpenLayers.Control.GetFeature初始化OpenLayers_Javascript_Class_Openlayers - Fatal编程技术网

Javascript 使用OpenLayers.Control.GetFeature初始化OpenLayers

Javascript 使用OpenLayers.Control.GetFeature初始化OpenLayers,javascript,class,openlayers,Javascript,Class,Openlayers,我想知道是否有人能给我指出正确的方向,迫使OpenLayers.Control.GetFeature的BBOX始终处于long/lat坐标中。我正试图通过OpenLayers.Class来实现这一点,因此新控件将继承OpenLayers.control.GetFeature,只需在BBOX中做一些小修改。这就是我所做的: OpenLayers.Control.myGetFeature = OpenLayers.Class(OpenLayers.Control.GetFeature,{

我想知道是否有人能给我指出正确的方向,迫使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做我想做的事情的正确方法吗

非常感谢您的帮助

另外,我正在使用OpenLayers 2.11

编辑:

在函数内部移动“return opts;”解决了上述问题,但它抱怨类_名称丢失。此外,它仍然抱怨同样的问题,但在点击几下或几盒之后,它发送了请求,但是发送的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”函数是我所需要的函数,但是子类本身并没有被返回读取


请在此方面提供帮助,提前感谢,

您的代码示例有一些语法错误。尝试将来使用一些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之间。我在这里得到了这个想法:

谢谢你的回答和例子。我尝试了第一个代码,它抛出了firebug:
TypeError:this.CLASS\u名称未定义
。我尝试了
类名:“OpenLayers.Control.myGetFeature”
下面的
返回选项
和selectBox函数之外,但错误仍然存在。在第二个代码中,我一直使用utm(我的底层是utm,层是long/lat)。