Usando a camada base de duas projeções diferentes (Spherical Mercator e WGS84) no OpenLayers

9

Como adiciono camada base com duas projeções diferentes?

Adicionei overlayer com uma projeção diferente (EPSG: 4326), mas preciso adicionar uma camada base com várias projeções

  1. Google Maps
  2. Minha camada vetorial com projeção EPSG: 4326

Percebo que tudo está bem com o Google Maps, mas quando mudo a camada base para o EPSG: 4326, tudo fica branco.

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);

            }
kinkajou
fonte

Respostas:

5

Eu estive analisando isso recentemente, e este é um dos principais resultados de pesquisa, achei que adicionaria algumas migalhas de pão à minha pesquisa e experimentação.

Longo e curto:

A linha 2.X de camadas abertas não suporta isso. O Mapa, suas propriedades como centro, resolução e extensões são definidas pela camada base INITIAL do mapa. Alterar para outra camada base NÃO ajusta essas propriedades, portanto o resultado é desconhecido. Freqüentemente, você obtém um ponto central / limites que não são válidos para a camada base para a qual está mudando e, portanto, vê azulejos brancos. Mas esse não é sempre o resultado (por exemplo, alternar de 4326 para 900913 levará você a um ponto próximo a 0degN, 0degE).

Mas a esperança não está perdida.

Próximo prazo:

Alguns patches foram escritos em camadas abertas que tentam corrigir isso no mapa e em muitas das camadas (consulte [1]). Isso vem de um bug registrado há mais de 6 (6 !!!) anos atrás [2]. Embora você precise hospedar sua própria versão do OL e corrigi-la manualmente (o patch não se aplicará corretamente às versões mais recentes, portanto, você deverá fazer a edição manualmente), isso levará você principalmente para onde deseja estar. Muito desagradável, e não lida com tudo, mas no geral, recebe alguém que PRECISA de várias camadas de base com projeções diferentes nos pés.

Longo prazo:

Essa é exatamente uma das coisas que o OpenLayers 3.0 espera resolver [3].

Um exemplo é a dicotomia da camada base / sobreposição. Muitas vezes, é um desafio saber como e onde definir resoluções, maxExtent etc. para o mapa. O manuseio da projeção entre o mapa e as camadas e a interação entre a projeção e as propriedades, como maxExtent e center, são complicadas na melhor das hipóteses.

O objeto Map no 2.X dependia muito da camada base, e isso vai mudar daqui para frente. Portanto, se você aguentar até o final de 2013, pode haver uma solução pré-fabricada para você usar.

[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/

J Jones
fonte
1

existe algo como sua pergunta aqui: Como reprojetar as camadas básicas no OpenLayers? e você obtém algumas informações sobre transformação, consulte: Criando imagens raster esféricas do Mercator.

para resumir brevemente do primeiro post:

  1. Os OpenLayers podem transformar camadas vetoriais (como o WFS).
  2. Camadas de varredura não podem ser transformadas por OpenLayers.
  3. Qualquer bom WMS deve poder fazer a reprojeção para você.
  4. O ArcGIS Server não pode fornecer camadas no 900913 porque esse wkid não é suportado. 3857, por outro lado ...!

e do segundo link:

Uma das razões pelas quais a projeção Spherical Mercator é tão importante é que é a única projeção que permitirá a sobreposição de dados de imagem sobre camadas comerciais, como o Google Maps corretamente. Ao usar imagens rasterizadas, no navegador, não é possível reprojetar as imagens da mesma maneira que em um cliente GIS 'espesso'. Em vez disso, todas as imagens devem estar na mesma projeção. Como criar blocos projetados do Spherical Mercator depende do software que você está usando para gerar suas imagens.

O importante é aqui:

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.

e para transformar o conjunto de dados, minha resposta pode ajudá-lo sobre isso aqui .

espero que ajude você ...

Aragão
fonte
Eu adicionei o código com proj4js, que funciona para sobreposições, mas não para 2 camadas de base diferentes, qualquer comentário sobre isso?
Kinkajou #
1

Configure sua camada WMS sem qualquer referência a 900913 (supondo que seus dados estejam em 4326). Depois, quando você adicionar a camada ao OpenLayers, defina a projeção do mapa como 900913 (ou apenas adicione o Google Maps primeiro). Então, quando você adiciona a camada WMS, o OpenLayers solicita os dados na projeção do mapa (900913) e o GeoServer reprojeta de 4326 a 900913 em tempo real.

Ian Turton
fonte
Adicionado o código. Há um problema ao alternar entre essas camadas. Quando carrego a camada com o WGS 4326 primeiro como camada base e mantenho o nível de zoom, tudo fica bem depois de mudar para a camada do google e mover um mapa um pouco, tudo acabou.
Kinkajou #
Altere map.addLayers ([dsb, dG, gmap_gs]); para map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
mostra o mapa do Google no primeiro carregamento, mas ainda não pode mudar de camada. Erro ao mudar
kinkajou
0

Em geral, isso não é possível, pois o OpenLayers define a projeção do mapa a partir da camada base.

Uma solução possível é usar um WMS em cascata como o GeoServer para reprojetar uma das camadas base de uma para a outra projeção.

Ian Turton
fonte