จะวางซ้อน lat / lon points บนเลเยอร์ของ Google ใน OpenLayers 2 ได้อย่างไร


13

ฉันกำลังเพิ่มจุดเวกเตอร์เป็น lat / lon ด้านบนของเลเยอร์ Google ใน OpenLayers จุดกำลังเคลื่อนที่เมื่อฉันเลื่อนแผนที่ สิ่งนี้จะไม่เกิดขึ้นหากฉันแทนที่เลเยอร์ Google ด้วยเลเยอร์ใน WGS84 ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());

var gmap = new OpenLayers.Layer.Google(
            "Google Streets", 
            {numZoomLevels: 20}
           );
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

map.addLayers([gmap,pointLayer]);
map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
pointLayer.addFeatures([pointFeature]);

ฉันพยายามติดตามhttp://docs.openlayers.org/library/spherical_mercator.htmlแต่ไม่ประสบความสำเร็จ


ปัญหาของฉันเกี่ยวข้องกับการใช้ Jquery ในหน้าเดียวกัน ทำงานได้ดีถ้าฉันดึงข้อมูลอ้างอิงทั้งหมดไปที่ Jquery

คำตอบ:


11

คุณต้องเพิ่มการเปลี่ยนแปลงเล็กน้อยเพื่อให้ได้ผลลัพธ์ที่ต้องการ:

  1. เพิ่มsphericalMercator:คุณสมบัติที่แท้จริงไปยังเลเยอร์ Google ของคุณดังนั้นเลเยอร์เวกเตอร์จะแสดงอย่างถูกต้องที่ด้านบนของเลเยอร์ฐาน Google ของคุณ (นี่คือเหตุผลสำหรับเรขาคณิตเลื่อนลอย)
  2. เพิ่มคุณสมบัติ maxExtent ของเลเยอร์ Google ของคุณมิฉะนั้นศูนย์กลางของแผนที่จะไม่ได้รับการตั้งค่าอย่างถูกต้อง ขอบเขตที่แสดงด้านล่างนี้เป็นขอบเขตของโลกใน Mercator พิกัด
  3. ตามที่ผู้ใช้ 1795 ระบุว่าจุดเรขาคณิตของคุณจะต้องมีการจำลองจาก 4326 ไปยัง Web Mercator เพื่อให้ปรากฏบนแผนที่ได้อย่างถูกต้อง
  4. นอกจากนี้ยังนำไปใช้กับ setCenter LonLat ดังนั้นคุณต้องเปลี่ยนมันด้วย

รหัสการทำงานด้านล่าง:

            map = new OpenLayers.Map('map');
            map.addControl(new OpenLayers.Control.LayerSwitcher());

            var proj = new OpenLayers.Projection("EPSG:4326");

            var gmap = new OpenLayers.Layer.Google("Google Streets", {
                sphericalMercator: true,
                'maxExtent': new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34)
            });
            var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

            map.addLayers([gmap, pointLayer]);
            var lonlat = new OpenLayers.LonLat(16.373056, 48.208333);
            lonlat.transform(proj, map.getProjectionObject());
            map.setCenter(lonlat, 5);

            var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
            point = point.transform(proj, map.getProjectionObject());
            //console.log(point);
            var pointFeature = new OpenLayers.Feature.Vector(point, null, null);
            pointLayer.addFeatures([pointFeature]);

มันใช้งานได้ดี! ดูเหมือนว่า OpenLayers นั้นไม่ได้ใช้งานง่ายจริงๆเมื่อพูดถึงการเปลี่ยนแปลง เป็นตัวเลือก 'spericalMercator' ที่เปิดใช้งานการถอดแบบจริงหรือไม่?
underdark

1
ยอมรับว่ามันไม่ง่ายเลย .. ตัวเลือก sphericalMercator จะเพิ่มฟังก์ชั่นต่อไปนี้ที่อนุญาตให้ทำงานกับข้อมูลในโปรเจคอื่น ๆ - dev.openlayers.org/docs/files/OpenLayers/Layer/…
geographika

