Come sovrapporre punti lat / lon su un livello Google in OpenLayers 2?


13

Sono bloccato aggiungendo un punto vettoriale in lat / lon sopra un livello di Google in OpenLayers. Il punto si sposta quando eseguo una panoramica della mappa. Ciò non accade se sostituisco il livello Google con un livello in WGS84. Come posso risolvere questo problema?

map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());

var gmap = new OpenLayers.Layer.Google(
            "Google Streets", 
            {numZoomLevels: 20}
           );
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

map.addLayers([gmap,pointLayer]);
map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
pointLayer.addFeatures([pointFeature]);

Ho provato a seguire http://docs.openlayers.org/library/spherical_mercator.html ma senza successo.


Il mio problema è legato all'uso di Jquery sulla stessa pagina. Funziona bene se recupero tutti i riferimenti a Jquery.

Risposte:


11

È necessario aggiungere alcune modifiche per ottenere i risultati richiesti:

  1. Aggiungi sfericalMercator: proprietà true al tuo livello Google in modo che i livelli vettoriali vengano visualizzati correttamente sopra il livello base di Google (questo è il motivo della geometria mobile).
  2. Aggiungi la proprietà maxExtent del tuo livello Google, altrimenti il ​​centro della mappa non verrà impostato correttamente. L'estensione mostrata di seguito è l'estensione del mondo nelle coordinate di Mercatore.
  3. Come affermato dall'utente 1795, la geometria del punto deve essere riproiettata da 4326 a Web Mercator per essere visualizzata correttamente sulla mappa.
  4. Questo vale anche per setCenter LonLat, quindi è necessario trasformarlo.

Codice di lavoro di seguito:

            map = new OpenLayers.Map('map');
            map.addControl(new OpenLayers.Control.LayerSwitcher());

            var proj = new OpenLayers.Projection("EPSG:4326");

            var gmap = new OpenLayers.Layer.Google("Google Streets", {
                sphericalMercator: true,
                'maxExtent': new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34)
            });
            var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

            map.addLayers([gmap, pointLayer]);
            var lonlat = new OpenLayers.LonLat(16.373056, 48.208333);
            lonlat.transform(proj, map.getProjectionObject());
            map.setCenter(lonlat, 5);

            var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
            point = point.transform(proj, map.getProjectionObject());
            //console.log(point);
            var pointFeature = new OpenLayers.Feature.Vector(point, null, null);
            pointLayer.addFeatures([pointFeature]);

Funziona benissimo! Sembra che OpenLayers non sia davvero intuitivo quando si tratta di trasformazioni. È l'opzione 'spericalMercator' che abilita effettivamente le riproiezioni?
underdark

1
D'accordo, non è intuitivo ... l'opzione sfericaMercator
geographika

4

Questo è un problema di proiezione, devi trasformare la proiezione del punto in quella del livello base (google map qui). Il seguente codice dovrebbe funzionare

    map = new OpenLayers.Map('map');
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    var gmap = new OpenLayers.Layer.Google(
        "Google Streets", 
        {numZoomLevels: 20}
    );
    var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

    map.addLayers([gmap,pointLayer]);
    map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

    var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
    point.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));
    var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
    pointLayer.addFeatures([pointFeature])

Questo perché la proiezione predefinita di google map (mercer sferico) è 900913 e quella di un semplice punto in lonlat nel 4326.

Assicurarsi che il punto sia impostato come (longitudine, latitudine) e non come (latitudine, longitudine).


L'aggiunta della trasformazione fa sparire il punto sulla mia mappa. La mia versione di OpenLayers è 2.9.1 se fa la differenza.
underdark

La point.transform ha fatto il trucco per me!
Stefan,

1

Quando lavori con l'API JS di Google Maps, dovresti fare attenzione alla versione. L'impostazione predefinita è la versione di sviluppo dell'API di Google JS Maps. Controlla la pagina: http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

E anche il team JS di Google Maps corregge i bug. Controlla http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog

In futuro, menziona la versione dell'API di Google Maps nella domanda. v3.3 non ha avuto problemi con Openlayers come utilizzato principalmente dagli sviluppatori.


Ciao Senthil, non sono sicuro di come le versioni dell'API JS di Google Maps influenzino il mio problema con OpenLayers.
underdark

Ciao Underdark, ho avuto problemi con la v3.4 quando ho usato con Openlayers e poi in particolare usando 3.3 e quando uso la versione trunk di google maps, i risultati sono imprevedibili mentre lo sviluppo è in corso. Hai provato con il versioning? Anche se stai utilizzando openlayer, Google Maps API a ciò sottostanti.
Senthil,

0

Penso che sia un problema di proiezione.

Hai provato a riportare il centroide del punto quando la mappa si sposta? Potresti essere in grado di vedere se qualcosa sta cambiando.

Ma da quello che vedo del tuo codice, aggiungerai il punto WGS84 a un diverso corordsys


A proposito, hai provato a interrogare la proiezione della tua mappa, solo per vedere come è impostata?
Peloso,

e, infine, scusate, ma c'è un modo per trasformare il vostro punto in caso di problemi di proiezione: var a = new OpenLayers.LonLat (3,53) .transform (ll, new OpenLayers.Projection ('EPSG: 900913')) ;
Peloso,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.