OpenLayers重新投影

时间:2012-08-06 14:26:58

标签: javascript openlayers projection

我正在使用openLayers显示来自WMS的一大堆乌拉圭。我正在尝试添加可以使用两个不同基础层的选项。 其中一个是谷歌卫星层,它是球形墨卡托900913 ..然后我有一张乌拉圭地图,在UTM21S 32721 .. 我的问题似乎是当我尝试更改基础层时。我在显示谷歌卫星时添加到地图中的wms图层(例如乌拉圭的路线)似乎消失了。当我尝试另一种方式,在UTM21S上加载图层并更改为谷歌卫星时,会发生同样的事情。 为了解决这个问题,我试图听取更改基础层的事件。这是代码:

function mapBaseLayerChanged(event) {
    var pseudo = new OpenLayers.Projection('EPSG:900913');
    var utm21s = new OpenLayers.Projection('EPSG:32721');
    var baseLayer = "EPSG:900913";
    if(event.layer.name == "Google Satellite"){
        map.projection = pseudo;
        map.maxExtent = new OpenLayers.Bounds(-6522200,-4170000,-5890000,-3510000);
    }else{
        baseLayer = "EPSG:32721";
        map.projection = utm21s;
        map.maxExtent = new OpenLayers.Bounds(300000, 6100000, 900000, 6750000);
    }
    for(i = 0 ; i < map.layers.length; i++){
        if (map.layers[i].visibility && !map.layers[i].isBaseLayer && !map.layers[i].isVector) { // Refresh visible non base  
            if(baseLayer == "EPSG:900913"){
                map.layers[i].projection = pseudo;
            }else{
                map.layers[i].projection = utm21s;
            }
            map.layers[i].redraw(true); // Other layer  
            }  
        alert(map.layers[i].projection);
    }
    //alert(map.getProjection());
    map.zoomToMaxExtent();    
}

当我运行此代码时,图层的投影似乎发生了变化,但同样的问题发生了.. 在此先感谢!!

更新

试图让它适用于此,但没有:

if(baseLayer == "EPSG:900913"){
                map.layers[i].addOptions({
                    srs: 'EPSG:900913',
                    format:'png',
                    trnsparent: true,
                },true);
                //map.layers[i].projection = pseudo;
            }else{
                map.layers[i].addOptions({
                    srs: 'EPSG:32721',
                    format:'png',
                    trnsparent: true,
                },true);
                //map.layers[i].projection = utm21s;
            }

将参数srs更改为投影,这就是诀窍..现在函数的代码是:

function mapBaseLayerChanged(event) {
    var pseudo = new OpenLayers.Projection('EPSG:900913');
    var utm21s = new OpenLayers.Projection('EPSG:32721');
    var baseLayer = "EPSG:900913";
    if(event.layer.name == "Google Satellite"){
        map.projection = pseudo;
        map.maxExtent = new OpenLayers.Bounds(-6522200,-4170000,-5890000,-3510000);
    }else{
        baseLayer = "EPSG:32721";
        map.projection = utm21s;
        map.maxExtent = new OpenLayers.Bounds(300000, 6100000, 900000, 6750000);
    }
    for(i = 0 ; i < map.layers.length; i++){
        if (map.layers[i].visibility && !map.layers[i].isBaseLayer && !map.layers[i].isVector) { // Refresh visible non base  
            if(baseLayer == "EPSG:900913"){
                map.layers[i].addOptions({
                    projection: pseudo,
                    format:'png',
                    trnsparent: true,
                },true);
            }else{
                map.layers[i].addOptions({
                    projection: utm21s,
                    format:'png',
                    trnsparent: true,
                },true);
            }
        }  
    }
    map.zoomToMaxExtent();    
}

1 个答案:

答案 0 :(得分:1)

根据对问题的评论撰写

如果使用EPSG以外的投影:4326或EPSG:900913(默认情况下支持),则必须在OpenLayers之前添加proj4js。该库将处理投影之间的所有转换。 更改图层中的投影并非易事,Layer类中有很多内容也会耦合它。也许你的方法不起作用,因为在设置属性后仍然有一些参考留给旧的投影。如果您使用addOptions,则应该能够有效且安全地在图层上设置属性。