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 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 la veclayerproyección 4326, pero todavía se interpreta como 900913, y el sistema de coordinación de visualización también es 900913, aunque configuré displayProjection en 4326. ¿Qué error cometo?

ChanDon
fuente

Respuestas:

16

Soy un gran admirador de "preFeatureInsert" ...

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });
AtraparMono
fuente
¡Ajá, funciona! Muchas gracias. Pero me pregunto qué preFeatureInsertsignifica la propiedad , de todos modos, no puedo encontrarla en el documento oficial de API ~
ChanDon
1
En lo que concierne im, transforma las proyecciones como se define, antes de insertar la función ... Niza y genérica, y sin necesidad de funciones de conversión etc.
CatchingMonkey
6

Tienes un espacio después del colon. Projection("EPSG: 4326")en realidad debería ser Projection("EPSG:4326"), no hay espacio antes 4326.

Vadim
fuente
Jaja realmente funciona! Me refiero a la proyección de la pantalla. Sin embargo, los datos superpuestos todavía no están en el lugar correcto (el mismo lugar incorrecto que antes). ¿Algunas ideas?
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()],
         });

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

Styp
fuente
Gracias por tu ayuda. Pero parece que no funciona
ChanDon
1

Puede caer allí porque está buscando una representación vectorial ligeramente desplazada en Google Maps, mientras que está bien en otras capas base y la transformación de 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 div al iniciar el objeto OpenLayers Map si aún no está visible. Entonces, después de las llamadas transform () y redraw (), es posible que deba hacer myMapObject.updateSize();para que Google sepa 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, puede 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à!

Le Droid
fuente
0

Para Yahoo puedes probar estas opciones:

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