在OpenLayers中使用两个不同投影(球形墨卡托和WGS84)的基础层


9

如何添加具有两个不同投影的基本层?

我添加了具有不同投影的覆盖层(EPSG:4326),但是我需要添加具有各种投影的基础层

  1. 谷歌地图
  2. 我的带有EPSG:4326投影的矢量层

我可以看到Google Maps一切都很好,但是当我将基本层切换到EPSG:4326层时,一切都是白色的。

window.onload = function init(){
                var lon = 84;
                var lat = 28;
                var zoom = 8;
                var url = "http://10.6.7.6/geoserver/wms";

                var mapControls = [
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher({'ascending':false}),                       
                    new OpenLayers.Control.ScaleLine(),
                    new OpenLayers.Control.MousePosition(),
                    new OpenLayers.Control.OverviewMap(),
                    new OpenLayers.Control.KeyboardDefaults()
                ];

                var map = new OpenLayers.Map(
                'map', 
                {       
                    numZoomLevels: 21,
                    projection: new OpenLayers.Projection("EPSG:900913"),
                    displayProjection: new OpenLayers.Projection("EPSG:4326"),
                    controls: mapControls 
                });


                var dsb = new OpenLayers.Layer.WMS( 
                "Nepal Border",
                url,                
                {layers: 'GisData:IR'}                        
            );  

                var gmap_gs = new OpenLayers.Layer.Google(
                "Google Streets",// the default 
                {'sphericalMercator': true}                 

            );




                var dG = new OpenLayers.Layer.WMS( 
                "2G Down Sites",
                url, 
                {layers: 'GisData:dG', transparent: "true",format: "image/png"},
                {
                    isBaseLayer: false,
                    buffer: 0
                });


                map.addLayers([dsb, dG,gmap_gs]);
                var proj = new OpenLayers.Projection("EPSG:4326");
                var point = new OpenLayers.LonLat(lon,lat);

                point.transform(proj, map.getProjectionObject());

                map.setCenter(point, zoom);

            }

Answers:


5

我最近一直在研究这个问题,这是最热门的搜索结果之一,我认为我会在研究和实验中添加一些面包屑。

长和短:

开放层的2.X行不支持此功能。地图及其中心,分辨率和范围等属性是由地图的INITIAL基础层设置的。更改为另一个基础层不会调整这些属性,因此结果未知。通常,您得到的中心点/边界对于您要更改的基础层无效,因此您会看到白色图块。但这并不总是结果(例如,从4326切换到900913将使您到达接近0degN,0degE的点)。

但是,希望并没有失去。

短期:

针对开放层写了一些补丁,这些补丁试图为地图和许多层打补丁(见[1])。这来自于6年前(6 !!!)之前提交的错误[2]。虽然您必须托管自己的OL版本并手动进行修补(该修补程序不会完全适用于最新版本,所以您必须手动进行编辑),但这将使您大部分都可以找到自己想要的位置。非常讨厌,不能处理所有事情,但总的来说,需要一个需要多个基层且脚部投影不同的人。

长期:

这正是OpenLayers 3.0希望解决的问题之一[3]。

一个例子是基础层/覆盖二分法。知道如何以及在何处设置地图的分辨率,maxExtent等通常是一个挑战。地图和图层之间的投影处理以及maxExtent和center等投影与属性之间的相互作用充其量是复杂的。

2.X中的Map对象过分依赖基础层,并且这种情况今后将会改变。因此,如果您可以坚持到2013年下半年,则可能会有预制的解决方案供您使用。

[1] http://trac.osgeo.org/openlayers/attachment/ticket/1249/NEW.Reproject.patch
[2] http://trac.osgeo.org/openlayers/ticket/1249
[3] http:// /openlayers.org/blog/2012/11/14/why-are-we-building-openlayers-3/


1

您的问题在这里,如何在OpenLayers中重新投影基础层? 并且您获得了有关转换的一些信息,您应该看一下,创建球形墨卡托光栅图像”。

总结第一篇文章:

  1. OpenLayers可以变换矢量层(例如WFS)。
  2. 栅格图层不能由OpenLayers转换。
  3. 任何好的WMS都应该能够为您进行重新投影。
  4. 由于不支持该wkid,因此ArcGIS Server无法在900913中提供图层。另一方面,3857 ...!

从第二个链接:

球形墨卡托投影如此重要的原因之一是,它是唯一可以将图像数据正确覆盖在商业层(例如Google Maps)上的投影。使用栅格图像时,在浏览器中无法像在“厚” GIS客户端中一样重新投影图像。而是,所有图像必须在同一投影中。如何创建Spherical Mercator投影图块取决于您用于生成图像的软件。

重要的是在这里:

using raster images, in the browser, it is not possible to reproject the images
in the same way it might be in a thick GIS client.

对于转换数据集,我的答案可以在此处帮助您。

我希望它可以帮助您...


我用proj4js添加了代码,该代码适用于叠加层,但不适用于2个不同的基础层,对此有何评论?
2012年

1

设置WMS层时不要引用任何900913(假设您的数据在4326中)。然后,当您将图层添加到OpenLayers时,请确保已将地图的投影设置为900913(或仅确保首先添加Google Maps)。然后,当您添加WMS图层时,OpenLayers将在地图投影中请求数据(900913),而GeoServer会即时将其从4326重新投影到900913。


添加了代码。在这些层之间切换时存在问题。当我首先使用WGS 4326作为基础层加载该层并保持缩放级别时,在切换到Google层并稍微平移地图后就可以了,这一切都消失了。
2012年

更改map.addLayers([dsb,dG,gmap_gs]); 到map.addLayers([gmap_gs,dsb,dG]);
伊恩·特顿

在首次加载时显示google map,但仍无法切换图层。错误而切换
蜜熊

0

通常,这是不可能的,因为OpenLayers设置了从基础层的地图投影。

一种可能的解决方法是使用级联WMS(例如GeoServer)将一个基础层从一个投影重新投影到另一个投影。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.