我正在使用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();
}
答案 0 :(得分:1)
根据对问题的评论撰写
如果使用EPSG以外的投影:4326或EPSG:900913(默认情况下支持),则必须在OpenLayers之前添加proj4js。该库将处理投影之间的所有转换。 更改图层中的投影并非易事,Layer类中有很多内容也会耦合它。也许你的方法不起作用,因为在设置属性后仍然有一些参考留给旧的投影。如果您使用addOptions,则应该能够有效且安全地在图层上设置属性。