Utilisation de la couche de base de deux projections différentes (Spherical Mercator et WGS84) dans OpenLayers

9

Comment ajouter une couche de base avec deux projections différentes?

J'ai ajouté une superposition avec une projection différente (EPSG: 4326), mais je dois ajouter une couche de base avec différentes projections

  1. Google Maps
  2. Mon calque vectoriel avec projection EPSG: 4326

Je peux voir que tout va bien avec Google Maps, mais lorsque je passe de la couche de base à EPSG: la couche 4326, tout est blanc.

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
la source

Réponses:

5

J'ai étudié la question récemment, et c'est l'un des meilleurs résultats de recherche, je me suis dit que j'ajouterais du fil d'Ariane à ma recherche et à mon expérimentation.

Long et court:

La ligne 2.X d'Open Layers ne prend pas en charge cela. La carte, ses propriétés telles que le centre, la résolution et l'étendue sont définies par la couche de base INITIALE de la carte. Le passage à une autre couche de base N'AJUSTE PAS ces propriétés, le résultat est donc inconnu. Souvent, vous obtenez un point central / des limites qui ne sont pas valides pour la couche de base que vous modifiez, vous voyez donc des carreaux blancs. Mais ce n'est pas TOUJOURS le résultat (par exemple, le passage de 4326 à 900913 vous amènera à un point proche de 0degN, 0degE).

Mais, l'espoir n'est pas perdu.

À court terme:

Certains correctifs ont été écrits contre des couches ouvertes qui tentent de corriger cela pour la carte et la plupart des couches (voir [1]). Cela vient d'un bug déposé il y a plus de 6 (6 !!!) ans [2]. Bien que vous deviez héberger votre propre version d'OL et le corriger à la main (le correctif ne s'appliquera pas proprement aux dernières versions, vous devez donc effectuer manuellement la modification), cela vous amènera principalement là où vous voulez être. Très méchant, et ne gère pas tout, mais dans l'ensemble, quelqu'un qui a besoin de plusieurs couches de base avec différentes projections sur ses pieds.

Long terme:

C'est exactement l'une des choses qu'OpenLayers 3.0 espère résoudre [3].

Un exemple est la dichotomie couche de base / superposition. Il est souvent difficile de savoir comment et où définir les résolutions, maxExtent, etc. pour la carte. La gestion de la projection entre la carte et les couches et l'interaction entre la projection et les propriétés comme maxExtent et center sont au mieux compliquées.

L'objet Map dans 2.X dépendait trop de la couche de base, et cela va changer à l'avenir. Donc, si vous pouvez tenir jusqu'à la fin de 2013, il peut y avoir une solution prédéfinie à utiliser.

[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
la source
1

il y a quelque chose comme votre question ici, comment reprojeter des couches de base dans OpenLayers? et vous obtenez des informations sur la transformation, vous devriez regarder ceci, Création d'images raster sphériques Mercator.

pour résumer brièvement du premier post:

  1. OpenLayers peut transformer des couches vectorielles (comme WFS).
  2. Les couches raster ne peuvent pas être transformées par OpenLayers.
  3. Tout bon WMS devrait pouvoir faire la reprojection pour vous.
  4. ArcGIS Server ne peut pas fournir de couches dans 900913 car ce wkid n'est pas pris en charge. 3857, d'autre part ...!

et à partir du deuxième lien:

L'une des raisons pour lesquelles la projection Spherical Mercator est si importante est que c'est la seule projection qui permettra de superposer correctement les données d'image au-dessus des couches commerciales comme Google Maps. Lors de l'utilisation d'images raster, dans le navigateur, il n'est pas possible de reprojeter les images de la même manière que dans un client SIG «épais». Au lieu de cela, toutes les images doivent être dans la même projection. La façon de créer des tuiles projetées Spherical Mercator dépend du logiciel que vous utilisez pour générer vos images.

L'important est ici:

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.

et pour transformer l'ensemble de données, ma réponse peut vous aider à ce sujet, ici .

J'espère que ça t'aide...

Aragon
la source
J'ai ajouté le code avec proj4js qui fonctionne pour les superpositions mais pas pour 2 couches de base différentes. Un commentaire à ce sujet?
kinkajou
1

Configurez votre couche WMS sans référence à 900913 (en supposant que vos données sont en 4326). Ensuite, lorsque vous ajoutez la couche à OpenLayers, assurez-vous que vous avez défini la projection de la carte sur 900913 (ou assurez-vous simplement d'ajouter Google Maps en premier). Ensuite, lorsque vous ajoutez la couche WMS, OpenLayers demandera les données dans la projection de carte (900913) et GeoServer reprojetera de 4326 à 900913 à la volée.

Ian Turton
la source
Ajout du code. Il y a un problème lors du basculement entre ces couches. Lorsque je charge d'abord le calque avec WGS 4326 en tant que calque de base et que je maintiens le niveau de zoom, c'est ok après avoir basculé sur le calque Google et panoramique un peu la carte, tout est parti.
kinkajou
Modifiez map.addLayers ([dsb, dG, gmap_gs]); à map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
affiche google map au premier chargement mais ne peut toujours pas changer de couche. Erreur lors du changement
kinkajou
0

En général, cela n'est pas possible car OpenLayers définit la projection de la carte à partir de la couche de base.

Une solution possible consiste à utiliser un WMS en cascade comme GeoServer pour reprojeter l'une des couches de base de l'une à l'autre projection.

Ian Turton
la source