Proyección de mapas en OpenLayers

22

Quiero superponer algunos datos cuya proyección es WGS-84 en la capa de mapa de Google en OpenLayers. Pero simplemente no puedo hacerlos en el lugar correcto. Hice lo siguiente:

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

Aunque he asignado veclayer en la proyección 4326, pero todavía se interpreta como 900913, y el sistema de coordinación de la pantalla también es 900913, aunque establezco displayProjection en 4326. ¿Qué error hago?

    
pregunta ChanDon 18.11.2011 - 03:54

5 respuestas

16

Soy un gran fan de "preFeatureInsert" ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });
    
respondido por el CatchingMonkey 18.11.2011 - 10:33
6

Tienes un espacio después de los dos puntos. Projection("EPSG: 4326") debería ser Projection("EPSG:4326") , sin espacio antes de 4326 .

    
respondido por el Vadim 18.11.2011 - 06:38
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()],
         });

Publiqué mi viejo fragmento de código. Recuerdo que el clou está en las proyecciones. addTransform debería resolver su problema. (proj4)

    
respondido por el Styp 18.11.2011 - 10:06
1

Puede caer allí porque está buscando una representación vectorial ligeramente desplazada en Google Maps mientras está bien en otras capas base y transformando EPSG: 4326 a EPSG: 900913 o EPSG: 3857 no resuelve todo.

Hay un error en Google Maps que no evalúa bien el tamaño del div cuando se inicia el objeto OpenLayers Map si aún no está visible. Así que después de la transformación () & Para redibujar (), es posible que deba hacer myMapObject.updateSize(); para que Google conozca la proporción real de su mapa en la pantalla.

Si está buscando una solución genérica para transformar capas de una proyección a otra, podría usar esta función:

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

    
respondido por el Le Droid 16.01.2014 - 02:04
0

Para Yahoo puedes probar estas opciones:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
    
respondido por el Ivan Malyshev 18.04.2013 - 14:12

Lea otras preguntas en las etiquetas