Proyeksi peta di OpenLayers

22

Saya ingin overlay beberapa data yang proyeksi WGS-84 di layer peta Google di OpenLayers. Tapi saya tidak bisa membuatnya di tempat yang tepat. Saya melakukan sebagai berikut:

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

Meskipun saya telah menetapkan veclayerproyeksi 4326, tetapi masih ditafsirkan sebagai 900.913, dan sistem koordinasi tampilan juga 900.913, meskipun saya mengatur tampilan Proyeksi ke 4326. Kesalahan apa yang saya buat?

ChanDon
sumber

Jawaban:

16

Saya penggemar berat "preFeatureInsert" ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });
CatchingMonkey
sumber
Aha, berhasil! Terima kasih banyak. Tapi saya ingin tahu apa arti properti itu preFeatureInsert, bagaimanapun, saya tidak dapat menemukannya di API resmi API ~
ChanDon
1
Sejauh menyangkut saya, itu mengubah proyeksi seperti yang ditentukan, sebelum fitur dimasukkan ... Bagus dan generik, dan tidak perlu untuk fungsi konversi dll.
CatchingMonkey
6

Anda memiliki ruang setelah titik dua. Projection("EPSG: 4326")seharusnya benar-benar Projection("EPSG:4326"), tidak ada ruang sebelumnya 4326.

Vadim
sumber
Haha itu benar-benar berfungsi! Maksud saya untuk proyeksi tampilan. Namun, data overlay masih belum di tempat yang tepat (tempat yang salah sama seperti sebelumnya). Ada ide?
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()],
         });

Saya memposting cuplikan kode lama saya. Saya ingat bahwa mendung ada di proyeksi. addTransform harus menyelesaikan masalah Anda. (proj4)

Styp
sumber
Terima kasih untuk bantuannya. Tapi sepertinya tidak berhasil
ChanDon
1

Anda mungkin jatuh di sana karena Anda mencari representasi vektor yang sedikit diimbangi di Google Maps sementara itu baik-baik saja pada lapisan dasar lainnya dan mengubah EPSG: 4326 menjadi EPSG: 900913 atau EPSG: 3857 tidak menyelesaikan semuanya.

Ada bug di Google Maps yang tidak mengevaluasi dengan baik ukuran div ketika memulai objek OpenLayers Map jika belum terlihat. Jadi setelah mengubah () & redraw () panggilan, Anda mungkin perlu lakukan myMapObject.updateSize();untuk memberi tahu Google proporsi peta Anda yang sebenarnya di layar.

Jika Anda mencari solusi umum untuk mengubah layer dari satu proyeksi ke proyeksi lain, Anda bisa menggunakan fungsi ini:

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

Dan lagi!

Le Droid
sumber
0

Untuk Yahoo Anda dapat mencoba opsi ini:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
Ivan Malyshev
sumber