Экран координирует широту и долготу - PullRequest
1 голос
/ 07 мая 2009

В библиотеке открытых слоев ниже приведен метод, используемый для преобразования координат экрана в широту и долготу. Я не могу понять логику, которую этот метод инкапсулирует?

</p> <pre> 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 ); } </pre> <p>

Может кто-нибудь дать несколько указателей?

Ответы [ 3 ]

4 голосов
/ 07 мая 2009

Функция вычисляет широту и долготу для указанной точки на основе текущего разрешения карты, а также широты и долготы центральной точки текущей карты и расстояния, на котором выбранная точка находится от центра карта.

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(); 

Приведенный выше фрагмент кода собирает информацию, необходимую для расчета: центральная точка текущего вида карты (которая даст нам широту / долготу в центральной точке), текущее разрешение карты и текущий размер карты на экран пользователя (который может зависеть от размера экрана и т. д.).

Тогда расчет выглядит так:

    //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);

Сначала возьмите x-координату (в пикселях) и вычтите ширину карты (в пикселях). Это дает нам новую x-координату, в которой 0 - центральный пиксель карты. delta-x теперь должен иметь значение пикселя в диапазоне от - (size.w / 2) до + (size.w / 2). Затем мы делаем то же самое для координаты у. Таким образом, delta-x и delta-y теперь являются декартовыми координатами с началом координат в центре карты.

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

Нам нужно преобразовать delta-x и delta-y из пикселей в широты / долготы. Сначала мы умножаем delta-x и delta-y на текущее разрешение. Это дает нам правильный масштаб, но не правильное происхождение. Добавление centre.lat и centre.lon настраивает, чтобы дать нам широту / долготу на основе отображаемой в данный момент карты.

Наконец, вызов new OpenLayers.LatLon просто оборачивает вышеприведенные вычисления в объект LatLon, чтобы его можно было вернуть из функции как объект LatLon.

edit: при работе с пикселями увеличение x-координаты обычно означает «двигаться вправо», а увеличение y-координаты обычно означает «двигаться вверх». На карте, когда вы увеличиваете долготу, вы обычно «двигаетесь вправо». Однако Широта с ног на голову; когда вы увеличиваете Локатор, вы обычно «двигаетесь вниз» на карте.

Следовательно, Локатор работает в направлении, противоположном обычной схеме координат y на экране. Следовательно, в окончательном расчете минус используется для centre.lat, а плюс для centre.lon.

2 голосов
/ 25 мая 2011

Попробуйте это:

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;
});
2 голосов
/ 07 мая 2009

Я переставил существующие комментарии, добавил еще несколько и добавил пробел. Надеюсь, вы найдете это более понятным.

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 );
   }
...