4

นี่เป็นปัญหาเกี่ยวกับการฉายภาพคุณต้องเปลี่ยนการฉายภาพของจุดเป็นเลเยอร์ฐาน (แผนที่ google ที่นี่) รหัสต่อไปนี้ควรใช้งานได้

    map = new OpenLayers.Map('map');
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    var gmap = new OpenLayers.Layer.Google(
        "Google Streets", 
        {numZoomLevels: 20}
    );
    var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

    map.addLayers([gmap,pointLayer]);
    map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

    var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
    point.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));
    var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
    pointLayer.addFeatures([pointFeature])

นี่เป็นเพราะการฉายภาพเริ่มต้นของแผนที่ google (spherical mercator) คือ 900913 และของจุดง่าย ๆ ใน lonlat ใน 4326

โปรดตรวจสอบให้แน่ใจว่าจุดนั้นถูกตั้งค่าเป็น (ลองจิจูด, ละติจูด) และไม่เป็น (ละติจูด, ลองจิจูด)


การเพิ่มการแปลงทำให้จุดหายไปบนแผนที่ของฉัน เวอร์ชั่น OpenLayers ของฉันคือ 2.9.1 ถ้ามันสร้างความแตกต่าง
underdark

จุดเปลี่ยนรูปทำหน้าที่หลอกฉัน!
Stefan

1

เมื่อคุณทำงานกับ Google Maps JS API คุณควรระมัดระวังเกี่ยวกับเวอร์ชัน มีค่าเริ่มต้นให้ใช้งานกับเวอร์ชันการพัฒนา Google JS Maps API ตรวจสอบหน้า: http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

และทีมงาน Google แผนที่ JS ก็แก้ไขบั๊กด้วย ตรวจสอบhttp://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog

ในอนาคตให้กล่าวถึงเวอร์ชันของ Google Maps API ในคำถาม v3.3 ไม่มีปัญหาใด ๆ กับ Openlayers ซึ่งนักพัฒนาซอฟต์แวร์ส่วนใหญ่ใช้


สวัสดี, ฉันไม่แน่ใจว่าเวอร์ชัน Google API JS API มีผลกับปัญหาของฉันกับ OpenLayers อย่างไร
underdark

สวัสดี Underdark ฉันมีปัญหากับ v3.4 เมื่อฉันใช้กับ Openlayers และจากนั้นใช้ 3.3 โดยเฉพาะและเมื่อใช้รุ่นของ Google Maps trunk ผลลัพธ์ไม่อาจคาดการณ์ได้ว่าเป็นการพัฒนาอย่างต่อเนื่อง คุณได้ลองกับเวอร์ชันแล้วหรือยัง แม้ว่าคุณจะใช้ openlayers แต่ Google maps จะอ้างอิงถึงสิ่งนั้น
Senthil

0

ฉันคิดว่ามันเป็นปัญหาการฉายภาพ

คุณลองรายงานเซนทรอยด์ของจุดเมื่อแผนที่กะทะไหม? คุณอาจสามารถดูว่ามีการเปลี่ยนแปลงบางอย่างหรือไม่

แต่จากสิ่งที่ฉันเห็นจากรหัสของคุณคุณจะต้องเพิ่ม WGS84 ชี้ไปที่ corordsys ที่แตกต่างกัน


โดยวิธีการที่คุณได้ลองสอบถามการฉายภาพของแผนที่ที่คุณมีเพื่อดูว่ามันตั้งจริงหรือไม่?
ขน

และสุดท้ายขอโทษ แต่มีวิธีที่จะเปลี่ยนจุดของคุณหากคุณมีปัญหาการฉาย havign: var a = ใหม่ OpenLayers.LonLat (3,53) .transform (ll, ใหม่ OpenLayers.Project ('EPSG: 900913') ;
ขน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.