Frage

In offenen Schichten Bibliothek, unten ist die Methode verwendet, um einen Bildschirm koordiniert sie zu konvertieren, um Breite und Länge. Ich bin die Logik, um herauszufinden, diese Methode kapselt nicht in der Lage?

getLatLonFromPoint: function (point) {
    var center = this.getCenter();
    //map center lat/lon
    var res  = this.getResolution(); 
    //pre defined by the user. Represents the change in lat long per screen unit at the given zoom level
    var size = this.getSize(); 
    //this is the width and height of the div in which the map has to be displayed
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);
    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );
   }

Kann jemand bitte einige Hinweise liefern?

War es hilfreich?

Lösung

berechnet die Funktion, um eine geografische Breite und Länge für den angegebenen Punkt auf der aktuellen Auflösung der Karte basiert, und die Breite und die Länge des Mittelpunkts der aktuellen Karte, und der Abstand, um den ausgewählten Punkt vom Zentrum von der IS Karte.

var center = this.getCenter();
//map center lat/lon
var res  = this.getResolution(); 
//pre defined by the user. Represents the change in lat long ...
var size = this.getSize(); 

Das oben gezeigte Stück Code sammelt die Informationen für die Berechnung benötigt: Der Mittelpunkt der aktuellen Kartenansicht (die es uns geben die lat / lon auf der Mittelpunkt), die aktuelle Map-Auflösung und der aktuellen Kartengröße auf der Benutzer-Bildschirm (die durch Bildschirmgröße bewirkt werden kann, usw.).

Dann geht die Berechnung wie folgt aus:

    //this is the width and height of the div in which the map has to be displayed
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);

nehmen Sie zuerst die x Co-ord (in Pixeln) und die Breite der Karte (in Pixeln) subtrahiert. Dies gibt uns eine neue x Co-ord wobei 0 das mittlere Pixel der Karte ist. delta-x sollte nun ein Pixelwert im Bereich von - (size.w / 2) bis + (/ 2 size.w). Dann tun wir das gleiche für y Co-ord. So Delta-x und delta-y sind nun kartesische Koordinaten mit dem Ursprung in der Mitte der Karte.

    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );

Wir brauchen Delta-x und delta-y aus Pixeln konvertieren, um lat / lon. Zuerst multiplizieren wir Delta-x und delta-y durch die aktuelle Auflösung. Dies gibt uns den richtigen Maßstab aber nicht die richtige Herkunft. Hinzufügen centre.lat und centre.lon adusts geben uns die lat / lon basierend auf der aktuell angezeigten Karte.

Schließlich ist die ‚neue OpenLayers.LatLon‘ Call wickelt nur die obigen Berechnungen in einem LatLon Objekt, so dass es von der Funktion als LatLon Objekt zurückgegeben werden kann.

Bearbeiten: wenn sie mit Pixeln arbeitet, eine Erhöhung in x Co-ord normalerweise bedeutet ‚nach rechts bewegen‘, und eine Erhöhung in y Co-ord normalerweise bedeutet, ‚nach oben‘. Auf einer Karte, wenn Sie Längengrad erhöhen, Sie in der Regel ‚rechts bewegen‘. Allerdings Latitude ist auf den Kopf; wenn Sie Latitude erhöhen, die Sie normalerweise ‚nach unten‘ auf eine Karte.

Daher Latitude arbeitet in der entgegengesetzten Richtung zum normalen y Co-ord Schema auf einem Bildschirm. Daher wird in der endgültigen Berechnung wird ein Minus für centre.lat verwendet, aber ein Plus für centre.lon.

Andere Tipps

ich neu angeordnet, die bestehenden Kommentare hinzugefügt etwas Platz etwas mehr und hinzugefügt. Hoffentlich werden Sie diese klarer finden.

getLatLonFromPoint: function (point) {
    // point is the x and y screen coordinate

    // map center lat/lon
    var center = this.getCenter();

    // pre defined by the user. Represents the change in lat long per screen unit at the given zoom level
    var res  = this.getResolution(); 

    // this is the width and height of the screen (div) in which the map has to be displayed
    var size = this.getSize(); 

    // this is the distance of the point from the center of the screen (div)
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);

    // return the latitude and longitude
    //   these are calculated from the center lat/lon using the 
    //   screen distances which are scaled (multiplied) by the resolution
    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );
   }

Versuchen Sie folgendes:

map.events.register("mousemove", map, function(e) { 
    var position = this.events.getMousePosition(e);
    var p = map.getLonLatFromPixel(new OpenLayers.Pixel(position.x, position.y));
    // your longitude value = p.lon;
    // your latitude value = p.lat;
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top