OpenLayers'da harita projeksiyonu


22

OpenLayers'da Google harita katmanında projeksiyonu WGS-84 olan bazı verileri kaplamak istiyorum. Ama onları doğru yerde yapamam. Aşağıdaki gibi yaptım:

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

Yine de atadım veclayer4326 projeksiyonda halde, yine de 900913 olarak yorumlanıyor ve displayProjection'ı 4326 olarak ayarlamama rağmen, ekran koordinasyon sistemi de 900913.

Yanıtlar:


16

Ben preFeatureInsert'ın büyük bir hayranıyım ....

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

Aha, işe yarıyor! Çok teşekkür ederim. Ama mülkün ne preFeatureInsertanlama geldiğini merak ediyorum , zaten, resmi API
belgesinde bulamıyorum

1
İlgilendiğim kadarıyla, projeksiyonları tanımlandığı gibi dönüştürür, özellik eklenmeden önce ... Güzel ve genel ve dönüştürme işlevlerine vb. İhtiyaç duymaz.
CatchingMonkey

6

Kolondan sonra boş yeriniz var. Projection("EPSG: 4326")olmalı Projection("EPSG:4326"), daha önce boşluk kalmamalı 4326.


Haha gerçekten işe yarıyor! Ekran projeksiyonu için yani. Ancak, üst üste binen veriler hala doğru yerde değil (daha önce olduğu gibi aynı yanlış yerde). Herhangi bir fikir?
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()],
         });

Eski kod snippet'imi gönderdim. Pelerinin projeksiyonlarda olduğunu hatırlıyorum. addTransform probleminizi çözmelidir. (Proj4)


Yardımın için teşekkürler. Ama işe yaramaz gibi görünüyor
ChanDon

1

Oraya düşebilirsin, çünkü Google Haritalar’da biraz dengelenmiş bir vektör temsili arıyorsanız, diğer temel katmanlarda gayet iyi ve EPSG: 4326’yı EPSG: 900913 veya EPSG: 3857’ye dönüştürürken her şeyi çözmez.

Google Haritalar’da OpenLayers Map nesnesini başlatırken henüz görünmüyorsa div boyutunu iyi değerlendirmeyen bir hata var. Bu yüzden transform () & redraw () çağrılarından sonra, myMapObject.updateSize();Google’ın haritanızın gerçek oranını ekranda görmesi için yapmanız gerekebilir .

Katmanları bir projeksiyondan diğerine dönüştürmek için genel bir çözüm arıyorsanız, bu işlevi kullanabilirsiniz:

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

Yahoo için şu seçenekleri deneyebilirsiniz:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.