เส้นโครงแผนที่ใน OpenLayers


22

ฉันต้องการซ้อนทับข้อมูลบางส่วนที่มีการฉายเป็น WGS-84 ในเลเยอร์แผนที่ Google ใน OpenLayers แต่ฉันไม่สามารถทำให้พวกเขาในสถานที่ที่เหมาะสม ฉันทำดังนี้

map = new OpenLayers.Map('map', {           
        numZoomLevels: 20,
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG: 4326")
        });
googlelayer = new OpenLayers.Layer.Google("Google street", {sphericalMercator: true});
map.addLayer(googlelayer);
veclayer = new OpenLayers.Layer.Vector("vector", {
                                    projection: map.displayProjection
                                    };
var geojson_format = new OpenLayers.Format.GeoJSON();
veclayer.addFeatures(geojson_format.read(jsonData));

แม้ว่าฉันได้กำหนดveclayerไว้ในการฉาย 4326 แต่ก็ยังตีความว่าเป็น 900913 และระบบการประสานการแสดงผลยังเป็น 900913 แต่ฉันตั้ง displayProject เป็น 4326 ฉันทำอะไรผิด

คำตอบ:


16

ฉันเป็นแฟนตัวยงของ "preFeatureInsert" ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });

อ้ามันใช้งานได้! ขอบคุณมาก. แต่ฉันสงสัยว่าทรัพย์สินนั้นpreFeatureInsertหมายถึงอะไรฉันไม่สามารถหามันได้ใน API ทางการของทางการ ~ ~
ChanDon

1
เท่าที่ฉันกังวลมันเปลี่ยนการคาดการณ์ตามที่กำหนดไว้ก่อนที่จะมีการแทรกคุณสมบัติ ... ดีและทั่วไปและไม่จำเป็นต้องใช้ฟังก์ชั่นการแปลง ฯลฯ
CatchingMonkey

6

คุณมีช่องว่างหลังลำไส้ใหญ่ Projection("EPSG: 4326")ที่จริงควรจะไม่มีช่องว่างก่อนProjection("EPSG:4326")4326


ฮ่าฮ่ามันใช้งานได้จริง! ฉันหมายถึงการฉายภาพที่แสดง อย่างไรก็ตามข้อมูลที่วางซ้อนนั้นยังไม่อยู่ในตำแหน่งที่ถูกต้อง ความคิดใด ๆ
ChanDon

2
               map = new OpenLayers.Map('map',
                { numZoomLevels: 19,
                  units: 'm',
                  eventListeners: {"moveend": update_movend},
                  projection: new OpenLayers.Projection("EPSG:900913"),
                  displayProjection: new OpenLayers.Projection("EPSG:4326")

                });

        OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:900913", OpenLayers.Layer.SphericalMercator.projectForward);
        OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:4326", OpenLayers.Layer.SphericalMercator.projectInverse);


        var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
        var layerTah = new OpenLayers.Layer.OSM.Osmarender("Osmarender");

        var gphy = new OpenLayers.Layer.Google(
            "Google Physical",
            {
                type: google.maps.MapTypeId.TERRAIN
            }
        );
//        gphy = map.projection;

        var gmap = new OpenLayers.Layer.Google(
            "Google Streets",
            {
                numZoomLevels: 20,
            }
        );
        //gmap = map.projection;

        layerMapnik.projection = map.projection;
        layerTah.projection = map.projection;

        vectors = new OpenLayers.Layer.Vector("Vector Layer");

          var help_layer = new OpenLayers.Layer.Vector("Waypoints", {
             projection: map.displayProjection,
             strategies: [new OpenLayers.Strategy.Fixed()],
         });

ฉันโพสต์ข้อมูลโค้ดเก่าของฉัน ฉันจำได้ว่า clou อยู่ในการคาดการณ์ addTransform ควรแก้ปัญหาของคุณ (proj4)


ขอขอบคุณสำหรับความช่วยเหลือของคุณ. แต่ดูเหมือนจะไม่ทำงาน
ChanDon

1

คุณอาจล้มเพราะคุณกำลังมองหาตัวแทนเวกเตอร์ที่ชดเชยเล็กน้อยบน Google แผนที่ในขณะที่มันใช้ได้ดีกับเลเยอร์ฐานอื่น ๆ และเปลี่ยน EPSG: 4326 เป็น EPSG: 900913 หรือ EPSG: 3857 ไม่ได้แก้ปัญหาทุกอย่าง

มีข้อบกพร่องใน Google Maps ที่ไม่ได้ประเมินขนาด div ที่ดีเมื่อเริ่มต้นวัตถุแผนที่ OpenLayers หากยังไม่สามารถมองเห็นได้ ดังนั้นหลังจากการแปลง () & วาดใหม่ () โทรคุณอาจต้องทำmyMapObject.updateSize();เพื่อให้ Google ทราบสัดส่วนที่แท้จริงของแผนที่บนหน้าจอ

หากคุณกำลังมองหาโซลูชันทั่วไปเพื่อแปลงเลเยอร์จากการฉายภาพหนึ่งไปยังอีกฉายภาพคุณสามารถใช้ฟังก์ชันนี้:

var myMap = new OpenLayers.Map('mapDiv');

function mapBaseLayerChanged(evtObj) {
  var mapProj, baseProj, map_this, newBase;
  map_this = this;
  newBase = evtObj.layer;
  mapProj = (map_this.projection && map_this.projection instanceof OpenLayers.Projection) ?
            map_this.projection : new OpenLayers.Projection(map_this.projection);
  baseProj = newBase.projection;
  if (!(baseProj.equals(mapProj))) {
     var center, maxExt;
     center = map_this.getCenter().transform(mapProj, baseProj);
     maxExt = newBase.maxExtent;
     map_this.projection = baseProj;
     map_this.maxExtent = maxExt;
     map_this.setCenter(center, map_this.getZoom(), false, true);
     // Transforms all sub-layers
     for (var i = 0; i < map_this.layers.length; i++) {
        if (map_this.layers[i].isBaseLayer == false) {
           map_this.layers[i].addOptions({projection: baseProj}, true);
           // Transforms all features of the vectors
           for (var j = 0; j < map_this.layers[i].features.length; j++) {
              map_this.layers[i].features[j].geometry.transform(mapProj, baseProj);
           }
           map_this.layers[i].redraw();
        }
     }
     //Solves Google's problem (and mine at the same occasion)
     map_this.updateSize();
  }
}
myMap.events.register('changebaselayer', myMap, mapBaseLayerChanged);

และอื่น ๆ !


0

สำหรับ Yahoo คุณสามารถลองใช้ตัวเลือกเหล่านี้:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.