Verwenden der Basisschicht aus zwei verschiedenen Projektionen (Spherical Mercator und WGS84) in OpenLayers

9

Wie füge ich einen Baselayer mit zwei verschiedenen Projektionen hinzu?

Ich habe eine Überlagerung mit einer anderen Projektion hinzugefügt (EPSG: 4326), aber ich muss eine Basisschicht mit verschiedenen Projektionen hinzufügen

  1. Google Maps
  2. Meine Vektorebene mit EPSG: 4326-Projektion

Ich kann sehen, dass mit Google Maps alles in Ordnung ist, aber wenn ich die Basisebene auf EPSG: 4326 umschalte, ist alles weiß.

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
quelle

Antworten:

5

Ich habe mich kürzlich damit befasst und dies ist eines der Top-Suchergebnisse. Ich dachte, ich würde meiner Forschung und meinen Experimenten einige Brotkrumen hinzufügen.

Lang und kurz:

Die 2.X-Reihe von Open Layers unterstützt dies nicht. Die Karte, ihre Eigenschaften wie Mittelpunkt, Auflösung und Ausdehnung werden von der INITIAL-Basisebene der Karte festgelegt. Wechsel zu einer anderen Basisschicht Passt diese Eigenschaften NICHT an, daher ist das Ergebnis unbekannt. Oft erhalten Sie einen Mittelpunkt / Grenzen, die für die Basisebene, zu der Sie wechseln, nicht gültig sind, sodass Sie weiße Kacheln sehen. Dies ist jedoch nicht IMMER das Ergebnis (wenn Sie beispielsweise von 4326 auf 900913 wechseln, gelangen Sie zu einem Punkt nahe 0 Grad, 0 Grad E).

Aber die Hoffnung geht nicht verloren.

Kurzfristig:

Einige Patches wurden gegen offene Ebenen geschrieben, die versuchen, dies für die Karte und viele der Ebenen zu patchen (siehe [1]). Dies ist auf einen Fehler zurückzuführen, der vor über 6 (6 !!!) Jahren gemeldet wurde [2]. Während Sie Ihre eigene Version von OL hosten und von Hand patchen müssen (der Patch wird nicht sauber auf die neuesten Versionen angewendet, sodass Sie die Bearbeitung manuell durchführen müssen), gelangen Sie meistens dorthin, wo Sie sein möchten. Sehr böse und handhabt nicht alles, aber insgesamt bekommt jemand, der mehrere Basisschichten mit unterschiedlichen Projektionen auf den Füßen braucht.

Langfristig:

Dies ist genau eines der Dinge, die OpenLayers 3.0 ansprechen möchte [3].

Ein Beispiel ist die Dichotomie zwischen Basisschicht und Überlagerung. Es ist oft eine Herausforderung zu wissen, wie und wo Auflösungen, maxExtent usw. für die Karte festgelegt werden sollen. Die Projektionshandhabung zwischen Karte und Layern sowie das Zusammenspiel von Projektion und Eigenschaften wie maxExtent und center sind bestenfalls kompliziert.

Das Map-Objekt in 2.X hat sich zu stark auf die Basisebene verlassen, und das wird sich in Zukunft ändern. Wenn Sie also bis Ende 2013 durchhalten können, gibt es möglicherweise eine vorgefertigte Lösung für Sie.

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

Hier ist etwas wie Ihre Frage: Wie werden Basisebenen in OpenLayers neu projiziert? Wenn Sie Informationen zur Transformation erhalten, sollten Sie diese Informationen unter Erstellen von sphärischen Mercator-Rasterbildern lesen.

um es kurz aus dem ersten Beitrag zusammenzufassen:

  1. OpenLayers können Vektorebenen (wie WFS) transformieren.
  2. Rasterebenen können von OpenLayers nicht transformiert werden.
  3. Jedes gute WMS sollte in der Lage sein, die Neuprojektion für Sie durchzuführen.
  4. ArcGIS Server kann in 900913 keine Layer bereitstellen, da diese wkid nicht unterstützt wird. 3857 andererseits ...!

und vom zweiten Link:

Einer der Gründe, warum die Spherical Mercator-Projektion so wichtig ist, ist, dass sie die einzige Projektion ist, mit der Bilddaten korrekt über kommerzielle Ebenen wie Google Maps gelegt werden können. Bei Verwendung von Rasterbildern im Browser ist es nicht möglich, die Bilder auf die gleiche Weise wie in einem "dicken" GIS-Client neu zu projizieren. Stattdessen müssen sich alle Bilder in derselben Projektion befinden. Wie Sie projizierte Spherical Mercator-Kacheln erstellen, hängt von der Software ab, mit der Sie Ihre Bilder erstellen.

Das Wichtige ist hier:

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.

und für die Transformation von Daten - Set, meine Antwort kann man darüber helfen, hier .

ich hoffe es hilft dir ...

Aragon
quelle
Ich habe den Code mit proj4js hinzugefügt, der für Overlays funktioniert, aber nicht für 2 verschiedene Basisebenen. Gibt es einen Kommentar dazu?
Kinkajou
1

Richten Sie Ihre WMS-Schicht ohne Verweis auf 900913 ein (vorausgesetzt, Ihre Daten befinden sich in 4326). Wenn Sie dann den Layer zu OpenLayers hinzufügen, stellen Sie sicher, dass Sie die Projektion der Karte auf 900913 eingestellt haben (oder fügen Sie zuerst Google Maps hinzu). Wenn Sie dann den WMS-Layer hinzufügen, fordert OpenLayers die Daten in der Kartenprojektion (900913) an und GeoServer projiziert im laufenden Betrieb von 4326 auf 900913.

Ian Turton
quelle
Code hinzugefügt. Beim Umschalten zwischen diesen Ebenen tritt ein Problem auf. Wenn ich die Ebene zuerst mit WGS 4326 als Basisebene lade und die Zoomstufe beibehalte, ist dies in Ordnung, nachdem ich zur Google-Ebene gewechselt und eine Karte ein wenig geschwenkt habe, ist alles weg.
Kinkajou
Map.addLayers ändern ([dsb, dG, gmap_gs]); zu map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
Zeigt Google Map beim ersten Laden an, kann aber die Ebene immer noch nicht wechseln. Fehler beim Umschalten
kinkajou
0

Im Allgemeinen ist dies nicht möglich, da OpenLayers die Projektion der Karte von der Basisebene aus festlegt.

Eine mögliche Lösung besteht darin, ein kaskadierendes WMS wie GeoServer zu verwenden, um eine der Basisschichten von einer zur anderen Projektion neu zu projizieren.

Ian Turton
quelle