Chiếu bản đồ trong OpenLayers


22

Tôi muốn phủ một số dữ liệu có phép chiếu là WGS-84 trên lớp bản đồ Google trong OpenLayers. Nhưng tôi không thể làm cho chúng ở đúng nơi. Tôi đã làm như sau:

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

Mặc dù tôi đã chỉ định veclayertrong phép chiếu 4326, nhưng nó vẫn được hiểu là 900913 và hệ thống phối hợp hiển thị cũng là 900913, mặc dù tôi đã đặt displayProjection thành 4326. Tôi mắc lỗi gì?

Câu trả lời:


16

Tôi là một fan hâm mộ lớn của "preFeatureInsert" ....

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

Aha, nó hoạt động! Cảm ơn nhiều. Nhưng tôi tự hỏi tài sản preFeatureInsertcó nghĩa là gì, dù sao đi nữa, tôi không thể tìm thấy nó trong tài liệu API chính thức ~
ChanDon

1
Theo như tôi quan tâm, nó biến đổi các phép chiếu như được xác định, trước khi tính năng được chèn ... Đẹp và chung chung, và không cần các chức năng chuyển đổi, v.v.
CatchingMonkey

6

Bạn có một không gian sau dấu hai chấm. Projection("EPSG: 4326")nên thực sự Projection("EPSG:4326"), không có không gian trước 4326.


Haha nó thực sự hoạt động! Tôi có nghĩa là cho màn hình hiển thị. Tuy nhiên, dữ liệu bị che khuất vẫn không ở đúng nơi (sai địa điểm như trước). Có ý kiến ​​gì không?
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()],
         });

Tôi đã đăng đoạn mã cũ của tôi. Tôi nhớ rằng clou là trong các dự đoán. addTransform sẽ giải quyết vấn đề của bạn. (proj4)


Cảm ơn sự giúp đỡ của bạn. Nhưng có vẻ như nó không hoạt động
ChanDon

1

Bạn có thể rơi vào đó bởi vì bạn đang tìm kiếm một đại diện vectơ bù nhẹ trên Google Maps trong khi nó ổn trên các lớp cơ sở khác và chuyển đổi EPSG: 4326 thành EPSG: 900913 hoặc EPSG: 3857 không giải quyết được mọi thứ.

Có một lỗi trên Google Maps không đánh giá tốt kích thước div khi khởi tạo đối tượng Bản đồ OpenLayers nếu nó chưa hiển thị. Vì vậy, sau các cuộc gọi biến đổi () & vẽ lại (), bạn có thể cần phải làm myMapObject.updateSize();để cho Google biết tỷ lệ thực tế của bản đồ của bạn trên màn hình.

Nếu bạn đang tìm kiếm một giải pháp chung để chuyển đổi các lớp từ hình chiếu này sang hình chiếu khác, bạn có thể sử dụng chức năng này:

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

Et voilà!


0

Đối với Yahoo, bạn có thể thử các tùy chọn sau:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
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.