Kartenprojektion in OpenLayers


22

Ich möchte einige Daten mit der Projektion WGS-84 auf dem Google-Karten-Layer in OpenLayers überlagern. Aber ich kann sie einfach nicht am richtigen Ort machen. Ich habe folgendes gemacht:

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

Ich habe zwar eine veclayer4326-Projektion zugewiesen , diese wird jedoch immer noch als 900913 interpretiert, und das Anzeigekoordinationssystem ist ebenfalls 900913, obwohl ich displayProjection auf 4326 gesetzt habe. Welchen Fehler mache ich?

Antworten:


16

Ich bin ein großer Fan von "preFeatureInsert" ....

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

Aha, es funktioniert! Vielen Dank. Aber ich frage mich, was die Eigenschaft preFeatureInsertbedeutet. Ich kann sie ohnehin nicht in der offiziellen API-Dokumentation finden
ChanDon,

1
Soweit es mich betrifft, transformiert es die Projektionen wie definiert, bevor das Feature eingefügt wird ... Schön und allgemein, und keine Notwendigkeit für Konvertierungsfunktionen usw.
CatchingMonkey

6

Sie haben ein Leerzeichen nach dem Doppelpunkt. Projection("EPSG: 4326")sollte eigentlich Projection("EPSG:4326")kein platz vorher sein 4326.


Haha, es funktioniert wirklich! Ich meine für die Displayprojektion. Die überlagerten Daten befinden sich jedoch immer noch nicht am richtigen Ort (am selben falschen Ort wie zuvor). Irgendwelche Ideen?
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()],
         });

Ich habe mein altes Code-Snippet gepostet. Ich erinnere mich, dass der Clou in den Projektionen ist. addTransform sollte Ihr Problem lösen. (proj4)


Danke für deine Hilfe. Aber es scheint nicht zu Arbeit
Chandon

1

Sie könnten dorthin fallen, weil Sie auf Google Maps nach einer leicht versetzten Vektordarstellung suchen, während dies auf anderen Basis-Layern in Ordnung ist und die Umwandlung von EPSG: 4326 in EPSG: 900913 oder EPSG: 3857 nicht alles löst.

Es gibt einen Fehler in Google Maps, der die Div-Größe beim Initiieren des OpenLayers-Kartenobjekts nicht gut auswertet, wenn es noch nicht sichtbar ist. Nach dem Aufruf von transform () & redraw () müssen Sie möglicherweise myMapObject.updateSize();Google den tatsächlichen Anteil Ihrer Karte auf dem Bildschirm mitteilen.

Wenn Sie nach einer generischen Lösung suchen, um Ebenen von einer Projektion in eine andere zu transformieren, können Sie diese Funktion verwenden:

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

Bei Yahoo können Sie diese Optionen ausprobieren:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.