Come convertire layer vettoriale coordinate nella Mappa latitudine e longitudine in Openlayers

StackOverflow https://stackoverflow.com/questions/2601745

Domanda

Sono abbastanza confuso. Ho un punto:

x= -12669114.702301
y= 5561132.6760608

Quello che ho ricevuto da disegnare un quadrato su un livello vettoriale con il controller DrawFeature.

I numeri sembrano ... ehm ... orribile grandi, ma sembrano funzionare, perché se poi disegnare un quadrato con tutti gli stessi punti, è nella stessa posizione, in modo da capire che devono essere di destra.

Il problema è quando provo a convertire questo punto di latitudine e longitudine.

sto usando:

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

Dove punti [0] è una geometria Point, e la funzione pointToPixel prende qualsiasi punto e lo trasforma in un pixel (poiché il getLonLatFromPixel bisogno di un pixel). Lo fa semplicemente prendendo x del punto, e rendendo i pixel x, e così via.

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

lat: -54402718463.864
lng: -18771380.353223

Questo è molto chiaramente sbagliato. Io 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 riutilizzarli per ottenere lo stesso risultato ... ma sembrano così grande di qualsiasi degli esempi che sto vedendo sul sito OpenLayers ...

È stato utile?

Soluzione

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

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

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

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

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

Questo sono i valori si sono probabilmente aspettate. Se si desidera ottenere loro dalle coordinate del punto di 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).

Altri suggerimenti

Per quanto mi ricordo, gestore scatola è implementy diversamente da altri gestori di OL. Abbiamo dovuto implementare un proprio gestore che restituisce una geometria con lon / lat coordinate piuttosto che con le coordinate dei pixel:

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"
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top