Utilizzo del livello base di due diverse proiezioni (Spherical Mercator e WGS84) in OpenLayers


9

Come posso aggiungere uno strato di base con due diverse proiezioni?

Ho aggiunto un overlayer con una proiezione diversa (EPSG: 4326), ma devo aggiungere un livello base con varie proiezioni

  1. Google Maps
  2. Il mio livello vettoriale con EPSG: proiezione 4326

Riesco a vedere tutto bene con Google Maps ma quando passo il livello base in EPSG: il livello 4326 è tutto bianco.

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

            }

Risposte:


5

Ho esaminato questo argomento recentemente e questo è uno dei migliori risultati di ricerca, ho pensato che avrei aggiunto del pangrattato alla mia ricerca e sperimentazione.

Lungo e corto:

La linea 2.X di Open Layers non supporta questo. La mappa, le sue proprietà come centro, risoluzione ed estensione sono impostate dal livello base INIZIALE della mappa. Passare a un altro livello base NON regola queste proprietà, quindi il risultato non è noto. Spesso, ottieni un punto centrale / limiti che non sono validi per il livello base in cui stai cambiando, quindi vedi piastrelle bianche. Ma questo non è SEMPRE il risultato (ad esempio, passare da 4326 a 900913 ti porterà ad un punto vicino a 0degN, 0degE).

Ma la speranza non è persa.

Prossimo alla scadenza:

Alcune patch sono state scritte su layer aperti che tentano di correggere questo per la mappa e molti layer (vedere [1]). Questo deriva da un bug archiviato oltre 6 (6 !!!) anni fa [2]. Mentre dovresti ospitare la tua versione di OL e patchla manualmente (la patch non si applicherà in modo pulito alle ultime versioni, quindi devi fare manualmente la modifica), questo ti porterà principalmente dove vuoi essere. Molto cattivo, e non gestisce tutto, ma nel complesso, ottiene qualcuno che ha BISOGNO di più baselayer con diverse proiezioni sui piedi.

Lungo termine:

Questa è esattamente una delle cose che OpenLayers 3.0 spera di affrontare [3].

Un esempio è la dicotomia strato di base / overlay. Spesso è una sfida sapere come e dove impostare risoluzioni, maxExtent, ecc. Per la mappa. La gestione della proiezione tra mappa e livelli e l'interazione tra proiezione e proprietà come maxExtent e center sono al massimo complicate.

L'oggetto Mappa in 2.X si basava troppo sul livello base e questo cambierà in futuro. Quindi, se riesci a resistere fino alla fine del 2013, potrebbe esserci una soluzione già pronta da usare.

[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

c'è qualcosa come la tua domanda qui, Come riproiettare i livelli di base in OpenLayers? e ottieni alcune informazioni sulla trasformazione, dovresti guardare questo, Creazione di immagini raster di Mercator sferico.

per riassumere brevemente dal primo post:

  1. Gli OpenLayer possono trasformare layer vettoriali (come WFS).
  2. I layer raster non possono essere trasformati da OpenLayers.
  3. Qualsiasi buon WMS dovrebbe essere in grado di fare la riproiezione per te.
  4. Il server ArcGIS non è in grado di fornire livelli in 900913 perché wkid non è supportato. 3857, d'altra parte ...!

e dal secondo link:

Uno dei motivi per cui la proiezione di Spherical Mercator è così importante è che è l'unica proiezione che consentirà di sovrapporre correttamente i dati delle immagini su livelli commerciali come Google Maps. Quando si utilizzano immagini raster, nel browser non è possibile riproiettare le immagini nello stesso modo in cui potrebbero trovarsi in un client GIS "spesso". Invece, tutte le immagini devono essere nella stessa proiezione. Come creare tessere proiettate da Spherical Mercator dipende dal software utilizzato per generare le immagini.

L'importante è qui:

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 per la trasformazione del set di dati, la mia risposta può aiutarti in questo, qui .

spero che ti aiuti ...


Ho aggiunto il codice con proj4js che funziona per gli overlay ma non per 2 diversi livelli di base qualche commento al riguardo?
Kinkajou,

1

Imposta il tuo livello WMS senza alcun riferimento a 900913 (supponendo che i tuoi dati siano in 4326). Quindi quando aggiungi il livello a OpenLayer assicurati di aver impostato la proiezione della mappa su 900913 (o assicurati di aggiungere prima Google Maps). Quindi quando aggiungi il livello WMS, OpenLayers richiederà i dati nella proiezione della mappa (900913) e GeoServer riproietterà da 4326 a 900913 al volo.


Aggiunto il codice. Si è verificato un problema durante il passaggio tra questi livelli. Quando carico il layer con WGS 4326 prima come layer di base e mantengo il livello di zoom, va bene dopo che passo al layer di Google e eseguo una panoramica di una mappa, tutto è finito.
Kinkajou,

Cambia map.addLayers ([dsb, dG, gmap_gs]); to map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton

mostra google map al primo caricamento ma non è ancora possibile passare da un livello all'altro. Errore durante il passaggio
kinkajou

0

In generale ciò non è possibile poiché OpenLayers imposta la proiezione della mappa dal livello base.

Una possibile soluzione consiste nell'utilizzare un WMS a cascata come GeoServer per riproiettare uno dei livelli di base dall'uno all'altro della proiezione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.