Suite

Projection de carte dans OpenLayers

Projection de carte dans OpenLayers


Je souhaite superposer certaines données dont la projection est WGS-84 sur la couche de carte Google dans OpenLayers. Mais je ne peux 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); veclaer = new OpenLayers.Layer.Vector("vector", { projection: map.displayProjection }; var geojson_format = new OpenLayers.Format.GeoJSON(); veclaer.addFeatures(geojson_format.read(jsonData));

Bien que j'aie assignéveclayerdans la projection 4326, mais il est toujours interprété comme 900913, et le système de coordination d'affichage est également 900913, bien que j'aie défini displayProjection sur 4326. Quelle erreur dois-je faire ?


Je suis un grand fan de "preFeatureInsert"…

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

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


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", { tapez : 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, stratégies : [new OpenLayers.Strategy.Fixed()], });

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


Vous pouvez tomber là parce que vous recherchez une représentation vectorielle légèrement décalée sur Google Maps alors que cela convient sur d'autres couches de base et transformer 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 du div lors de l'initialisation de l'objet OpenLayers Map s'il n'est pas encore visible. Donc, après les appels transform() et redraw(), vous devrez peut-être fairemyMapObject.updateSize();pour informer Google de la proportion réelle de votre carte à l'écran.

Si vous cherchez une solution générique pour transformer des calques 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 = ceci; newBase = evtObj.layer; mapProj = (map_this.projection && map_this.projection instanceof OpenLayers.Projection) ? map_this.projection : nouveau OpenLayers.Projection(map_this.projection); baseProj = nouvelleBase.projection; if (!(baseProj.equals(mapProj))) { var center, maxExt; center = map_this.getCenter().transform(mapProj, baseProj); maxExt = nouvelleBase.maxExtent; map_this.projection = baseProj; map_this.maxExtent = maxExt; map_this.setCenter(center, map_this.getZoom(), false, true); // Transforme toutes les sous-couches pour (var i = 0; i < map_this.layers.length; i++) { if (map_this.layers[i].isBaseLayer == false) { map_this.layers[i].addOptions({ projection : baseProj}, true); // Transforme toutes les caractéristiques des vecteurs pour (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(); } } //Résout le problème de Google (et le mien à la même occasion) map_this.updateSize(); } } myMap.events.register('changebaselayer', myMap, mapBaseLayerChanged);

Et voilà!


Pour Yahoo, vous pouvez essayer ces options :

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

Voir la vidéo: Openlayers 6 Tutorial #9 - Interaction With Vector Features