Usando la capa base de dos proyecciones diferentes (Spherical Mercator y WGS84) en OpenLayers

9

¿Cómo agrego una capa base con dos proyecciones diferentes?

He agregado una capa superpuesta con una proyección diferente (EPSG: 4326), pero necesito agregar una capa base con varias proyecciones

  1. mapas de Google
  2. Mi capa vectorial con EPSG: proyección 4326

Puedo ver que todo está bien con Google Maps, pero cuando cambio la capa base a EPSG: 4326 capa, todo es blanco.

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
fuente

Respuestas:

5

He estado investigando esto recientemente, y este es uno de los mejores resultados de búsqueda, pensé que agregaría algunas migas de pan a mi investigación y experimentación.

Largo y corto:

La línea 2.X de capas abiertas no es compatible con esto. El Mapa, sus propiedades tales como el centro, la resolución y la extensión, son establecidas por la capa base INICIAL del mapa. Cambiar a otra capa base NO ajusta estas propiedades, por lo que se desconoce el resultado. A menudo, obtienes un punto central / límites que no son válidos para la capa base a la que estás cambiando, por lo que ves mosaicos blancos. Pero ese NO es SIEMPRE el resultado (por ejemplo, cambiar de 4326 a 900913 lo llevará a un punto cercano a 0degN, 0degE).

Pero la esperanza no está perdida.

Término cercano:

Algunos parches se escribieron en capas abiertas que intentan parchear esto para el mapa y muchas de las capas (ver [1]). Esto proviene de un error presentado hace más de 6 (6 !!!) años [2]. Si bien tendrías que alojar tu propia versión de OL y parchearla a mano (el parche no se aplicará limpiamente a las últimas versiones, por lo que debes hacer la edición manualmente), esto te llevará principalmente a donde quieres estar. Muy desagradable, y no maneja todo, pero en general, alguien que NECESITA múltiples capas base con diferentes proyecciones en sus pies.

A largo plazo:

Esta es exactamente una de las cosas que OpenLayers 3.0 espera abordar [3].

Un ejemplo es la capa base / dicotomía de superposición. A menudo es un desafío saber cómo y dónde establecer resoluciones, maxExtent, etc. para el mapa. El manejo de la proyección entre el mapa y las capas y la interacción entre la proyección y las propiedades como maxExtent y center son complicadas en el mejor de los casos.

El objeto Map en 2.X dependía demasiado de la capa base, y eso va a cambiar en el futuro. Por lo tanto, si puede esperar hasta finales de 2013, puede haber una solución prefabricada para su uso.

[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
fuente
1

Hay algo como su pregunta aquí, ¿Cómo reproyectar capas base en OpenLayers? y obtienes información sobre la transformación, debes mirar esto, Creación de imágenes ráster de Mercator esféricas.

para resumir brevemente de la primera publicación:

  1. OpenLayers puede transformar capas vectoriales (como WFS).
  2. OpenLayers no puede transformar las capas ráster.
  3. Cualquier buen WMS debería poder hacer la reproyección por usted.
  4. ArcGIS Server no puede proporcionar capas en 900913 porque ese wkid no es compatible. 3857, por otro lado ...!

y desde el segundo enlace:

Una de las razones por las que la proyección esférica de Mercator es tan importante es que es la única proyección que permitirá superponer correctamente los datos de imagen sobre capas comerciales como Google Maps. Cuando se usan imágenes ráster, en el navegador, no es posible volver a proyectar las imágenes de la misma manera que en un cliente SIG 'grueso'. En cambio, todas las imágenes deben estar en la misma proyección. La forma de crear mosaicos proyectados de Mercator esféricos depende del software que esté utilizando para generar sus imágenes.

Lo importante está aquí:

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.

y para transformar el conjunto de datos, mi respuesta puede ayudarlo con esto, aquí .

Espero que te ayude...

Aragón
fuente
He agregado el código con proj4js que funciona para superposiciones pero no para 2 capas base diferentes ¿Algún comentario sobre esto?
kinkajou
1

Configure su capa WMS sin ninguna referencia a 900913 (suponiendo que sus datos estén en 4326). Luego, cuando agregue la capa a OpenLayers, asegúrese de haber configurado la proyección del mapa en 900913 (o simplemente asegúrese de agregar Google Maps primero). Luego, cuando agrega la capa WMS, OpenLayers solicitará los datos en la proyección del mapa (900913) y GeoServer reproyectará de 4326 a 900913 sobre la marcha.

Ian Turton
fuente
Se agregó el código. Hay un problema al cambiar entre estas capas. Cuando cargo la capa con WGS 4326 primero como capa base y mantengo el nivel de zoom, está bien después de cambiar a la capa de Google y desplazar un poco un mapa, todo se ha ido.
kinkajou
Cambiar map.addLayers ([dsb, dG, gmap_gs]); a map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
muestra el mapa de Google en la primera carga pero aún no puede cambiar de capa. Error al cambiar
kinkajou
0

En general, esto no es posible ya que OpenLayers establece la proyección del mapa desde la capa base.

Una posible solución es usar un WMS en cascada como GeoServer para reproyectar una de las capas base de una a otra proyección.

Ian Turton
fuente