Menggunakan lapisan dasar dari dua proyeksi yang berbeda (Spherical Mercator dan WGS84) di OpenLayers

9

Bagaimana cara menambahkan baselayer dengan dua proyeksi berbeda?

Saya telah menambahkan overlayer dengan proyeksi yang berbeda (EPSG: 4326), tetapi saya perlu menambahkan lapisan dasar dengan berbagai proyeksi

  1. Google Maps
  2. Lapisan vektor saya dengan proyeksi EPSG: 4326

Saya bisa melihat semuanya baik-baik saja dengan Google Maps tetapi ketika saya beralih lapisan dasar ke EPSG: lapisan 4326 semuanya putih.

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
sumber

Jawaban:

5

Saya telah melihat ini baru-baru ini, dan ini adalah salah satu hasil pencarian teratas, saya pikir saya akan menambahkan beberapa remah roti untuk penelitian dan eksperimen saya.

Panjang dan pendek:

Garis 2.X dari Open Layers tidak mendukung ini. Peta, sifat-sifatnya seperti pusat, resolusi, dan luasan ditetapkan oleh lapisan dasar AWAL peta. Ubah ke lapisan dasar lain JANGAN sesuaikan properti ini, sehingga hasilnya tidak diketahui. Seringkali, Anda mendapatkan titik pusat / batas yang tidak valid untuk lapisan dasar yang Anda ubah, sehingga Anda melihat ubin putih. Tapi itu bukan SELALU hasilnya (misalnya, beralih dari 4326 ke 900913 akan membawa Anda ke titik dekat dengan 0degN, 0degE).

Tapi, harapan tidak hilang.

Jangka waktu dekat:

Beberapa tambalan ditulis melawan lapisan terbuka yang berupaya menambal ini untuk peta dan banyak lapisan (lihat [1]). Ini berasal dari bug yang diajukan lebih dari 6 (6 !!!) tahun yang lalu [2]. Meskipun Anda harus meng-host versi OL Anda sendiri dan menambalnya dengan tangan (tambalan tidak akan berlaku bersih untuk versi terbaru, jadi Anda harus secara manual melakukan edit), ini akan membuat Anda lebih banyak berada di tempat yang Anda inginkan. Sangat kejam, dan tidak menangani semuanya, tetapi secara keseluruhan, membuat seseorang yang MEMBUTUHKAN banyak penengah dengan proyeksi berbeda di kaki mereka.

Jangka panjang:

Ini persis salah satu hal yang ingin ditangani oleh OpenLayers 3.0 [3].

Salah satu contoh adalah dikotomi lapisan dasar / overlay. Seringkali merupakan tantangan untuk mengetahui bagaimana dan di mana mengatur resolusi, maxExtent, dll untuk peta. Penanganan proyeksi antara peta dan lapisan dan interaksi antara proyeksi dan properti seperti maxExtent dan pusat sangat rumit.

Objek Peta di 2.X terlalu bergantung pada lapisan dasar, dan itu akan berubah ke depan. Jadi, jika Anda bisa bertahan hingga akhir 2013, mungkin ada solusi pra-dibuat untuk Anda gunakan.

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

ada sesuatu sebagai pertanyaan Anda di sini, Bagaimana cara memproyeksi ulang lapisan dasar di OpenLayers? dan Anda mendapatkan beberapa informasi tentang transformasi, Anda harus melihat ini, Membuat Spherical Mercator Raster Images.

untuk meringkas secara singkat dari pos pertama:

  1. OpenLayers dapat mengubah layer vektor (seperti WFS).
  2. Layers Raster tidak dapat diubah oleh OpenLayers.
  3. WMS yang baik harus dapat melakukan proyeksi ulang untuk Anda.
  4. ArcGIS Server tidak dapat menyediakan lapisan di 900913 karena wkid itu tidak didukung. 3857, di sisi lain ...!

dan dari tautan kedua:

Salah satu alasan mengapa proyeksi Spherical Mercator sangat penting adalah bahwa itu adalah satu-satunya proyeksi yang akan memungkinkan untuk overlay data gambar di atas lapisan komersial seperti Google Maps dengan benar. Saat menggunakan gambar raster, di browser, tidak mungkin memproyeksi ulang gambar dengan cara yang sama seperti di klien GIS 'tebal'. Sebagai gantinya, semua gambar harus dalam proyeksi yang sama. Cara membuat ubin proyeksi Spherical Mercator tergantung pada perangkat lunak yang Anda gunakan untuk menghasilkan gambar Anda.

Yang penting ada di sini:

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.

dan untuk mengubah dataset, jawaban saya dapat membantu Anda mengenai hal ini, di sini .

Saya harap ini membantu Anda ...

Aragon
sumber
Saya telah menambahkan kode dengan proj4js yang berfungsi untuk overlay tetapi tidak untuk 2 lapisan dasar yang berbeda.
kinkajou
1

Atur layer WMS Anda tanpa referensi ke 900913 (dengan asumsi data Anda ada di 4326). Kemudian ketika Anda menambahkan layer ke OpenLayers pastikan bahwa Anda telah menetapkan proyeksi peta ke 900913 (atau pastikan untuk menambahkan Google Maps terlebih dahulu). Kemudian ketika Anda menambahkan lapisan WMS, OpenLayers akan meminta data dalam proyeksi peta (900913) dan GeoServer akan memproyeksikan ulang dari 4326 menjadi 900913 dengan cepat.

Ian Turton
sumber
Menambahkan kode. Ada masalah saat berpindah antar lapisan ini. Ketika saya memuat lapisan dengan WGS 4326 pertama sebagai lapisan dasar dan mempertahankan tingkat zoom tidak apa-apa setelah saya beralih ke lapisan google dan menggeser peta sedikit semua itu hilang.
kinkajou
Ubah map.addLayers ([dsb, dG, gmap_gs]); ke map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton
memperlihatkan google map pada pemuatan pertama tetapi masih tidak bisa mengganti layer Kesalahan saat beralih
kinkajou
0

Secara umum ini tidak mungkin karena OpenLayers menetapkan proyeksi peta dari lapisan dasar.

Salah satu cara yang mungkin dilakukan adalah menggunakan WMS cascading seperti GeoServer untuk memproyeksi ulang salah satu lapisan dasar dari satu ke proyeksi lainnya.

Ian Turton
sumber