0

私は openLayers を使用して、WMS に由来するウルグアイのレイヤー全体を表示しています。2 つの異なる基本レイヤーを使用できるオプションを追加しようとしています。それらの 1 つは、球状メルカトル 900913 にある Google 衛星レイヤーです。次に、UTM21S 32721 にあるウルグアイの地図があります。私の問題は、ベース レイヤーを変更しようとしたときのようです。Google サテライトを表示していたときにマップに追加した wms レイヤー (ウルグアイのルートなど) が消えているようです。別の方法で、UTM21S にレイヤーをロードして Google サテライトに変更しようとすると、同じことが起こります。

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();    
}
4

1 に答える 1

1

質問へのコメントから構成される

EPSG:4326 または EPSG:900913 (デフォルトでサポートされています) 以外のプロジェクションを使用している場合は、 OpenLayers の前にproj4jsを含める必要があります。このライブラリは、投影間のすべての変換を処理します。レイヤー内のプロジェクションを変更することは簡単ではありません.Layerクラス内には、それに結合されているものがたくさんあります。プロパティを設定した後、古いプロジェクションへの参照が残っているため、アプローチが機能しない可能性があります。addOptionsを使用すると、レイヤーのプロパティを効果的かつ安全に設定できるはずです。

于 2012-08-13T11:23:32.680 に答える