Use user projection for event coordinate
This commit is contained in:
@@ -36,7 +36,7 @@ class MapBrowserEvent extends MapEvent {
|
|||||||
this.pixel_ = null;
|
this.pixel_ = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The coordinate in view projection corresponding to the original browser event.
|
* The coordinate in the user projection corresponding to the original browser event.
|
||||||
* @type {import("./coordinate.js").Coordinate}
|
* @type {import("./coordinate.js").Coordinate}
|
||||||
*/
|
*/
|
||||||
this.coordinate_ = null;
|
this.coordinate_ = null;
|
||||||
@@ -68,13 +68,14 @@ class MapBrowserEvent extends MapEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The coordinate in view projection corresponding to the original browser event.
|
* The coordinate corresponding to the original browser event. This will be in the user
|
||||||
|
* projection if one is set. Otherwise it will be in the view projection.
|
||||||
* @type {import("./coordinate.js").Coordinate}
|
* @type {import("./coordinate.js").Coordinate}
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
get coordinate() {
|
get coordinate() {
|
||||||
if (!this.coordinate_) {
|
if (!this.coordinate_) {
|
||||||
this.coordinate_ = this.map.getCoordinateFromPixelInternal(this.pixel);
|
this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel);
|
||||||
}
|
}
|
||||||
return this.coordinate_;
|
return this.coordinate_;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
import {Map, View} from '../../../src/ol/index.js';
|
||||||
|
import MapBrowserEvent from '../../../src/ol/MapBrowserEvent.js';
|
||||||
|
import Event from '../../../src/ol/events/Event.js';
|
||||||
|
import {useGeographic, clearUserProjection} from '../../../src/ol/proj.js';
|
||||||
|
|
||||||
|
function createMap() {
|
||||||
|
const size = 256;
|
||||||
|
const target = document.createElement('div');
|
||||||
|
Object.assign(target.style, {
|
||||||
|
width: `${size}px`,
|
||||||
|
height: `${size}px`,
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0
|
||||||
|
});
|
||||||
|
document.body.appendChild(target);
|
||||||
|
|
||||||
|
const map = new Map({
|
||||||
|
target: target,
|
||||||
|
view: new View({
|
||||||
|
center: [0, 0],
|
||||||
|
zoom: 0
|
||||||
|
})
|
||||||
|
});
|
||||||
|
return {map, target, size};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
describe('ol/MapBrowserEvent', function() {
|
||||||
|
|
||||||
|
describe('pixel', function() {
|
||||||
|
let ref;
|
||||||
|
beforeEach(() => {
|
||||||
|
ref = createMap();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
ref.map.dispose();
|
||||||
|
document.body.removeChild(ref.target);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is the pixel position of the event', () => {
|
||||||
|
const x = 10;
|
||||||
|
const y = 15;
|
||||||
|
|
||||||
|
const event = new Event();
|
||||||
|
event.clientX = x;
|
||||||
|
event.clientY = y;
|
||||||
|
const mapEvent = new MapBrowserEvent('test', ref.map, event);
|
||||||
|
|
||||||
|
expect(mapEvent.pixel).to.eql([x, y]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is settable', () => {
|
||||||
|
const x = 10;
|
||||||
|
const y = 15;
|
||||||
|
|
||||||
|
const event = new Event();
|
||||||
|
event.clientX = x;
|
||||||
|
event.clientY = y;
|
||||||
|
const mapEvent = new MapBrowserEvent('test', ref.map, event);
|
||||||
|
|
||||||
|
expect(mapEvent.pixel).to.eql([x, y]);
|
||||||
|
|
||||||
|
const pixel = [x + 5, y + 5];
|
||||||
|
mapEvent.pixel = pixel;
|
||||||
|
expect(mapEvent.pixel).to.eql(pixel);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('coordinate', function() {
|
||||||
|
let ref;
|
||||||
|
beforeEach(() => {
|
||||||
|
ref = createMap();
|
||||||
|
ref.map.renderSync();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
ref.map.dispose();
|
||||||
|
document.body.removeChild(ref.target);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is the map coordinate of the event', () => {
|
||||||
|
const x = ref.size / 2;
|
||||||
|
const y = ref.size / 2;
|
||||||
|
|
||||||
|
const event = new Event();
|
||||||
|
event.clientX = x;
|
||||||
|
event.clientY = y;
|
||||||
|
const mapEvent = new MapBrowserEvent('test', ref.map, event);
|
||||||
|
|
||||||
|
expect(mapEvent.coordinate).to.eql([0, 0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is settable', () => {
|
||||||
|
const x = ref.size / 2;
|
||||||
|
const y = ref.size / 2;
|
||||||
|
|
||||||
|
const event = new Event();
|
||||||
|
event.clientX = x;
|
||||||
|
event.clientY = y;
|
||||||
|
const mapEvent = new MapBrowserEvent('test', ref.map, event);
|
||||||
|
|
||||||
|
expect(mapEvent.coordinate).to.eql([0, 0]);
|
||||||
|
|
||||||
|
const coordinate = [1, 2];
|
||||||
|
mapEvent.coordinate = coordinate;
|
||||||
|
expect(mapEvent.coordinate).to.eql(coordinate);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('coordinate - with useGeographic()', function() {
|
||||||
|
let ref;
|
||||||
|
beforeEach(() => {
|
||||||
|
useGeographic();
|
||||||
|
ref = createMap();
|
||||||
|
ref.map.renderSync();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
clearUserProjection();
|
||||||
|
ref.map.dispose();
|
||||||
|
document.body.removeChild(ref.target);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is the geographic coordinate of the event', () => {
|
||||||
|
const x = ref.size / 4;
|
||||||
|
const y = ref.size / 4;
|
||||||
|
|
||||||
|
const event = new Event();
|
||||||
|
event.clientX = x;
|
||||||
|
event.clientY = y;
|
||||||
|
const mapEvent = new MapBrowserEvent('test', ref.map, event);
|
||||||
|
|
||||||
|
const coord = mapEvent.coordinate;
|
||||||
|
expect(coord[0]).to.be(-90);
|
||||||
|
expect(coord[1]).to.roughlyEqual(66.5132, 1e-4);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -4,7 +4,7 @@ import {listen} from '../../../src/ol/events.js';
|
|||||||
import {DEVICE_PIXEL_RATIO} from '../../../src/ol/has.js';
|
import {DEVICE_PIXEL_RATIO} from '../../../src/ol/has.js';
|
||||||
import Event from '../../../src/ol/events/Event.js';
|
import Event from '../../../src/ol/events/Event.js';
|
||||||
|
|
||||||
describe('ol.MapBrowserEventHandler', function() {
|
describe('ol/MapBrowserEventHandler', function() {
|
||||||
describe('#emulateClick_', function() {
|
describe('#emulateClick_', function() {
|
||||||
let clock;
|
let clock;
|
||||||
let handler;
|
let handler;
|
||||||
Reference in New Issue
Block a user