Sử dụng lớp cơ sở của hai phép chiếu khác nhau (Spherical Mercator và WGS84) trong OpenLayers


9

Làm cách nào để thêm baselayer với hai hình chiếu khác nhau?

Tôi đã thêm lớp phủ với một phép chiếu khác nhau (EPSG: 4326), nhưng tôi cần thêm lớp cơ sở với các phép chiếu khác nhau

  1. bản đồ Google
  2. Lớp vectơ của tôi với phép chiếu EPSG: 4326

Tôi có thể thấy mọi thứ đều ổn với Google Maps nhưng khi tôi chuyển lớp cơ sở sang lớp EPSG: 4326, mọi thứ đều có màu trắng.

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

            }

Câu trả lời:


5

Gần đây tôi đã xem xét điều này và đây là một trong những kết quả tìm kiếm hàng đầu, tôi cho rằng tôi sẽ thêm một số mẩu bánh mì vào nghiên cứu và thử nghiệm của mình.

Dài và ngắn:

Dòng 2.X của Lớp mở không hỗ trợ điều này. Bản đồ, thuộc tính của nó như trung tâm, độ phân giải và phạm vi được đặt bởi lớp cơ sở INITIAL của bản đồ. Thay đổi sang lớp cơ sở khác KHÔNG điều chỉnh các thuộc tính này, vì vậy kết quả là không xác định. Thông thường, bạn nhận được một điểm trung tâm / giới hạn không hợp lệ cho lớp cơ sở mà bạn đang thay đổi, vì vậy bạn thấy các ô màu trắng. Nhưng đó không phải là LUÔN LUÔN kết quả (ví dụ: chuyển từ 4326 sang 900913 sẽ đưa bạn đến một điểm gần với 0degN, 0degE).

Nhưng, hy vọng không mất.

Ngắn hạn:

Một số bản vá được viết chống lại các lớp mở cố gắng vá lỗi này cho bản đồ và nhiều lớp (xem [1]). Điều này xuất phát từ một lỗi được nộp hơn 6 (6 !!!) năm trước [2]. Mặc dù bạn phải lưu trữ phiên bản OL của riêng mình và vá nó bằng tay (bản vá sẽ không áp dụng sạch cho các phiên bản mới nhất, do đó bạn phải tự chỉnh sửa), điều này sẽ giúp bạn chủ yếu đến nơi bạn muốn. Rất khó chịu, và không xử lý tất cả mọi thứ, nhưng nhìn chung, có một người CẦN nhiều người đi bộ với các hình chiếu khác nhau trên đôi chân của họ.

Dài hạn:

Đây chính xác là một trong những điều mà OpenLayers 3.0 đang hy vọng giải quyết [3].

Một ví dụ là sự phân đôi lớp cơ sở / lớp phủ. Việc tìm cách đặt độ phân giải, maxExtent, v.v. cho bản đồ thường là một thách thức. Xử lý phép chiếu giữa bản đồ và các lớp và sự tương tác giữa phép chiếu và các thuộc tính như maxExtent và trung tâm là phức tạp nhất.

Đối tượng Map trong 2.X phụ thuộc quá nhiều vào lớp cơ sở và điều đó sẽ thay đổi trong tương lai. Vì vậy, nếu bạn có thể cầm cự đến cuối năm 2013, có thể có một giải pháp được tạo sẵn để bạn sử dụng.

[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ó một cái gì đó như câu hỏi của bạn ở đây, Làm thế nào để từ chối các lớp cơ sở trong OpenLayers? và bạn nhận được một số thông tin về chuyển đổi, bạn nên xem cái này, Tạo hình ảnh Raster Mercator hình cầu.

để tóm tắt ngắn gọn từ bài đầu tiên:

  1. OpenLayers có thể biến đổi các lớp vectơ (như WFS).
  2. Các lớp raster không thể được chuyển đổi bởi OpenLayers.
  3. Bất kỳ WMS tốt nào cũng có thể thực hiện việc từ chối cho bạn.
  4. ArcGIS Server không thể cung cấp các lớp trong 900913 vì wkid không được hỗ trợ. 3857, mặt khác ...!

và từ liên kết thứ hai:

Một trong những lý do mà phép chiếu Mercator hình cầu rất quan trọng là vì nó là phép chiếu duy nhất cho phép phủ dữ liệu hình ảnh lên trên các lớp thương mại như Google Maps. Khi sử dụng hình ảnh raster, trong trình duyệt, không thể chiếu lại hình ảnh theo cách tương tự như trong máy khách GIS 'dày'. Thay vào đó, tất cả các hình ảnh phải ở trong cùng một hình chiếu. Cách tạo các ô được chiếu hình cầu Spatorical Mercator phụ thuộc vào phần mềm bạn đang sử dụng để tạo hình ảnh của mình.

Điều quan trọng là ở đây:

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.

và để chuyển đổi tập dữ liệu, câu trả lời của tôi có thể giúp bạn về điều này, ở đây .

Tôi hy vọng nó sẽ giúp bạn...


Tôi đã thêm mã với proj4js hoạt động cho lớp phủ nhưng không cho 2 lớp cơ sở khác nhau có nhận xét gì về điều này?
kinkajou

1

Thiết lập lớp WMS của bạn với bất kỳ tham chiếu nào đến 900913 (giả sử dữ liệu của bạn nằm trong 4326). Sau đó, khi bạn thêm lớp vào OpenLayers, hãy đảm bảo rằng bạn đã đặt phép chiếu của bản đồ thành 900913 (hoặc chỉ cần đảm bảo thêm Google Maps trước). Sau đó, khi bạn thêm lớp WMS, OpenLayers sẽ yêu cầu dữ liệu trong phép chiếu bản đồ (900913) và GeoServer sẽ phân phối lại từ 4326 đến 900913 khi đang di chuyển.


Đã thêm mã. Có vấn đề khi chuyển đổi giữa các lớp này. Khi tôi tải lớp với WGS 4326 trước tiên là lớp cơ sở và duy trì mức thu phóng thì không sao sau khi tôi chuyển sang lớp google và xoay bản đồ một chút thì mọi thứ đã biến mất.
kinkajou

Thay đổi map.addLayers ([dsb, dG, gmap_gs]); vào map.addLayers ([gmap_ss, dsb, dG]);
Ian Turton

hiển thị google map khi tải lần đầu nhưng vẫn không thể chuyển lớp. Lỗi trong khi chuyển đổi
kinkajou

0

Nói chung, điều này là không thể vì OpenLayers thiết lập phép chiếu bản đồ từ lớp cơ sở.

Một công việc có thể xảy ra là sử dụng một WMS xếp tầng như GeoServer để định hướng lại một trong các lớp cơ sở từ lớp này sang lớp chiếu khác.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.