Projection cartographique dans OpenLayers

22

Je veux superposer certaines données dont la projection est WGS-84 sur la couche de carte Google dans OpenLayers. Mais je ne peux tout simplement pas les faire au bon endroit. J'ai fait comme suit:

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

Bien que j'aie attribué une veclayerprojection 4326, mais elle est toujours interprétée comme 900913, et le système de coordination d'affichage est également 900913, bien que je règle displayProjection sur 4326. Quelle erreur est-ce que je fais?

ChanDon
la source

Réponses:

16

Je suis un grand fan de "preFeatureInsert" ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });
CatchingMonkey
la source
Aha, ça marche! Merci beaucoup. Mais je me demande ce que preFeatureInsertsignifie la propriété , de toute façon, je ne la trouve pas dans le document officiel de l'API ~
ChanDon
1
En ce qui me concerne, il transforme les projections telles que définies, avant que la fonctionnalité ne soit insérée ... Agréable et générique, et pas besoin de fonctions de conversion, etc.
CatchingMonkey
6

Vous avez un espace après les deux points. Projection("EPSG: 4326")devrait en fait être Projection("EPSG:4326"), pas d'espace avant 4326.

Vadim
la source
Haha ça marche vraiment! Je veux dire pour la projection d'affichage. Cependant, les données superposées ne sont toujours pas au bon endroit (au même endroit qu'auparavant). Des idées?
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()],
         });

J'ai publié mon ancien extrait de code. Je me souviens que le clou est dans les projections. addTransform devrait résoudre votre problème. (proj4)

Styp
la source
Merci de votre aide. Mais cela ne semble pas fonctionner
ChanDon
1

Vous pouvez y tomber parce que vous recherchez une représentation vectorielle légèrement décalée sur Google Maps alors qu'elle convient aux autres couches de base et que la transformation d'EPSG: 4326 en EPSG: 900913 ou EPSG: 3857 ne résout pas tout.

Il y a un bug sur Google Maps qui n'évalue pas bien la taille div lors du lancement de l'objet OpenLayers Map s'il n'est pas encore visible. Ainsi, après les appels transform () et redraw (), vous devrez peut-être faire myMapObject.updateSize();pour que Google sache la proportion réelle de votre carte à l'écran.

Si vous cherchez une solution générique pour transformer des couches d'une projection à une autre, vous pouvez utiliser cette fonction:

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à!

Le Droid
la source
0

Pour Yahoo, vous pouvez essayer ces options:

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