การใช้เลเยอร์ฐานของการฉายสองแบบที่แตกต่างกัน (Spherical Mercator และ WGS84) ใน OpenLayers


9

ฉันจะเพิ่ม baselayer ด้วยการฉายสองแบบที่แตกต่างกันได้อย่างไร

ฉันได้เพิ่มผู้ซ้อนทับด้วยการฉายภาพที่แตกต่าง (EPSG: 4326) แต่ฉันต้องเพิ่มเลเยอร์ฐานพร้อมการฉายภาพที่หลากหลาย

  1. Google Maps
  2. เลเยอร์เวกเตอร์ของฉันพร้อมการฉาย EPSG: 4326

ฉันเห็นทุกอย่างเรียบร้อยด้วย Google Maps แต่เมื่อฉันเปลี่ยน base layer เป็น EPSG: 4326 layer ทุกอย่างเป็นสีขาว

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

            }

คำตอบ:


5

ฉันได้ตรวจสอบเรื่องนี้เมื่อเร็ว ๆ นี้และนี่เป็นหนึ่งในผลการค้นหาอันดับต้น ๆ ฉันคิดว่าฉันจะเพิ่มเกล็ดขนมปังในการวิจัยและการทดลองของฉัน

ยาวและสั้น:

บรรทัด 2.X ของ Open Layers ไม่รองรับสิ่งนี้ แผนที่คุณสมบัติของมันเช่นกึ่งกลางความละเอียดและขอบเขตถูกกำหนดโดยเลเยอร์พื้นฐานของแผนที่ เปลี่ยนเป็นเลเยอร์ฐานอื่นไม่ปรับคุณสมบัติเหล่านี้ดังนั้นจึงไม่ทราบผลลัพธ์ บ่อยครั้งที่คุณได้รับจุดกึ่งกลาง / ขอบเขตที่ไม่ถูกต้องสำหรับเลเยอร์ฐานที่คุณเปลี่ยนไปดังนั้นคุณจะเห็นแผ่นกระเบื้องสีขาว แต่นั่นไม่ใช่ผลลัพธ์เสมอ (ตัวอย่างเช่นการเปลี่ยนจาก 4326 เป็น 900913 จะทำให้คุณใกล้ถึง 0degN, 0degE)

แต่ความหวังจะไม่สูญหายไป

ระยะเวลาอันใกล้:

แพทช์บางตัวถูกเขียนทับเลเยอร์ที่เปิดซึ่งพยายามแก้ไขสิ่งนี้สำหรับแผนที่และเลเยอร์จำนวนมาก (ดู [1]) สิ่งนี้มาจากข้อผิดพลาดที่ยื่นมาเมื่อ 6 (6 !!!) ปีที่แล้ว [2] ในขณะที่คุณต้องโฮสต์ OL เวอร์ชันของคุณเองและทำการแก้ไขด้วยมือ (แพตช์จะไม่ใช้กับเวอร์ชันล่าสุดอย่างสมบูรณ์ดังนั้นคุณต้องทำการแก้ไขด้วยตนเอง) สิ่งนี้จะทำให้คุณเป็นส่วนใหญ่ในที่ที่คุณต้องการ น่ารังเกียจมากและไม่ได้จัดการทุกอย่าง แต่โดยรวมแล้วทำให้คนที่ต้องการเบสบาเลย์หลายคนมีเส้นโครงที่แตกต่างกัน

ระยะยาว:

นี่เป็นหนึ่งในสิ่งที่ OpenLayers 3.0 หวังที่จะจัดการ [3]

ตัวอย่างหนึ่งคือชั้นฐาน / การซ้อนทับซ้อนกัน มันมักจะเป็นความท้าทายในการทราบวิธีการตั้งค่าความละเอียด maxExtent และอื่น ๆ สำหรับแผนที่ การจัดการฉายภาพระหว่างแผนที่และเลเยอร์และการทำงานร่วมกันระหว่างการฉายภาพและคุณสมบัติเช่น maxExtent และกึ่งกลางนั้นซับซ้อนที่สุด

วัตถุแผนที่ใน 2.X นั้นอาศัยอยู่ที่ชั้นฐานมากเกินไปและนั่นจะเปลี่ยนไปข้างหน้า ดังนั้นหากคุณสามารถระงับได้จนถึงปลายปี 2013 อาจมีวิธีแก้ไขปัญหาล่วงหน้าสำหรับคุณที่จะใช้

