2010-04-08 24 views
21

Sono abbastanza confuso. Ho un punto:Come convertire le coordinate del livello vettoriale in Mappa Latitudine e Longitudine in Openlayers

x= -12669114.702301 
y= 5561132.6760608 

Che ho ottenuto dal disegno di un quadrato su un livello vettoriale con il controller DrawFeature.

I numeri sembrano ... erm ... terribilmente grandi, ma sembrano funzionare, perché se in seguito disegno un quadrato con tutti gli stessi punti, è nella stessa posizione, quindi immagino che debbano avere ragione .

Il problema si verifica quando provo a convertire questo punto in latitudine e longitudine.

sto usando:

map.getLonLatFromPixel(pointToPixel(points[0])); 

Dove punti [0] è un punto di geometria, e la funzione pointToPixel prende qualsiasi punto e lo trasforma in un pixel (dal momento che il getLonLatFromPixel ha bisogno di un pixel). Lo fa semplicemente prendendo la x del punto e rendendola pixel x, e così via.

La latitudine e la longitudine che ottenga è dell'ordine di:

lat: -54402718463.864 
lng: -18771380.353223 

Questo è molto chiaramente sbagliato. Sono rimasto davvero confuso. Cerco di proiettare questo oggetto, utilizzando:

.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 

Ma io in realtà non farlo e sono abbastanza sicuro che ho fatto in modo non corretto, in ogni modo.

Il mio codice è qui: http://pastie.org/909644

Sono una specie di in perdita. Le coordinate sembrano coerenti, perché posso riutilizzarle per ottenere lo stesso risultato ... ma sembrano molto più grandi di qualsiasi degli esempi che vedo sul sito web di OpenLayers ...

risposta

34

Secondo il codice, la proiezione si sta utilizzando è EPSG: 900913, che è quello che Google utilizza. Le unità per questa proiezione sono metri, ed i valori che si ottengono per il punto sono perfettamente corrette:

x= -12669114.702301 (longitude) 
y= 5561132.6760608 (latitude) 

Questi valori non sono pixel ma coordinate nel EPSG: 900913 proiezione, e sono corretti (purché si suppone siano in Idaho, se non c'è qualcosa che non va altrove)

per verificarle, si può andare a http://proj4js.org/ e trasformare le vostre coordinate da EPSG: 900913 per WGS84 (lat/lon), che vi darà:

x = -113.8085937334033 (longitude) 
y = 44.615123313472 (latitude) 

Questi sono i valori che probabilmente stai aspettando. Se si desidera ottenere loro dal punto di coordinate usare qualcosa come:

point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 

Questo trasformerà le coordinate dalla proiezione di Google per WGS84 (latitudine/longitudine).

+0

Grazie, stavo davvero avendo difficoltà a girare le mie teste intorno alle varie proiezioni ... – Jenny

+0

In realtà ho una domanda ... Chiederò di nuovo formalmente, ma: Se faccio il contrario (point.transform (nuovo OpenLayers.Projection ("EPSG: 4326"), nuovo OpenLayers.Projection ("EPSG: 900913")); A un normale punto lat/lon, ottengo NaN (non un numero?) per eventuali valori lon negativi. È previsto? – Jenny

+0

http://stackoverflow.com/questions/2607734/openlayers-projections – Jenny

2

Per quanto mi ricordo, scatola il gestore è implementato in modo diverso dagli altri gestori in OL. Abbiamo dovuto implementare un proprio gestore che restituisce una geometria con LON coordinate/lat piuttosto che con pixel di coordinate:

Legato.Handler.Box = OpenLayers.Class(OpenLayers.Handler.Box, { 
    endBox : function(end) { 
    var result; 
    if (Math.abs(this.dragHandler.start.x - end.x) > 5 
     || Math.abs(this.dragHandler.start.y - end.y) > 5) { 
     var start = this.dragHandler.start; 
     var top = Math.min(start.y, end.y); 
     var bottom = Math.max(start.y, end.y); 
     var left = Math.min(start.x, end.x); 
     var right = Math.max(start.x, end.x); 

     var lowerLeftLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      left, bottom)); 
     var upperRightLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      right, top)); 
     var bounds = new OpenLayers.Bounds(lowerLeftLonLat.lon, 
      lowerLeftLonLat.lat, upperRightLonLat.lon, upperRightLonLat.lat); 
     result = bounds.toGeometry(); 
    } else { 
     var xy = this.dragHandler.start.clone(); 
     var lonLat = this.map.getLonLatFromPixel(xy); 
     result = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat); 
    } 
    this.removeBox(); 
    this.callback("done", [ result ]); 
    }, 

    CLASS_NAME :"Legato.Handler.Box" 
}); 
Problemi correlati