Korzystanie z warstwy bazowej dwóch różnych rzutów (Spherical Mercator i WGS84) w OpenLayers

9

Jak dodać podkładkę z dwoma różnymi rzutami?

Dodałem nakładkę z inną projekcją (EPSG: 4326), ale muszę dodać warstwę podstawową z różnymi projekcjami

  1. mapy Google
  2. Moja warstwa wektorowa z projekcją EPSG: 4326

Widzę, że wszystko jest w porządku z Mapami Google, ale po zmianie warstwy podstawowej na EPSG: 4326 wszystko jest białe.

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
źródło

Odpowiedzi:

5

Przyglądałem się temu ostatnio i jest to jeden z najlepszych wyników wyszukiwania, pomyślałem, że dodam trochę bułki tartej do moich badań i eksperymentów.

Długi i krótki:

Linia otwartych warstw 2.X nie obsługuje tego. Mapa, jej właściwości, takie jak środek, rozdzielczość i zakres, są ustawiane przez początkową warstwę podstawową mapy. Zmiana na inną warstwę bazową NIE dostosowuje tych właściwości, więc wynik jest nieznany. Często pojawia się punkt środkowy, który nie jest poprawny dla warstwy podstawowej, na którą się zmieniasz, więc widzisz białe kafelki. Ale to nie ZAWSZE wynik (na przykład zmiana z 4326 na 900913 doprowadzi cię do punktu zbliżonego do 0degN, 0degE).

Ale nadzieja nie jest stracona.

Krótkoterminowe:

Niektóre łatki zostały napisane dla otwartych warstw, które próbują załatać to dla mapy i wielu warstw (patrz [1]). Wynika to z błędu zgłoszonego ponad 6 (6 !!!) lat temu [2]. Podczas gdy będziesz musiał hostować własną wersję OL i załatać ją ręcznie (łata nie będzie miała czystego zastosowania do najnowszych wersji, więc musisz ręcznie dokonać edycji), to zabierze Cię głównie tam, gdzie chcesz. Bardzo nieprzyjemny i nie radzi sobie ze wszystkim, ale ogólnie rzecz biorąc, dostaje kogoś, kto POTRZEBUJE wielu podstawników z różnymi projekcjami na nogach.

Długoterminowy:

Jest to dokładnie jedna z rzeczy, którą OpenLayers 3.0 ma nadzieję rozwiązać [3].

Jednym z przykładów jest dychotomia warstwy podstawowej / nakładki. Często wyzwaniem jest wiedzieć, w jaki sposób i gdzie ustawić rozdzielczość, maxExtent itp. Dla mapy. Obsługa rzutowania między mapą a warstwami oraz wzajemne oddziaływanie między rzutowaniem a właściwościami, takimi jak maxExtent i środek, są w najlepszym razie skomplikowane.

Obiekt Map w wersji 2.X zbyt mocno polegał na warstwie podstawowej, a to się zmieni w przyszłości. Jeśli więc możesz wytrzymać do końca 2013 r., Może istnieć gotowe rozwiązanie do użycia.

[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
źródło
1

jest tu coś takiego jak pytanie: Jak ponownie rzutować warstwy podstawowe w OpenLayers? i otrzymujesz informacje o transformacji, powinieneś to sprawdzić, Tworzenie sferycznych obrazów rastrowych Mercator.

Podsumowując krótko od pierwszego postu:

  1. OpenLayers mogą przekształcać warstwy wektorowe (jak WFS).
  2. Warstwy rastrowe nie mogą być przekształcane przez OpenLayers.
  3. Każdy dobry WMS powinien być w stanie zrobić dla ciebie reprojection.
  4. ArcGIS Server nie może dostarczyć warstw w 900913, ponieważ ten wkid nie jest obsługiwany. 3857, z drugiej strony ...!

i z drugiego linku:

Jednym z powodów, dla których projekcja sferycznego Mercatora jest tak ważna, jest to, że jest to jedyna projekcja, która pozwoli poprawnie nałożyć dane obrazu na warstwy komercyjne, takie jak Google Maps. Podczas korzystania z obrazów rastrowych w przeglądarce nie można ponownie wyrenderować obrazów w taki sam sposób, jak w „grubym” kliencie GIS. Zamiast tego wszystkie obrazy muszą być w tej samej projekcji. Sposób tworzenia rzutowanych kafelków Spherical Mercator zależy od oprogramowania używanego do generowania obrazów.

Ważne jest tutaj:

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.

i przekształcania zbioru danych, moja odpowiedź może pomóc o tym tutaj .

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
Dodałem kod z proj4js, który działa w przypadku nakładek, ale nie w przypadku 2 różnych warstw bazowych.
kinkajou
1

Skonfiguruj warstwę WMS bez żadnego odniesienia do 900913 (zakładając, że Twoje dane to 4326). Następnie, gdy dodajesz warstwę do OpenLayers, upewnij się, że ustawiłeś rzut mapy na 900913 (lub po prostu pamiętaj, aby najpierw dodać Mapy Google). Następnie, gdy dodasz warstwę WMS, OpenLayers zażąda danych w odwzorowaniu mapy (900913), a GeoServer przerzuci w locie od 4326 do 900913.

Ian Turton
źródło
Dodano kod. Podczas przełączania między tymi warstwami występuje problem. Kiedy najpierw ładuję warstwę WGS 4326 jako warstwę podstawową i utrzymuję poziom powiększenia, wszystko jest w porządku po przełączeniu się na warstwę Google i nieco przesunięciu mapy, wszystko zniknęło.
kinkajou
Zmień map.addLayers ([dsb, dG, gmap_gs]); do map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
pokazuje mapę Google przy pierwszym załadowaniu, ale nadal nie może przełączyć warstwy. Błąd podczas przełączania
kinkajou
0

Zasadniczo nie jest to możliwe, ponieważ OpenLayers ustawia rzut mapy z warstwy podstawowej.

Jednym z możliwych obejść jest zastosowanie kaskadowego WMS, takiego jak GeoServer, do ponownego rzutowania jednej z warstw podstawowych z jednej na drugą projekcję.

Ian Turton
źródło