[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

มีบางสิ่งที่เป็นคำถามของคุณที่นี่วิธีการปฏิเสธเลเยอร์ฐานใน OpenLayers ได้อย่างไร และคุณได้รับข้อมูลบางอย่างเกี่ยวกับการแปลงภาพคุณควรมองสิ่งนี้การสร้างภาพทรงกลม Raster รูปภาพ

เพื่อสรุปสั้น ๆ จากโพสต์แรก:

  1. OpenLayers สามารถแปลงเลเยอร์เวกเตอร์ (เช่น WFS)
  2. OpenLayers เลเยอร์ Raster ไม่สามารถแปลงได้
  3. WMS ที่ดีใด ๆ จะสามารถทำการคัดค้านให้คุณได้
  4. ArcGIS Server ไม่สามารถให้เลเยอร์ได้ใน 900913 เพราะ wkid นั้นไม่รองรับ 3857 ตรงกันข้าม ... !

และจากลิงค์ที่สอง:

หนึ่งในเหตุผลที่การฉาย Spherical Mercator มีความสำคัญอย่างยิ่งคือมันเป็นเพียงการฉายภาพเพียงอย่างเดียวซึ่งจะช่วยให้สามารถซ้อนทับข้อมูลภาพที่อยู่ด้านบนของเลเยอร์เชิงพาณิชย์อย่าง Google แผนที่ได้อย่างถูกต้อง เมื่อใช้ภาพแรสเตอร์ในเบราว์เซอร์มันเป็นไปไม่ได้ที่จะปฏิเสธภาพในลักษณะเดียวกันกับที่อาจอยู่ในไคลเอนต์ GIS 'หนา' ภาพทั้งหมดจะต้องอยู่ในการฉายภาพเดียวกัน วิธีสร้างแผ่นฉายภาพ Spherical Mercator ขึ้นอยู่กับซอฟต์แวร์ที่คุณใช้ในการสร้างภาพของคุณ

สิ่งสำคัญอยู่ที่นี่:

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.

และสำหรับการเปลี่ยนชุดคำตอบของฉันสามารถช่วยให้คุณเกี่ยวกับเรื่องนี้ที่นี่

ฉันหวังว่ามันจะช่วยคุณ ...


ฉันได้เพิ่มรหัสด้วย proj4js ซึ่งใช้งานได้กับการซ้อนทับ แต่ไม่ใช่สำหรับเลเยอร์ฐานที่ต่างกัน 2 ชั้นความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้หรือไม่?
kinkajou

1

ตั้งค่าเลเยอร์ WMS โดยไม่มีการอ้างอิงใด ๆ ถึง 900913 (สมมติว่าข้อมูลของคุณอยู่ใน 4326) จากนั้นเมื่อคุณเพิ่มเลเยอร์ใน OpenLayers ให้แน่ใจว่าคุณได้ตั้งค่าการฉายภาพของแผนที่เป็น 900913 (หรือเพียงแค่ให้แน่ใจว่าได้เพิ่ม Google Maps ก่อน) จากนั้นเมื่อคุณเพิ่มเลเยอร์ WMS แล้ว OpenLayers จะขอข้อมูลในการฉายแผนที่ (900913) และ GeoServer จะปฏิเสธจาก 4326 ถึง 900913 ทันที


เพิ่มรหัส มีปัญหาเมื่อสลับระหว่างเลเยอร์เหล่านี้ เมื่อฉันโหลดเลเยอร์ด้วย WGS 4326 ก่อนเป็นเลเยอร์ฐานและรักษาระดับการซูมก็โอเคหลังจากฉันเปลี่ยนไปใช้เลเยอร์ google และเลื่อนแผนที่เล็กน้อยมันหายไปทั้งหมด
kinkajou

เปลี่ยน map.addLayers ([dsb, dG, gmap_gs]); ไปที่ map.addLayers ([gmap_gs, dsb, dG]);
Ian Turton

แสดงแผนที่ google เมื่อโหลดครั้งแรก แต่ยังไม่สามารถสลับเลเยอร์ได้ เกิดข้อผิดพลาดขณะเปลี่ยน
kinkajou

0

โดยทั่วไปสิ่งนี้เป็นไปไม่ได้เนื่องจาก OpenLayers ตั้งค่าการฉายภาพของแผนที่จากชั้นฐาน

สิ่งหนึ่งที่เป็นไปได้คือการใช้ WMS แบบเรียงซ้อนเช่น GeoServer เพื่อปฏิเสธเลเยอร์ฐานหนึ่งจากชั้นหนึ่งไปอีกชั้นหนึ่ง


0

ฉันเพิ่งใช้โปรแกรมแก้ไขกับ ol 2.13.1 (จากแท็ก)

ไฟล์ patch ล่าสุดจาก trac ไม่ทำงานเมื่อไม่ได้รับExExentที่ได้รับดังนั้นฉันจึงแก้ไขเช่นกัน

คุณสามารถรับได้ที่นี่พร้อมกับตัวอย่างข้อความ:

https://github.com/glferri/ol2-reproj-2.13.1/blob/master/OL.Reproject_2.13.1_fixRestrictedExtent.patch

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.