[gelöst] Rückwärtstransformierung stimmt nicht

Hallo zusammen,

ich arbeite gerade an einem Script mit dem ich einen Marker auf der Karte verschieben kann um dann lon/lat der neuen Position auszugeben.

Den Marker initialisiere ich wie folgt:

point = new OpenLayers.Geometry.Point(8.807357, 53.075813).transform(PROJECTION_4326, PROJECTION_MERC);
var pointAttributes = {
	lon : "8.807357",
	lat : "53.075813"
};

Und so implementiere ich das Verschieben des Markers:

dragControl = new OpenLayers.Control.DragFeature(
	vectorLayer, {
		onComplete : onDragComplete
	});
map.addControl(dragControl);
dragControl.activate();

function onDragComplete(e) {
	var position = map.getLonLatFromPixel(new OpenLayers.Pixel(e.geometry.x, e.geometry.y));
	console.log(position.transform(this.map.getProjectionObject(),this.map.displayProjection).toString());
}

Mein Problem ist nun, dass die console.log in der function onDragComplete nicht die Koordinaten angibt die ich erwarten würde.
Beispielsweise bekomme ich die Ausgabe “lon=50.878851441491,lat=-88.182304720168” obwohl die Ausgabe laut OpenLayers.Control.MousePosition() etwa lon=8.80828,lat=53.07599 sein müsste.

Hat jemand eine Idee wie ich da die richtige Ausgabe bekommen kann?

Tag diver und willkommen im Forum,

ich habs nicht ausprobiert, aber ich denke, Du rechnest zu viel rum.

Der Parameter “e” für onDragComplete() enthält nicht Pixel, sondern schon x/y (also Länge/Breite bei 4326 oder diese komischen “Meter” bei Mercator). Du solltest also mit einmla weniger umrechnen auskommen:

Ersetz mal das da:


function onDragComplete(e) {
	var position = map.getLonLatFromPixel(new OpenLayers.Pixel(e.geometry.x, e.geometry.y));
	console.log(position.transform(this.map.getProjectionObject(),this.map.displayProjection).toString());
}

durch ungefähr sowas:


function onDragComplete(e) { 
 var lonlat=e.geometry.transform(this.map.getProjectionObject(),this.map.displayProjection);         
  alert("Lon="+lonlat.x+" Lat="+lonlat.y);
} 

Grüße, Max

Danke, es ist genau das was ich gesucht habe. :slight_smile:

Edit:
Dafür habe ich jetzt das Problem, dass der Marker beim erneuten Drag&Drop irgendwo anders auf der Karte landet nur nicht da wo die Maus ist.
Ich meine mich zu erinnern, dass es vor dem kleinen Umbau funktionierte. Kann es damit zusammenhängen? Wie stelle ich das wieder ab?

hmmm… dieses e.geometry.transform(…) hat die Tücke, dass nicht nicht nur ein Ergebnis zurückgegeben wird, sondern auch “e” selbst transformiert. Mir ist nicht klar, ob dieses “e”, das an die Funktion übergeben wird, woanders noch gebraucht wird, anscheinend schon… :wink:

Sicherheitshalber erst in ne Variable retten und diese dann transformieren ist sicher nicht verkehrt:

Edit: Code entfernt, da völlig kaputt, sorry

räusper Ich stand wohl gestern neben mir… kopieren geht mit clone().

Also:

function onDragComplete(e) { 
 var lonlat=e.geometry.clone();
 lonlat.transform(this.map.getProjectionObject(),this.map.displayProjection);
 alert("Lon="+lonlat.x+" Lat="+lonlat.y);
}

Wunderbar, funktioniert.
Gut zu wissen, dass e direkt Veränderungen vornimmt.

Danke nochmal für deine Hilfe.