Organize tests
This commit is contained in:
138
test/browser/spec/ol/MapBrowserEvent.test.js
Normal file
138
test/browser/spec/ol/MapBrowserEvent.test.js
Normal file
@@ -0,0 +1,138 @@
|
||||
import Event from '../../../../src/ol/events/Event.js';
|
||||
import MapBrowserEvent from '../../../../src/ol/MapBrowserEvent.js';
|
||||
import {Map, View} from '../../../../src/ol/index.js';
|
||||
import {clearUserProjection, useGeographic} 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);
|
||||
});
|
||||
});
|
||||
});
|
||||
284
test/browser/spec/ol/MapBrowserEventHandler.test.js
Normal file
284
test/browser/spec/ol/MapBrowserEventHandler.test.js
Normal file
@@ -0,0 +1,284 @@
|
||||
import Map from '../../../../src/ol/Map.js';
|
||||
import MapBrowserEventHandler from '../../../../src/ol/MapBrowserEventHandler.js';
|
||||
import OlEvent from '../../../../src/ol/events/Event.js';
|
||||
import {DEVICE_PIXEL_RATIO} from '../../../../src/ol/has.js';
|
||||
import {listen} from '../../../../src/ol/events.js';
|
||||
|
||||
describe('ol/MapBrowserEventHandler', function () {
|
||||
describe('#emulateClick_', function () {
|
||||
let clock;
|
||||
let handler;
|
||||
let clickSpy;
|
||||
let singleclickSpy;
|
||||
let dblclickSpy;
|
||||
let target;
|
||||
|
||||
beforeEach(function () {
|
||||
clock = sinon.useFakeTimers();
|
||||
target = document.createElement('div');
|
||||
handler = new MapBrowserEventHandler(
|
||||
new Map({
|
||||
target: target,
|
||||
})
|
||||
);
|
||||
|
||||
clickSpy = sinon.spy();
|
||||
listen(handler, 'click', clickSpy);
|
||||
|
||||
singleclickSpy = sinon.spy();
|
||||
listen(handler, 'singleclick', singleclickSpy);
|
||||
|
||||
dblclickSpy = sinon.spy();
|
||||
listen(handler, 'dblclick', dblclickSpy);
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
clock.restore();
|
||||
});
|
||||
|
||||
it('emulates click', function () {
|
||||
const event = new OlEvent();
|
||||
event.type = 'pointerdown';
|
||||
(event.target = target), (event.clientX = 0);
|
||||
event.clientY = 0;
|
||||
handler.emulateClick_(event);
|
||||
expect(clickSpy.called).to.be.ok();
|
||||
});
|
||||
|
||||
it('emulates singleclick', function () {
|
||||
const event = new OlEvent();
|
||||
event.type = 'pointerdown';
|
||||
event.target = target;
|
||||
event.clientX = 0;
|
||||
event.clientY = 0;
|
||||
handler.emulateClick_(event);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
clock.tick(250);
|
||||
expect(singleclickSpy.calledOnce).to.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
handler.emulateClick_(event);
|
||||
expect(singleclickSpy.calledOnce).to.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
});
|
||||
|
||||
it('emulates dblclick', function () {
|
||||
const event = new OlEvent();
|
||||
event.type = 'pointerdown';
|
||||
event.target = target;
|
||||
event.clientX = 0;
|
||||
event.clientY = 0;
|
||||
handler.emulateClick_(event);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
handler.emulateClick_(event);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.calledOnce).to.be.ok();
|
||||
|
||||
clock.tick(250);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.calledOnce).to.be.ok();
|
||||
});
|
||||
});
|
||||
|
||||
describe('#down_', function () {
|
||||
let handler;
|
||||
beforeEach(function () {
|
||||
handler = new MapBrowserEventHandler(new Map({}));
|
||||
});
|
||||
|
||||
it('is null if no "down" type event has been handled', function () {
|
||||
expect(handler.down_).to.be(null);
|
||||
});
|
||||
|
||||
it('is properly set after handlePointerDown_ has been called', function () {
|
||||
const event = new OlEvent('pointerdown');
|
||||
event.clientX = 42;
|
||||
event.clientY = 666;
|
||||
event.target = 'foo';
|
||||
handler.handlePointerDown_(event);
|
||||
expect(handler.down_.type).to.be('pointerdown');
|
||||
expect(handler.down_.clientX).to.be(42);
|
||||
expect(handler.down_.clientY).to.be(666);
|
||||
expect(handler.down_.target).to.be('foo');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#isMoving_', function () {
|
||||
let defaultHandler;
|
||||
let moveToleranceHandler;
|
||||
let pointerdownAt0;
|
||||
beforeEach(function () {
|
||||
defaultHandler = new MapBrowserEventHandler(new Map({}));
|
||||
moveToleranceHandler = new MapBrowserEventHandler(new Map({}), 8);
|
||||
pointerdownAt0 = new OlEvent();
|
||||
pointerdownAt0.type = 'pointerdown';
|
||||
pointerdownAt0.clientX = 0;
|
||||
pointerdownAt0.clientY = 0;
|
||||
defaultHandler.handlePointerDown_(pointerdownAt0);
|
||||
moveToleranceHandler.handlePointerDown_(pointerdownAt0);
|
||||
});
|
||||
|
||||
it('is not moving if distance is 0', function () {
|
||||
pointerdownAt0 = new OlEvent();
|
||||
pointerdownAt0.type = 'pointerdown';
|
||||
pointerdownAt0.clientX = 0;
|
||||
pointerdownAt0.clientY = 0;
|
||||
expect(defaultHandler.isMoving_(pointerdownAt0)).to.be(false);
|
||||
});
|
||||
|
||||
it('is moving if distance is 2', function () {
|
||||
const pointerdownAt2 = new OlEvent();
|
||||
pointerdownAt2.type = 'pointerdown';
|
||||
pointerdownAt2.clientX = DEVICE_PIXEL_RATIO + 1;
|
||||
pointerdownAt2.clientY = DEVICE_PIXEL_RATIO + 1;
|
||||
expect(defaultHandler.isMoving_(pointerdownAt2)).to.be(true);
|
||||
});
|
||||
|
||||
it('is moving with negative distance', function () {
|
||||
const pointerdownAt2 = new OlEvent();
|
||||
pointerdownAt2.type = 'pointerdown';
|
||||
pointerdownAt2.clientX = -(DEVICE_PIXEL_RATIO + 1);
|
||||
pointerdownAt2.clientY = -(DEVICE_PIXEL_RATIO + 1);
|
||||
expect(defaultHandler.isMoving_(pointerdownAt2)).to.be(true);
|
||||
});
|
||||
|
||||
it('is not moving if distance is less than move tolerance', function () {
|
||||
const pointerdownAt2 = new OlEvent();
|
||||
pointerdownAt2.type = 'pointerdown';
|
||||
pointerdownAt2.clientX = DEVICE_PIXEL_RATIO + 1;
|
||||
pointerdownAt2.clientY = DEVICE_PIXEL_RATIO + 1;
|
||||
expect(moveToleranceHandler.isMoving_(pointerdownAt2)).to.be(false);
|
||||
});
|
||||
|
||||
it('is moving if distance is greater than move tolerance', function () {
|
||||
const pointerdownAt9 = new OlEvent();
|
||||
pointerdownAt9.type = 'pointerdown';
|
||||
pointerdownAt9.clientX = DEVICE_PIXEL_RATIO * 8 + 1;
|
||||
pointerdownAt9.clientY = DEVICE_PIXEL_RATIO * 8 + 1;
|
||||
expect(moveToleranceHandler.isMoving_(pointerdownAt9)).to.be(true);
|
||||
});
|
||||
|
||||
it('is moving when moving back close to the down pixel', function () {
|
||||
const pointermoveAt9 = new OlEvent();
|
||||
pointermoveAt9.type = 'pointermove';
|
||||
pointermoveAt9.clientX = DEVICE_PIXEL_RATIO * 8 + 1;
|
||||
pointermoveAt9.clientY = DEVICE_PIXEL_RATIO * 8 + 1;
|
||||
moveToleranceHandler.handlePointerMove_(pointermoveAt9);
|
||||
expect(moveToleranceHandler.isMoving_(pointermoveAt9)).to.be(true);
|
||||
const pointermoveAt2 = new OlEvent();
|
||||
pointermoveAt2.type = 'pointermove';
|
||||
pointermoveAt2.clientX = DEVICE_PIXEL_RATIO + 1;
|
||||
pointermoveAt2.clientY = DEVICE_PIXEL_RATIO + 1;
|
||||
moveToleranceHandler.handlePointerMove_(pointermoveAt2);
|
||||
expect(moveToleranceHandler.isMoving_(pointermoveAt2)).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('handleTouchMove_', function () {
|
||||
let handler;
|
||||
beforeEach(function () {
|
||||
handler = new MapBrowserEventHandler(new Map({}));
|
||||
});
|
||||
it('prevents default on touchmove event', function () {
|
||||
handler.originalPointerMoveEvent_ = {
|
||||
defaultPrevented: true,
|
||||
};
|
||||
const event = {
|
||||
preventDefault: sinon.spy(),
|
||||
};
|
||||
handler.handleTouchMove_(event);
|
||||
expect(event.preventDefault.callCount).to.be(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('dblclick', function () {
|
||||
let clock;
|
||||
let handler;
|
||||
let clickSpy;
|
||||
let singleclickSpy;
|
||||
let dblclickSpy;
|
||||
let target;
|
||||
let element, down1, down2, up1, up2;
|
||||
|
||||
beforeEach(function () {
|
||||
clock = sinon.useFakeTimers();
|
||||
target = document.createElement('div');
|
||||
handler = new MapBrowserEventHandler(
|
||||
new Map({
|
||||
target: target,
|
||||
})
|
||||
);
|
||||
|
||||
element = handler.element_;
|
||||
down1 = new Event('pointerdown', {target: element});
|
||||
down1.clientX = 0;
|
||||
down1.clientY = 0;
|
||||
down1.button = 0;
|
||||
down1.pointerId = 1;
|
||||
down2 = new Event('pointerdown', {target: element});
|
||||
down2.clientX = 0;
|
||||
down2.clientY = 0;
|
||||
down2.button = 0;
|
||||
down2.pointerId = 2;
|
||||
up1 = new Event('pointerup', {target: element});
|
||||
up1.clientX = 0;
|
||||
up1.clientY = 0;
|
||||
up1.button = 0;
|
||||
up1.pointerId = 1;
|
||||
up2 = new Event('pointerup', {target: element});
|
||||
up2.clientX = 0;
|
||||
up2.clientY = 0;
|
||||
up2.button = 0;
|
||||
up2.pointerId = 2;
|
||||
|
||||
clickSpy = sinon.spy();
|
||||
listen(handler, 'click', clickSpy);
|
||||
|
||||
singleclickSpy = sinon.spy();
|
||||
listen(handler, 'singleclick', singleclickSpy);
|
||||
|
||||
dblclickSpy = sinon.spy();
|
||||
listen(handler, 'dblclick', dblclickSpy);
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
clock.restore();
|
||||
});
|
||||
|
||||
it('emulates dblclick', function () {
|
||||
element.dispatchEvent(down1);
|
||||
document.dispatchEvent(up1);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
element.dispatchEvent(down2);
|
||||
document.dispatchEvent(up2);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.be.ok();
|
||||
|
||||
clock.tick(250);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.be.ok();
|
||||
});
|
||||
|
||||
it('does not emulate dblclick and singleclick when multiple pointers are active', function () {
|
||||
element.dispatchEvent(down1);
|
||||
element.dispatchEvent(down2);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
document.dispatchEvent(up1);
|
||||
document.dispatchEvent(up2);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
|
||||
clock.tick(250);
|
||||
expect(singleclickSpy.called).to.not.be.ok();
|
||||
expect(dblclickSpy.called).to.not.be.ok();
|
||||
});
|
||||
});
|
||||
});
|
||||
611
test/browser/spec/ol/array.test.js
Normal file
611
test/browser/spec/ol/array.test.js
Normal file
@@ -0,0 +1,611 @@
|
||||
import {
|
||||
binarySearch,
|
||||
equals,
|
||||
extend,
|
||||
find,
|
||||
findIndex,
|
||||
isSorted,
|
||||
linearFindNearest,
|
||||
numberSafeCompareFunction,
|
||||
remove,
|
||||
reverseSubArray,
|
||||
stableSort,
|
||||
} from '../../../../src/ol/array.js';
|
||||
|
||||
describe('ol.array', function () {
|
||||
describe('binarySearch', function () {
|
||||
const insertionPoint = function (position) {
|
||||
return -(position + 1);
|
||||
};
|
||||
const revNumCompare = function (a, b) {
|
||||
return b - a;
|
||||
};
|
||||
|
||||
describe('default comparison on array of String(s)', function () {
|
||||
const a = [
|
||||
'1000',
|
||||
'9',
|
||||
'AB',
|
||||
'ABC',
|
||||
'ABCABC',
|
||||
'ABD',
|
||||
'ABDA',
|
||||
'B',
|
||||
'B',
|
||||
'B',
|
||||
'C',
|
||||
'CA',
|
||||
'CC',
|
||||
'ZZZ',
|
||||
'ab',
|
||||
'abc',
|
||||
'abcabc',
|
||||
'abd',
|
||||
'abda',
|
||||
'b',
|
||||
'c',
|
||||
'ca',
|
||||
'cc',
|
||||
'zzz',
|
||||
];
|
||||
|
||||
it("should find '1000' at index 0", function () {
|
||||
expect(binarySearch(a, '1000')).to.be(0);
|
||||
});
|
||||
it("should find 'zzz' at index " + (a.length - 1), function () {
|
||||
expect(binarySearch(a, 'zzz')).to.be(a.length - 1);
|
||||
});
|
||||
it("should find 'C' at index 10", function () {
|
||||
expect(binarySearch(a, 'C')).to.be(10);
|
||||
});
|
||||
it("should find 'B' at index 7 || 8 || 9", function () {
|
||||
const pos = binarySearch(a, 'B');
|
||||
expect(pos == 7 || pos == 8 || pos == 9).to.be.ok();
|
||||
});
|
||||
it("should not find '100'", function () {
|
||||
const pos = binarySearch(a, '100');
|
||||
expect(pos < 0).to.be.ok();
|
||||
});
|
||||
it("should have an insertion point of 0 for '100'", function () {
|
||||
const pos = binarySearch(a, '100');
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
it("should not find 'zzz0'", function () {
|
||||
const pos = binarySearch(a, 'zzz0');
|
||||
expect(pos < 0).to.be.ok();
|
||||
});
|
||||
it(
|
||||
'should have an insertion point of ' + a.length + " for 'zzz0'",
|
||||
function () {
|
||||
const pos = binarySearch(a, 'zzz0');
|
||||
expect(insertionPoint(pos)).to.be(a.length);
|
||||
}
|
||||
);
|
||||
it("should not find 'BA'", function () {
|
||||
const pos = binarySearch(a, 'zzz0');
|
||||
expect(pos < 0).to.be.ok();
|
||||
});
|
||||
it("should have an insertion point of 10 for 'BA'", function () {
|
||||
const pos = binarySearch(a, 'BA');
|
||||
expect(insertionPoint(pos)).to.be(10);
|
||||
});
|
||||
});
|
||||
|
||||
describe('0 length array with default comparison', function () {
|
||||
const b = [];
|
||||
it("should not find 'a'", function () {
|
||||
expect(binarySearch(b, 'a') < 0).to.be.ok();
|
||||
});
|
||||
it("should have an insertion point of 0 for 'a'", function () {
|
||||
const pos = binarySearch(b, 'a');
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('single element array with default lexiographical comparison', function () {
|
||||
const c = ['only item'];
|
||||
it("should find 'only item' at index 0", function () {
|
||||
expect(binarySearch(c, 'only item')).to.be(0);
|
||||
});
|
||||
it("should not find 'a'", function () {
|
||||
expect(binarySearch(c, 'a') < 0).to.be.ok();
|
||||
});
|
||||
it("should have an insertion point of 0 for 'a'", function () {
|
||||
const pos = binarySearch(c, 'a');
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
it("should not find 'z'", function () {
|
||||
expect(binarySearch(c, 'z') < 0).to.be.ok();
|
||||
});
|
||||
it("should have an insertion point of 1 for 'z'", function () {
|
||||
const pos = binarySearch(c, 'z');
|
||||
expect(insertionPoint(pos)).to.be(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('default comparison on array of Number(s)', function () {
|
||||
const d = [
|
||||
-897123.9,
|
||||
-321434.58758,
|
||||
-1321.3124,
|
||||
-324,
|
||||
-9,
|
||||
-3,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.31255,
|
||||
5,
|
||||
142.88888708,
|
||||
334,
|
||||
342,
|
||||
453,
|
||||
54254,
|
||||
];
|
||||
it('should find -897123.9 at index 0', function () {
|
||||
expect(binarySearch(d, -897123.9)).to.be(0);
|
||||
});
|
||||
it('should find 54254 at index ' + (d.length - 1), function () {
|
||||
expect(binarySearch(d, 54254)).to.be(d.length - 1);
|
||||
});
|
||||
it('should find -3 at index 5', function () {
|
||||
expect(binarySearch(d, -3)).to.be(5);
|
||||
});
|
||||
it('should find 0 at index 6 || 7 || 8', function () {
|
||||
const pos = binarySearch(d, 0);
|
||||
expect(pos == 6 || pos == 7 || pos == 8).to.be(true);
|
||||
});
|
||||
it('should not find -900000', function () {
|
||||
const pos = binarySearch(d, -900000);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 0 for -900000', function () {
|
||||
const pos = binarySearch(d, -900000);
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
it('should not find 54255', function () {
|
||||
const pos = binarySearch(d, 54255);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it(
|
||||
'should have an insertion point of ' + d.length + ' for 54255',
|
||||
function () {
|
||||
const pos = binarySearch(d, 54255);
|
||||
expect(insertionPoint(pos)).to.be(d.length);
|
||||
}
|
||||
);
|
||||
it('should not find 1.1', function () {
|
||||
const pos = binarySearch(d, 1.1);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 10 for 1.1', function () {
|
||||
const pos = binarySearch(d, 1.1);
|
||||
expect(insertionPoint(pos)).to.be(10);
|
||||
});
|
||||
});
|
||||
|
||||
describe('custom comparison function, which reverse orders numbers', function () {
|
||||
const e = [
|
||||
54254,
|
||||
453,
|
||||
342,
|
||||
334,
|
||||
142.88888708,
|
||||
5,
|
||||
0.31255,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
-3,
|
||||
-9,
|
||||
-324,
|
||||
-1321.3124,
|
||||
-321434.58758,
|
||||
-897123.9,
|
||||
];
|
||||
it('should find 54254 at index 0', function () {
|
||||
const pos = binarySearch(e, 54254, revNumCompare);
|
||||
expect(pos).to.be(0);
|
||||
});
|
||||
it('should find -897123.9 at index ' + (e.length - 1), function () {
|
||||
const pos = binarySearch(e, -897123.9, revNumCompare);
|
||||
expect(pos).to.be(e.length - 1);
|
||||
});
|
||||
it('should find -3 at index 10', function () {
|
||||
const pos = binarySearch(e, -3, revNumCompare);
|
||||
expect(pos).to.be(10);
|
||||
});
|
||||
it('should find 0 at index 7 || 8 || 9', function () {
|
||||
const pos = binarySearch(e, 0, revNumCompare);
|
||||
expect(pos == 7 || pos == 8 || pos == 9).to.be(true);
|
||||
});
|
||||
it('should not find 54254.1', function () {
|
||||
const pos = binarySearch(e, 54254.1, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 0 for 54254.1', function () {
|
||||
const pos = binarySearch(e, 54254.1, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
it('should not find -897124', function () {
|
||||
const pos = binarySearch(e, -897124, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it(
|
||||
'should have an insertion point of ' + e.length + ' for -897124',
|
||||
function () {
|
||||
const pos = binarySearch(e, -897124, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(e.length);
|
||||
}
|
||||
);
|
||||
it('should not find 1.1', function () {
|
||||
const pos = binarySearch(e, 1.1, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 0 for 1.1', function () {
|
||||
const pos = binarySearch(e, 1.1, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(6);
|
||||
});
|
||||
});
|
||||
|
||||
describe('0 length array with custom comparison function', function () {
|
||||
const f = [];
|
||||
it('should not find 0', function () {
|
||||
const pos = binarySearch(f, 0, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 0 for 0', function () {
|
||||
const pos = binarySearch(f, 0, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('single element array with custom comparison function', function () {
|
||||
const g = [1];
|
||||
it('should find 1 at index 0', function () {
|
||||
const pos = binarySearch(g, 1, revNumCompare);
|
||||
expect(pos).to.be(0);
|
||||
});
|
||||
it('should not find 2', function () {
|
||||
const pos = binarySearch(g, 2, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 0 for 2', function () {
|
||||
const pos = binarySearch(g, 2, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(0);
|
||||
});
|
||||
it('should not find 0', function () {
|
||||
const pos = binarySearch(g, 0, revNumCompare);
|
||||
expect(pos < 0).to.be(true);
|
||||
});
|
||||
it('should have an insertion point of 1 for 0', function () {
|
||||
const pos = binarySearch(g, 0, revNumCompare);
|
||||
expect(insertionPoint(pos)).to.be(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('finding first index when multiple candidates', function () {
|
||||
it('should find the index of the first 0', function () {
|
||||
expect(binarySearch([0, 0, 1], 0)).to.be(0);
|
||||
});
|
||||
it('should find the index of the first 1', function () {
|
||||
expect(binarySearch([0, 1, 1], 1)).to.be(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Don't use Array#slice, Function#apply and Function#call", function () {
|
||||
const a = [1, 5, 7, 11, 13, 16, 19, 24, 28, 31, 33, 36, 40, 50, 52, 55];
|
||||
const calls = {
|
||||
'Array#slice': false,
|
||||
'Function#apply': false,
|
||||
'Function#call': false,
|
||||
};
|
||||
let origArraySlice;
|
||||
let origFunctionApply;
|
||||
let origFunctionCall;
|
||||
|
||||
it('does not use potentially slow methods (default & custom compare)', function () {
|
||||
// Mockup (I failed to use sinon.spy and beforeEach-hooks)
|
||||
origArraySlice = Array.prototype.slice;
|
||||
origFunctionApply = Function.prototype.apply;
|
||||
origFunctionCall = Function.prototype.call;
|
||||
Array.prototype.slice = function () {
|
||||
calls['Array#slice'] = true;
|
||||
};
|
||||
Function.prototype.apply = function () {
|
||||
calls['Function#apply'] = true;
|
||||
};
|
||||
Function.prototype.call = function () {
|
||||
calls['Function#call'] = true;
|
||||
};
|
||||
|
||||
// Now actually call and test the method twice
|
||||
binarySearch(a, 48);
|
||||
binarySearch(a, 13, function (a, b) {
|
||||
return a > b ? 1 : a < b ? -1 : 0;
|
||||
});
|
||||
|
||||
// Restore mocked up methods
|
||||
Array.prototype.slice = origArraySlice;
|
||||
Function.prototype.apply = origFunctionApply;
|
||||
Function.prototype.call = origFunctionCall;
|
||||
|
||||
// Expectations
|
||||
expect(calls['Array#slice']).to.be(false);
|
||||
expect(calls['Function#apply']).to.be(false);
|
||||
expect(calls['Function#call']).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when items are not found', function () {
|
||||
const arr = [1, 2, 2, 2, 3, 5, 9];
|
||||
|
||||
it('should return the index of where the item would go plus one, negated, if the item is not found', function () {
|
||||
expect(binarySearch(arr, 4)).to.equal(-6);
|
||||
});
|
||||
it('should work even on empty arrays', function () {
|
||||
expect(binarySearch([], 42)).to.equal(-1);
|
||||
});
|
||||
it('should work even on arrays of doubles', function () {
|
||||
expect(binarySearch([0.0, 0.1, 0.2, 0.3, 0.4], 0.25)).to.equal(-4);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('equals', function () {
|
||||
it('returns true for [] == []', function () {
|
||||
expect(equals([], [])).to.be(true);
|
||||
});
|
||||
it('returns true for [1] == [1]', function () {
|
||||
expect(equals([1], [1])).to.be(true);
|
||||
});
|
||||
it("returns true for ['1'] == ['1']", function () {
|
||||
expect(equals(['1'], ['1'])).to.be(true);
|
||||
});
|
||||
it("returns false for [1] == ['1']", function () {
|
||||
expect(equals([1], ['1'])).to.be(false);
|
||||
});
|
||||
it('returns true for [null] == [null]', function () {
|
||||
expect(equals([null], [null])).to.be(true);
|
||||
});
|
||||
it('returns false for [null] == [undefined]', function () {
|
||||
expect(equals([null], [undefined])).to.be(false);
|
||||
});
|
||||
it('returns true for [1, 2] == [1, 2]', function () {
|
||||
expect(equals([1, 2], [1, 2])).to.be(true);
|
||||
});
|
||||
it('returns false for [1, 2] == [2, 1]', function () {
|
||||
expect(equals([1, 2], [2, 1])).to.be(false);
|
||||
});
|
||||
it('returns false for [1, 2] == [1]', function () {
|
||||
expect(equals([1, 2], [1])).to.be(false);
|
||||
});
|
||||
it('returns false for [1] == [1, 2]', function () {
|
||||
expect(equals([1], [1, 2])).to.be(false);
|
||||
});
|
||||
it('returns false for [{}] == [{}]', function () {
|
||||
expect(equals([{}], [{}])).to.be(false);
|
||||
});
|
||||
});
|
||||
describe('extend', function () {
|
||||
it('extends an array in place with an array', function () {
|
||||
const a = [0, 1];
|
||||
extend(a, [2, 3]);
|
||||
expect(a).to.eql([0, 1, 2, 3]);
|
||||
});
|
||||
it('extends an array in place with a number', function () {
|
||||
const a = [0, 1];
|
||||
extend(a, 2);
|
||||
expect(a).to.eql([0, 1, 2]);
|
||||
});
|
||||
it('extends an array in place with a big array', function () {
|
||||
const a = [];
|
||||
let i = 250000; // original test has 1.000.000, but that was too slow
|
||||
const bigArray = Array(i);
|
||||
while (i--) {
|
||||
bigArray[i] = i;
|
||||
}
|
||||
extend(a, bigArray);
|
||||
expect(a).to.eql(bigArray);
|
||||
});
|
||||
});
|
||||
|
||||
describe('find', function () {
|
||||
it('finds numbers in an array', function () {
|
||||
const a = [0, 1, 2, 3];
|
||||
const b = find(a, function (val, index, a2) {
|
||||
expect(a).to.equal(a2);
|
||||
expect(typeof index).to.be('number');
|
||||
return val > 1;
|
||||
});
|
||||
expect(b).to.be(2);
|
||||
});
|
||||
|
||||
it('returns null when an item in an array is not found', function () {
|
||||
const a = [0, 1, 2, 3];
|
||||
const b = find(a, function (val, index, a2) {
|
||||
return val > 100;
|
||||
});
|
||||
expect(b).to.be(null);
|
||||
});
|
||||
|
||||
it('finds items in an array-like', function () {
|
||||
const a = 'abCD';
|
||||
const b = find(a, function (val, index, a2) {
|
||||
expect(a).to.equal(a2);
|
||||
expect(typeof index).to.be('number');
|
||||
return val >= 'A' && val <= 'Z';
|
||||
});
|
||||
expect(b).to.be('C');
|
||||
});
|
||||
|
||||
it('returns null when nothing in an array-like is found', function () {
|
||||
const a = 'abcd';
|
||||
const b = find(a, function (val, index, a2) {
|
||||
return val >= 'A' && val <= 'Z';
|
||||
});
|
||||
expect(b).to.be(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('findIndex', function () {
|
||||
it('finds index of numbers in an array', function () {
|
||||
const a = [0, 1, 2, 3];
|
||||
const b = findIndex(a, function (val, index, a2) {
|
||||
expect(a).to.equal(a2);
|
||||
expect(typeof index).to.be('number');
|
||||
return val > 1;
|
||||
});
|
||||
expect(b).to.be(2);
|
||||
});
|
||||
|
||||
it('returns -1 when an item in an array is not found', function () {
|
||||
const a = [0, 1, 2, 3];
|
||||
const b = findIndex(a, function (val, index, a2) {
|
||||
return val > 100;
|
||||
});
|
||||
expect(b).to.be(-1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isSorted', function () {
|
||||
it('works with just an array as argument', function () {
|
||||
expect(isSorted([1, 2, 3])).to.be(true);
|
||||
expect(isSorted([1, 2, 2])).to.be(true);
|
||||
expect(isSorted([1, 2, 1])).to.be(false);
|
||||
});
|
||||
|
||||
it('works with strict comparison without compare function', function () {
|
||||
expect(isSorted([1, 2, 3], null, true)).to.be(true);
|
||||
expect(isSorted([1, 2, 2], null, true)).to.be(false);
|
||||
expect(isSorted([1, 2, 1], null, true)).to.be(false);
|
||||
});
|
||||
|
||||
it('works with a compare function', function () {
|
||||
function compare(a, b) {
|
||||
return b - a;
|
||||
}
|
||||
expect(isSorted([1, 2, 3], compare)).to.be(false);
|
||||
expect(isSorted([3, 2, 2], compare)).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('linearFindNearest', function () {
|
||||
it('returns expected value', function () {
|
||||
const arr = [1000, 500, 100];
|
||||
|
||||
expect(linearFindNearest(arr, 10000, 0)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 10000, 1)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 10000, -1)).to.eql(0);
|
||||
|
||||
expect(linearFindNearest(arr, 1000, 0)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 1000, 1)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 1000, -1)).to.eql(0);
|
||||
|
||||
expect(linearFindNearest(arr, 900, 0)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 900, 1)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 900, -1)).to.eql(1);
|
||||
|
||||
expect(linearFindNearest(arr, 750, 0)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 750, 1)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 750, -1)).to.eql(1);
|
||||
|
||||
expect(linearFindNearest(arr, 550, 0)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 550, 1)).to.eql(0);
|
||||
expect(linearFindNearest(arr, 550, -1)).to.eql(1);
|
||||
|
||||
expect(linearFindNearest(arr, 500, 0)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 500, 1)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 500, -1)).to.eql(1);
|
||||
|
||||
expect(linearFindNearest(arr, 450, 0)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 450, 1)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 450, -1)).to.eql(2);
|
||||
|
||||
expect(linearFindNearest(arr, 300, 0)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 300, 1)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 300, -1)).to.eql(2);
|
||||
|
||||
expect(linearFindNearest(arr, 200, 0)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 200, 1)).to.eql(1);
|
||||
expect(linearFindNearest(arr, 200, -1)).to.eql(2);
|
||||
|
||||
expect(linearFindNearest(arr, 100, 0)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 100, 1)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 100, -1)).to.eql(2);
|
||||
|
||||
expect(linearFindNearest(arr, 50, 0)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 50, 1)).to.eql(2);
|
||||
expect(linearFindNearest(arr, 50, -1)).to.eql(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('numberSafeCompareFunction', function () {
|
||||
it('sorts as expected', function () {
|
||||
const arr = [40, 200, 3000];
|
||||
// default sort would yield [200, 3000, 40]
|
||||
arr.sort(numberSafeCompareFunction);
|
||||
expect(arr).to.eql(arr);
|
||||
});
|
||||
});
|
||||
|
||||
describe('remove', function () {
|
||||
it('removes elements from an array', function () {
|
||||
const a = ['a', 'b', 'c', 'd'];
|
||||
remove(a, 'c');
|
||||
expect(a).to.eql(['a', 'b', 'd']);
|
||||
remove(a, 'x');
|
||||
expect(a).to.eql(['a', 'b', 'd']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('reverseSubArray', function () {
|
||||
it('returns expected value', function () {
|
||||
let arr;
|
||||
const expected = [1, 2, 3, 4, 5, 6];
|
||||
|
||||
arr = [1, 5, 4, 3, 2, 6];
|
||||
reverseSubArray(arr, 1, 4);
|
||||
expect(arr).to.eql(expected);
|
||||
|
||||
arr = [3, 2, 1, 4, 5, 6];
|
||||
reverseSubArray(arr, 0, 2);
|
||||
expect(arr).to.eql(expected);
|
||||
|
||||
arr = [1, 2, 3, 6, 5, 4];
|
||||
reverseSubArray(arr, 3, 5);
|
||||
expect(arr).to.eql(expected);
|
||||
|
||||
arr = [6, 5, 4, 3, 2, 1];
|
||||
reverseSubArray(arr, 0, 5);
|
||||
expect(arr).to.eql(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('stableSort', function () {
|
||||
let arr, wantedSortedValues;
|
||||
|
||||
beforeEach(function () {
|
||||
arr = [
|
||||
{key: 3, val: 'a'},
|
||||
{key: 2, val: 'b'},
|
||||
{key: 3, val: 'c'},
|
||||
{key: 4, val: 'd'},
|
||||
{key: 3, val: 'e'},
|
||||
];
|
||||
wantedSortedValues = ['b', 'a', 'c', 'e', 'd'];
|
||||
});
|
||||
|
||||
it('works on an array with custom comparison function', function () {
|
||||
function comparisonFn(obj1, obj2) {
|
||||
return obj1.key - obj2.key;
|
||||
}
|
||||
stableSort(arr, comparisonFn);
|
||||
const sortedValues = [];
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
sortedValues.push(arr[i].val);
|
||||
}
|
||||
expect(wantedSortedValues).to.eql(sortedValues);
|
||||
});
|
||||
});
|
||||
});
|
||||
35
test/browser/spec/ol/assertionerror.test.js
Normal file
35
test/browser/spec/ol/assertionerror.test.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import AssertionError from '../../../../src/ol/AssertionError.js';
|
||||
import {VERSION} from '../../../../src/ol/util.js';
|
||||
|
||||
describe('ol.AssertionError', function () {
|
||||
it('generates an error', function () {
|
||||
const error = new AssertionError(42);
|
||||
expect(error).to.be.an(Error);
|
||||
});
|
||||
|
||||
it('generates a message with a versioned url', function () {
|
||||
const error = new AssertionError(42);
|
||||
const path = VERSION ? VERSION.split('-')[0] : 'latest';
|
||||
expect(error.message).to.be(
|
||||
'Assertion failed. See https://openlayers.org/en/' +
|
||||
path +
|
||||
'/doc/errors/#42 for details.'
|
||||
);
|
||||
});
|
||||
|
||||
it('has an error code', function () {
|
||||
const error = new AssertionError(42);
|
||||
expect(error.code).to.be(42);
|
||||
});
|
||||
|
||||
it('has a name', function () {
|
||||
const error = new AssertionError(42);
|
||||
expect(error.name).to.be('AssertionError');
|
||||
});
|
||||
|
||||
it('is instanceof Error and AssertionError', function () {
|
||||
const error = new AssertionError(42);
|
||||
expect(error instanceof Error).to.be(true);
|
||||
expect(error instanceof AssertionError).to.be(true);
|
||||
});
|
||||
});
|
||||
11
test/browser/spec/ol/asserts.test.js
Normal file
11
test/browser/spec/ol/asserts.test.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import {assert} from '../../../../src/ol/asserts.js';
|
||||
|
||||
describe('ol.asserts', function () {
|
||||
describe('ol.asserts.assert', function () {
|
||||
it('throws an exception', function () {
|
||||
expect(function () {
|
||||
assert(false, 42);
|
||||
}).to.throwException();
|
||||
});
|
||||
});
|
||||
});
|
||||
367
test/browser/spec/ol/collection.test.js
Normal file
367
test/browser/spec/ol/collection.test.js
Normal file
@@ -0,0 +1,367 @@
|
||||
import Collection from '../../../../src/ol/Collection.js';
|
||||
import CollectionEventType from '../../../../src/ol/CollectionEventType.js';
|
||||
import {listen} from '../../../../src/ol/events.js';
|
||||
|
||||
describe('ol.collection', function () {
|
||||
let collection;
|
||||
|
||||
beforeEach(function () {
|
||||
collection = new Collection();
|
||||
});
|
||||
|
||||
describe('create an empty collection', function () {
|
||||
it('creates an empty collection', function () {
|
||||
expect(collection.getLength()).to.eql(0);
|
||||
expect(collection.getArray()).to.be.empty();
|
||||
expect(collection.item(0)).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('create a collection from an array', function () {
|
||||
it('creates the expected collection', function () {
|
||||
const array = [0, 1, 2];
|
||||
const collection = new Collection(array);
|
||||
expect(collection.item(0)).to.eql(0);
|
||||
expect(collection.item(1)).to.eql(1);
|
||||
expect(collection.item(2)).to.eql(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('push to a collection', function () {
|
||||
it('adds elements to the collection', function () {
|
||||
const length = collection.push(1);
|
||||
expect(collection.getLength()).to.eql(length);
|
||||
expect(collection.getArray()).to.eql([1]);
|
||||
expect(collection.item(0)).to.eql(1);
|
||||
});
|
||||
it('returns the correct new length of the collection', function () {
|
||||
let length;
|
||||
listen(collection, 'add', function (event) {
|
||||
if (event.element === 'remove_me') {
|
||||
collection.remove(event.element);
|
||||
}
|
||||
});
|
||||
length = collection.push('keep_me');
|
||||
expect(collection.getLength()).to.eql(length);
|
||||
length = collection.push('remove_me');
|
||||
expect(collection.getLength()).to.eql(length);
|
||||
});
|
||||
});
|
||||
|
||||
describe('pop from a collection', function () {
|
||||
it('removes elements from the collection', function () {
|
||||
collection.push(1);
|
||||
collection.pop();
|
||||
expect(collection.getLength()).to.eql(0);
|
||||
expect(collection.getArray()).to.be.empty();
|
||||
expect(collection.item(0)).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('insertAt', function () {
|
||||
it('inserts elements at the correct location', function () {
|
||||
collection = new Collection([0, 2]);
|
||||
collection.insertAt(1, 1);
|
||||
expect(collection.item(0)).to.eql(0);
|
||||
expect(collection.item(1)).to.eql(1);
|
||||
expect(collection.item(2)).to.eql(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setAt', function () {
|
||||
it('sets at the correct location', function () {
|
||||
collection.setAt(1, 1);
|
||||
expect(collection.getLength()).to.eql(2);
|
||||
expect(collection.item(0)).to.be(undefined);
|
||||
expect(collection.item(1)).to.eql(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('removeAt', function () {
|
||||
it('removes elements at the correction', function () {
|
||||
const collection = new Collection([0, 1, 2]);
|
||||
collection.removeAt(1);
|
||||
expect(collection.item(0)).to.eql(0);
|
||||
expect(collection.item(1)).to.eql(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('forEach', function () {
|
||||
let cb;
|
||||
beforeEach(function () {
|
||||
cb = sinon.spy();
|
||||
});
|
||||
describe('on an empty collection', function () {
|
||||
it('does not call the callback', function () {
|
||||
collection.forEach(cb);
|
||||
expect(cb.called).to.be(false);
|
||||
});
|
||||
});
|
||||
describe('on a non-empty collection', function () {
|
||||
it('does call the callback', function () {
|
||||
collection.push(1);
|
||||
collection.push(2);
|
||||
collection.forEach(cb);
|
||||
expect(cb.callCount).to.eql(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('remove', function () {
|
||||
it('removes the first matching element', function () {
|
||||
const collection = new Collection([0, 1, 2]);
|
||||
expect(collection.remove(1)).to.eql(1);
|
||||
expect(collection.getArray()).to.eql([0, 2]);
|
||||
expect(collection.getLength()).to.eql(2);
|
||||
});
|
||||
it('fires a remove event', function () {
|
||||
const collection = new Collection([0, 1, 2]);
|
||||
const cb = sinon.spy();
|
||||
listen(collection, CollectionEventType.REMOVE, cb);
|
||||
expect(collection.remove(1)).to.eql(1);
|
||||
expect(cb.called).to.be(true);
|
||||
expect(cb.lastCall.args[0].element).to.eql(1);
|
||||
});
|
||||
it('does not remove more than one matching element', function () {
|
||||
const collection = new Collection([0, 1, 1, 2]);
|
||||
expect(collection.remove(1)).to.eql(1);
|
||||
expect(collection.getArray()).to.eql([0, 1, 2]);
|
||||
expect(collection.getLength()).to.eql(3);
|
||||
});
|
||||
it('returns undefined if the element is not found', function () {
|
||||
const collection = new Collection([0, 1, 2]);
|
||||
expect(collection.remove(3)).to.be(undefined);
|
||||
expect(collection.getArray()).to.eql([0, 1, 2]);
|
||||
expect(collection.getLength()).to.eql(3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setAt and event', function () {
|
||||
it('does dispatch events', function () {
|
||||
const collection = new Collection(['a', 'b']);
|
||||
let added, removed, addedIndex, removedIndex;
|
||||
listen(collection, CollectionEventType.ADD, function (e) {
|
||||
added = e.element;
|
||||
addedIndex = e.index;
|
||||
});
|
||||
listen(collection, CollectionEventType.REMOVE, function (e) {
|
||||
removed = e.element;
|
||||
removedIndex = e.index;
|
||||
});
|
||||
collection.setAt(1, 1);
|
||||
expect(added).to.eql(1);
|
||||
expect(addedIndex).to.eql(1);
|
||||
expect(removed).to.eql('b');
|
||||
expect(removedIndex).to.eql(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('removeAt and event', function () {
|
||||
it('does dispatch events', function () {
|
||||
const collection = new Collection(['a']);
|
||||
let removed, removedIndex;
|
||||
listen(collection, CollectionEventType.REMOVE, function (e) {
|
||||
removed = e.element;
|
||||
removedIndex = e.index;
|
||||
});
|
||||
collection.pop();
|
||||
expect(removed).to.eql('a');
|
||||
expect(removedIndex).to.eql(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('insertAt and event', function () {
|
||||
it('does dispatch events', function () {
|
||||
const collection = new Collection([0, 2]);
|
||||
let added, addedIndex;
|
||||
listen(collection, CollectionEventType.ADD, function (e) {
|
||||
added = e.element;
|
||||
addedIndex = e.index;
|
||||
});
|
||||
collection.insertAt(1, 1);
|
||||
expect(added).to.eql(1);
|
||||
expect(addedIndex).to.eql(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setAt beyond end', function () {
|
||||
it('triggers events properly', function () {
|
||||
const added = [],
|
||||
addedIndexes = [];
|
||||
listen(collection, CollectionEventType.ADD, function (e) {
|
||||
added.push(e.element);
|
||||
addedIndexes.push(e.index);
|
||||
});
|
||||
collection.setAt(2, 0);
|
||||
expect(collection.getLength()).to.eql(3);
|
||||
expect(collection.item(0)).to.be(undefined);
|
||||
expect(collection.item(1)).to.be(undefined);
|
||||
expect(collection.item(2)).to.eql(0);
|
||||
expect(added.length).to.eql(3);
|
||||
expect(added[0]).to.eql(undefined);
|
||||
expect(added[1]).to.eql(undefined);
|
||||
expect(added[2]).to.eql(0);
|
||||
expect(addedIndexes).to.eql([0, 1, 2]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('change:length event', function () {
|
||||
let collection, cb;
|
||||
beforeEach(function () {
|
||||
collection = new Collection([0, 1, 2]);
|
||||
cb = sinon.spy();
|
||||
listen(collection, 'change:length', cb);
|
||||
});
|
||||
|
||||
describe('insertAt', function () {
|
||||
it('triggers change:length event', function () {
|
||||
collection.insertAt(2, 3);
|
||||
expect(cb.called).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('removeAt', function () {
|
||||
it('triggers change:length event', function () {
|
||||
collection.removeAt(0);
|
||||
expect(cb.called).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setAt', function () {
|
||||
it('does not trigger change:length event', function () {
|
||||
collection.setAt(1, 1);
|
||||
expect(cb.called).to.be(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('add event', function () {
|
||||
it('triggers add when pushing', function () {
|
||||
const collection = new Collection();
|
||||
let elem, addedIndex;
|
||||
listen(collection, CollectionEventType.ADD, function (e) {
|
||||
elem = e.element;
|
||||
addedIndex = e.index;
|
||||
});
|
||||
const length = collection.push(1);
|
||||
expect(elem).to.eql(length);
|
||||
expect(addedIndex).to.eql(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('remove event', function () {
|
||||
let collection, cb1, cb2;
|
||||
beforeEach(function () {
|
||||
collection = new Collection([1]);
|
||||
cb1 = sinon.spy();
|
||||
cb2 = sinon.spy();
|
||||
});
|
||||
describe('setAt', function () {
|
||||
it('triggers remove', function () {
|
||||
listen(collection, CollectionEventType.ADD, cb1);
|
||||
listen(collection, CollectionEventType.REMOVE, cb2);
|
||||
collection.setAt(0, 2);
|
||||
expect(cb2.lastCall.args[0].element).to.eql(1);
|
||||
expect(cb1.lastCall.args[0].element).to.eql(2);
|
||||
});
|
||||
});
|
||||
describe('pop', function () {
|
||||
it('triggers remove', function () {
|
||||
listen(collection, CollectionEventType.REMOVE, cb1);
|
||||
collection.pop();
|
||||
expect(cb1.lastCall.args[0].element).to.eql(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('extending a collection', function () {
|
||||
it('adds elements to end of the collection', function () {
|
||||
collection.extend([1, 2]);
|
||||
expect(collection.getLength()).to.eql(2);
|
||||
expect(collection.getArray()).to.eql([1, 2]);
|
||||
expect(collection.item(0)).to.eql(1);
|
||||
expect(collection.item(1)).to.eql(2);
|
||||
});
|
||||
it('fires events', function () {
|
||||
const collection = new Collection();
|
||||
const elems = [],
|
||||
addedIndexes = [];
|
||||
listen(collection, CollectionEventType.ADD, function (e) {
|
||||
elems.push(e.element);
|
||||
addedIndexes.push(e.index);
|
||||
});
|
||||
collection.extend([1, 2]);
|
||||
expect(elems).to.eql([1, 2]);
|
||||
expect(addedIndexes).to.eql([0, 1]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('unique collection', function () {
|
||||
it('allows unique items in the constructor', function () {
|
||||
new Collection([{}, {}, {}], {unique: true});
|
||||
});
|
||||
|
||||
it('throws if duplicate items are passed to the constructor', function () {
|
||||
const item = {};
|
||||
const call = function () {
|
||||
new Collection([item, item], {unique: true});
|
||||
};
|
||||
expect(call).to.throwException();
|
||||
});
|
||||
|
||||
it('allows unique items to be added via push', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
unique.push({});
|
||||
unique.push({});
|
||||
});
|
||||
|
||||
it('throws if duplicate items are added via push', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
const item = {};
|
||||
unique.push(item);
|
||||
const call = function () {
|
||||
unique.push(item);
|
||||
};
|
||||
expect(call).to.throwException();
|
||||
});
|
||||
|
||||
it('allows unique items to be added via insertAt', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
unique.insertAt(0, {});
|
||||
unique.insertAt(0, {});
|
||||
});
|
||||
|
||||
it('throws if duplicate items are added via insertAt', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
const item = {};
|
||||
unique.insertAt(0, item);
|
||||
const call = function () {
|
||||
unique.insertAt(0, item);
|
||||
};
|
||||
expect(call).to.throwException();
|
||||
});
|
||||
|
||||
it('allows unique items to be added via setAt', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
unique.setAt(0, {});
|
||||
unique.setAt(1, {});
|
||||
});
|
||||
|
||||
it('allows items to be reset via setAt', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
const item = {};
|
||||
unique.setAt(0, item);
|
||||
unique.setAt(0, item);
|
||||
});
|
||||
|
||||
it('throws if duplicate items are added via setAt', function () {
|
||||
const unique = new Collection(undefined, {unique: true});
|
||||
const item = {};
|
||||
unique.setAt(0, item);
|
||||
const call = function () {
|
||||
unique.setAt(1, item);
|
||||
};
|
||||
expect(call).to.throwException();
|
||||
});
|
||||
});
|
||||
});
|
||||
172
test/browser/spec/ol/color.test.js
Normal file
172
test/browser/spec/ol/color.test.js
Normal file
@@ -0,0 +1,172 @@
|
||||
import {
|
||||
asArray,
|
||||
asString,
|
||||
fromString,
|
||||
isStringColor,
|
||||
normalize,
|
||||
toString,
|
||||
} from '../../../../src/ol/color.js';
|
||||
|
||||
describe('ol.color', function () {
|
||||
describe('asArray()', function () {
|
||||
it('returns the same for an array', function () {
|
||||
const color = [1, 2, 3, 0.4];
|
||||
const got = asArray(color);
|
||||
expect(got).to.be(color);
|
||||
});
|
||||
|
||||
it('returns an array given an rgba string', function () {
|
||||
const color = asArray('rgba(1,2,3,0.4)');
|
||||
expect(color).to.eql([1, 2, 3, 0.4]);
|
||||
});
|
||||
|
||||
it('returns an array given an rgb string', function () {
|
||||
const color = asArray('rgb(1,2,3)');
|
||||
expect(color).to.eql([1, 2, 3, 1]);
|
||||
});
|
||||
|
||||
it('returns an array given a hex string', function () {
|
||||
const color = asArray('#00ccff');
|
||||
expect(color).to.eql([0, 204, 255, 1]);
|
||||
});
|
||||
|
||||
it('returns an array given a hex string with alpha', function () {
|
||||
const color = asArray('#00ccffb0');
|
||||
expect(color).to.eql([0, 204, 255, 176 / 255]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('asString()', function () {
|
||||
it('returns the same for a string', function () {
|
||||
const color = 'rgba(0,1,2,0.3)';
|
||||
const got = asString(color);
|
||||
expect(got).to.be(color);
|
||||
});
|
||||
|
||||
it('returns a string given an rgba array', function () {
|
||||
const color = asString([1, 2, 3, 0.4]);
|
||||
expect(color).to.eql('rgba(1,2,3,0.4)');
|
||||
});
|
||||
|
||||
it('returns a string given an rgb array', function () {
|
||||
const color = asString([1, 2, 3]);
|
||||
expect(color).to.eql('rgba(1,2,3,1)');
|
||||
});
|
||||
});
|
||||
|
||||
describe('fromString()', function () {
|
||||
it('can parse 3-digit hex colors', function () {
|
||||
expect(fromString('#087')).to.eql([0, 136, 119, 1]);
|
||||
});
|
||||
|
||||
it('can parse 4-digit hex colors', function () {
|
||||
expect(fromString('#0876')).to.eql([0, 136, 119, 102 / 255]);
|
||||
});
|
||||
|
||||
it('can parse 6-digit hex colors', function () {
|
||||
expect(fromString('#56789a')).to.eql([86, 120, 154, 1]);
|
||||
});
|
||||
|
||||
it('can parse 8-digit hex colors', function () {
|
||||
expect(fromString('#56789acc')).to.eql([86, 120, 154, 204 / 255]);
|
||||
});
|
||||
|
||||
it('can parse rgb colors', function () {
|
||||
expect(fromString('rgb(0, 0, 255)')).to.eql([0, 0, 255, 1]);
|
||||
});
|
||||
|
||||
it('ignores whitespace before, between & after numbers (rgb)', function () {
|
||||
expect(fromString('rgb( \t 0 , 0 \n , 255 )')).to.eql([0, 0, 255, 1]);
|
||||
});
|
||||
|
||||
it('can parse rgba colors', function () {
|
||||
// opacity 0
|
||||
expect(fromString('rgba(255, 255, 0, 0)')).to.eql([255, 255, 0, 0]);
|
||||
// opacity 0.0 (simple float)
|
||||
expect(fromString('rgba(255, 255, 0, 0.0)')).to.eql([255, 255, 0, 0]);
|
||||
// opacity 0.0000000000000000 (float with 16 digits)
|
||||
expect(fromString('rgba(255, 255, 0, 0.0000000000000000)')).to.eql([
|
||||
255,
|
||||
255,
|
||||
0,
|
||||
0,
|
||||
]);
|
||||
// opacity 0.1 (simple float)
|
||||
expect(fromString('rgba(255, 255, 0, 0.1)')).to.eql([255, 255, 0, 0.1]);
|
||||
// opacity 0.1111111111111111 (float with 16 digits)
|
||||
expect(fromString('rgba(255, 255, 0, 0.1111111111111111)')).to.eql([
|
||||
255,
|
||||
255,
|
||||
0,
|
||||
0.1111111111111111,
|
||||
]);
|
||||
// opacity 1
|
||||
expect(fromString('rgba(255, 255, 0, 1)')).to.eql([255, 255, 0, 1]);
|
||||
// opacity 1.0
|
||||
expect(fromString('rgba(255, 255, 0, 1.0)')).to.eql([255, 255, 0, 1]);
|
||||
// opacity 1.0000000000000000
|
||||
expect(fromString('rgba(255, 255, 0, 1.0000000000000000)')).to.eql([
|
||||
255,
|
||||
255,
|
||||
0,
|
||||
1,
|
||||
]);
|
||||
// with 30 decimal digits
|
||||
expect(
|
||||
fromString('rgba(255, 255, 0, 0.123456789012345678901234567890)')
|
||||
).to.eql([255, 255, 0, 0.12345678901234567890123456789]);
|
||||
});
|
||||
|
||||
it('ignores whitespace before, between & after numbers (rgba)', function () {
|
||||
expect(
|
||||
fromString('rgba( \t 0 , 0 \n , 255 , 0.4711 )')
|
||||
).to.eql([0, 0, 255, 0.4711]);
|
||||
});
|
||||
|
||||
it('throws an error on invalid colors', function () {
|
||||
const invalidColors = ['tuesday', '#12345', '#1234567'];
|
||||
let i, ii;
|
||||
for (i = 0, ii = invalidColors.length; i < ii; ++i) {
|
||||
expect(function () {
|
||||
fromString(invalidColors[i]);
|
||||
}).to.throwException();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalize()', function () {
|
||||
it('clamps out-of-range channels', function () {
|
||||
expect(normalize([-1, 256, 0, 2])).to.eql([0, 255, 0, 1]);
|
||||
});
|
||||
|
||||
it('rounds color channels to integers', function () {
|
||||
expect(normalize([1.2, 2.5, 3.7, 1])).to.eql([1, 3, 4, 1]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('toString()', function () {
|
||||
it('converts valid colors', function () {
|
||||
expect(toString([1, 2, 3, 0.4])).to.be('rgba(1,2,3,0.4)');
|
||||
});
|
||||
|
||||
it('rounds to integers if needed', function () {
|
||||
expect(toString([1.2, 2.5, 3.7, 0.4])).to.be('rgba(1,3,4,0.4)');
|
||||
});
|
||||
|
||||
it('sets default alpha value if undefined', function () {
|
||||
expect(toString([0, 0, 0])).to.be('rgba(0,0,0,1)');
|
||||
});
|
||||
});
|
||||
|
||||
describe('isValid()', function () {
|
||||
it('correctly detects valid colors', function () {
|
||||
expect(isStringColor('rgba(1,3,4,0.4)')).to.be(true);
|
||||
expect(isStringColor('rgb(1,3,4)')).to.be(true);
|
||||
expect(isStringColor('lightgreen')).to.be(true);
|
||||
expect(isStringColor('yellow')).to.be(true);
|
||||
expect(isStringColor('GREEN')).to.be(true);
|
||||
expect(isStringColor('notacolor')).to.be(false);
|
||||
expect(isStringColor('red_')).to.be(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
126
test/browser/spec/ol/control/attribution.test.js
Normal file
126
test/browser/spec/ol/control/attribution.test.js
Normal file
@@ -0,0 +1,126 @@
|
||||
import Attribution from '../../../../../src/ol/control/Attribution.js';
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
import Tile from '../../../../../src/ol/Tile.js';
|
||||
import TileLayer from '../../../../../src/ol/layer/Tile.js';
|
||||
import TileSource from '../../../../../src/ol/source/Tile.js';
|
||||
import View from '../../../../../src/ol/View.js';
|
||||
import {createXYZ} from '../../../../../src/ol/tilegrid.js';
|
||||
|
||||
describe('ol.control.Attribution', function () {
|
||||
let map;
|
||||
|
||||
const tileLoadFunction = function () {
|
||||
const tile = new Tile([0, 0, -1], 2 /* LOADED */);
|
||||
tile.getImage = function () {
|
||||
const image = new Image();
|
||||
image.width = 256;
|
||||
image.height = 256;
|
||||
return image;
|
||||
};
|
||||
return tile;
|
||||
};
|
||||
|
||||
beforeEach(function () {
|
||||
const target = document.createElement('div');
|
||||
target.style.width = '100px';
|
||||
target.style.height = '100px';
|
||||
document.body.appendChild(target);
|
||||
map = new Map({
|
||||
target: target,
|
||||
controls: [
|
||||
new Attribution({
|
||||
collapsed: false,
|
||||
collapsible: false,
|
||||
}),
|
||||
],
|
||||
layers: [
|
||||
new TileLayer({
|
||||
source: new TileSource({
|
||||
projection: 'EPSG:3857',
|
||||
tileGrid: createXYZ(),
|
||||
attributions: 'foo',
|
||||
}),
|
||||
}),
|
||||
new TileLayer({
|
||||
source: new TileSource({
|
||||
projection: 'EPSG:3857',
|
||||
tileGrid: createXYZ(),
|
||||
attributions: 'bar',
|
||||
}),
|
||||
}),
|
||||
new TileLayer({
|
||||
source: new TileSource({
|
||||
projection: 'EPSG:3857',
|
||||
tileGrid: createXYZ(),
|
||||
attributions: 'foo',
|
||||
}),
|
||||
}),
|
||||
],
|
||||
view: new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
}),
|
||||
});
|
||||
map.getLayers().forEach(function (layer) {
|
||||
const source = layer.getSource();
|
||||
source.getTile = tileLoadFunction;
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
disposeMap(map);
|
||||
map = null;
|
||||
});
|
||||
|
||||
it('does not add duplicate attributions', function () {
|
||||
map.renderSync();
|
||||
const attribution = map.getTarget().querySelectorAll('.ol-attribution li');
|
||||
expect(attribution.length).to.be(2);
|
||||
});
|
||||
|
||||
it('renders attributions as non-collapsible if source is configured with attributionsCollapsible set to false', function () {
|
||||
map.getControls().clear();
|
||||
map.addControl(new Attribution());
|
||||
const source = new TileSource({
|
||||
projection: 'EPSG:3857',
|
||||
tileGrid: createXYZ(),
|
||||
attributions: 'foo',
|
||||
attributionsCollapsible: false,
|
||||
});
|
||||
source.getTile = tileLoadFunction;
|
||||
map.addLayer(
|
||||
new TileLayer({
|
||||
source: source,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
|
||||
const attribution = map
|
||||
.getTarget()
|
||||
.querySelectorAll('.ol-attribution.ol-uncollapsible');
|
||||
expect(attribution.length).to.be(1);
|
||||
});
|
||||
|
||||
it('renders attributions as collapsible if configured with collapsible set to true', function () {
|
||||
map.getControls().clear();
|
||||
map.addControl(new Attribution({collapsible: true}));
|
||||
const source = new TileSource({
|
||||
projection: 'EPSG:3857',
|
||||
tileGrid: createXYZ(),
|
||||
attributions: 'foo',
|
||||
attributionsCollapsible: false,
|
||||
});
|
||||
source.getTile = tileLoadFunction;
|
||||
map.addLayer(
|
||||
new TileLayer({
|
||||
source: source,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
|
||||
const attribution = map
|
||||
.getTarget()
|
||||
.querySelectorAll('.ol-attribution.ol-uncollapsible');
|
||||
expect(attribution.length).to.be(0);
|
||||
});
|
||||
});
|
||||
104
test/browser/spec/ol/control/control.test.js
Normal file
104
test/browser/spec/ol/control/control.test.js
Normal file
@@ -0,0 +1,104 @@
|
||||
import Control from '../../../../../src/ol/control/Control.js';
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
|
||||
describe('ol.control.Control', function () {
|
||||
let map, control;
|
||||
|
||||
beforeEach(function () {
|
||||
map = new Map({
|
||||
target: document.createElement('div'),
|
||||
});
|
||||
const element = document.createElement('div');
|
||||
control = new Control({element: element});
|
||||
control.setMap(map);
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
disposeMap(map);
|
||||
map = null;
|
||||
control = null;
|
||||
});
|
||||
|
||||
describe('dispose', function () {
|
||||
it('removes the control element from its parent', function () {
|
||||
control.dispose();
|
||||
expect(control.element.parentNode).to.be(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('element', function () {
|
||||
it('sets `pointer-events: auto` for default target', function () {
|
||||
const control = new Control({
|
||||
element: document.createElement('div'),
|
||||
});
|
||||
expect(control.element.style.pointerEvents).to.be('auto');
|
||||
});
|
||||
it('does not set `pointer-events: auto` for custom target', function () {
|
||||
const control = new Control({
|
||||
element: document.createElement('div'),
|
||||
target: document.createElement('div'),
|
||||
});
|
||||
expect(control.element.style.pointerEvents).to.be('');
|
||||
});
|
||||
it('does not override `pointer-events` style', function () {
|
||||
const element = document.createElement('div');
|
||||
element.style.pointerEvents = 'none';
|
||||
const control = new Control({
|
||||
element: element,
|
||||
});
|
||||
expect(control.element.style.pointerEvents).to.be('none');
|
||||
});
|
||||
});
|
||||
|
||||
describe("ol.control.Control's target", function () {
|
||||
describe('target as string or element', function () {
|
||||
it('transforms target from string to element', function () {
|
||||
const target = document.createElement('div');
|
||||
target.id = 'mycontrol';
|
||||
document.body.appendChild(target);
|
||||
const ctrl = new Control({target: 'mycontrol'});
|
||||
expect(ctrl.target_.id).to.equal('mycontrol');
|
||||
ctrl.dispose();
|
||||
target.parentNode.removeChild(target);
|
||||
});
|
||||
it('accepts element for target', function () {
|
||||
const target = document.createElement('div');
|
||||
target.id = 'mycontrol';
|
||||
document.body.appendChild(target);
|
||||
const ctrl = new Control({target: target});
|
||||
expect(ctrl.target_.id).to.equal('mycontrol');
|
||||
ctrl.dispose();
|
||||
target.parentNode.removeChild(target);
|
||||
});
|
||||
it('ignores non-existing target id', function () {
|
||||
const ctrl = new Control({target: 'doesnotexist'});
|
||||
expect(ctrl.target_).to.equal(null);
|
||||
ctrl.dispose();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("ol.control.Control's event target", function () {
|
||||
it('is the Control when the Control uses the default target', function (done) {
|
||||
const ctrl = new Control({element: document.createElement('div')});
|
||||
ctrl.on('test-event', function (e) {
|
||||
expect(e.target).to.be(ctrl);
|
||||
done();
|
||||
});
|
||||
ctrl.dispatchEvent('test-event');
|
||||
ctrl.dispose();
|
||||
});
|
||||
it('is the Control when the Control has a custom target', function (done) {
|
||||
const ctrl = new Control({
|
||||
element: document.createElement('div'),
|
||||
target: document.createElement('div'),
|
||||
});
|
||||
ctrl.on('test-event', function (e) {
|
||||
expect(e.target).to.be(ctrl);
|
||||
done();
|
||||
});
|
||||
ctrl.dispatchEvent('test-event');
|
||||
ctrl.dispose();
|
||||
});
|
||||
});
|
||||
10
test/browser/spec/ol/control/fullscreen.test.js
Normal file
10
test/browser/spec/ol/control/fullscreen.test.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import FullScreen from '../../../../../src/ol/control/FullScreen.js';
|
||||
|
||||
describe('ol.control.FullScreen', function () {
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const instance = new FullScreen();
|
||||
expect(instance).to.be.an(FullScreen);
|
||||
});
|
||||
});
|
||||
});
|
||||
132
test/browser/spec/ol/control/mouseposition.test.js
Normal file
132
test/browser/spec/ol/control/mouseposition.test.js
Normal file
@@ -0,0 +1,132 @@
|
||||
import EventType from '../../../../../src/ol/pointer/EventType.js';
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
import MousePosition from '../../../../../src/ol/control/MousePosition.js';
|
||||
import View from '../../../../../src/ol/View.js';
|
||||
|
||||
describe('ol/control/MousePosition', function () {
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const instance = new MousePosition();
|
||||
expect(instance).to.be.an(MousePosition);
|
||||
expect(instance.element.className).to.be('ol-mouse-position');
|
||||
});
|
||||
|
||||
it('creates the element with the provided class name', function () {
|
||||
const className = 'foobar';
|
||||
const instance = new MousePosition({
|
||||
className: className,
|
||||
});
|
||||
expect(instance.element.className).to.be(className);
|
||||
});
|
||||
});
|
||||
|
||||
describe('configuration options', function () {
|
||||
let target, map;
|
||||
const width = 360;
|
||||
const height = 180;
|
||||
|
||||
beforeEach(function () {
|
||||
target = document.createElement('div');
|
||||
const style = target.style;
|
||||
style.position = 'absolute';
|
||||
style.left = '-1000px';
|
||||
style.top = '-1000px';
|
||||
style.width = width + 'px';
|
||||
style.height = height + 'px';
|
||||
|
||||
document.body.appendChild(target);
|
||||
map = new Map({
|
||||
target: target,
|
||||
controls: [],
|
||||
view: new View({
|
||||
projection: 'EPSG:4326',
|
||||
center: [0, 0],
|
||||
resolution: 1,
|
||||
}),
|
||||
});
|
||||
});
|
||||
afterEach(function () {
|
||||
map.dispose();
|
||||
document.body.removeChild(target);
|
||||
});
|
||||
|
||||
function simulateEvent(type, x, y) {
|
||||
const viewport = map.getViewport();
|
||||
// calculated in case body has top < 0 (test runner with small window)
|
||||
const position = viewport.getBoundingClientRect();
|
||||
const evt = new PointerEvent(type, {
|
||||
clientX: position.left + x + width / 2,
|
||||
clientY: position.top + y + height / 2,
|
||||
});
|
||||
document.querySelector('div.ol-viewport').dispatchEvent(evt);
|
||||
}
|
||||
|
||||
describe('undefinedHTML', function () {
|
||||
it('renders undefinedHTML when mouse moves out', function () {
|
||||
const ctrl = new MousePosition({
|
||||
undefinedHTML: 'some text',
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.renderSync();
|
||||
|
||||
const element = document.querySelector(
|
||||
'.ol-mouse-position',
|
||||
map.getTarget()
|
||||
);
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be('some text');
|
||||
|
||||
simulateEvent(EventType.POINTERMOVE, 20, 30);
|
||||
expect(element.innerHTML).to.be('20,-30');
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be('some text');
|
||||
});
|
||||
|
||||
it('clears the mouse position by default when the mouse moves outside the viewport', function () {
|
||||
const ctrl = new MousePosition();
|
||||
ctrl.setMap(map);
|
||||
map.renderSync();
|
||||
|
||||
const element = document.querySelector(
|
||||
'.ol-mouse-position',
|
||||
map.getTarget()
|
||||
);
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be(' ');
|
||||
|
||||
target.dispatchEvent(new PointerEvent('pointermove'));
|
||||
simulateEvent(EventType.POINTERMOVE, 20, 30);
|
||||
expect(element.innerHTML).to.be('20,-30');
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be(' ');
|
||||
});
|
||||
|
||||
it('retains the mouse position when undefinedHTML is falsey and mouse moves outside the viewport', function () {
|
||||
const ctrl = new MousePosition({
|
||||
undefinedHTML: '',
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.renderSync();
|
||||
|
||||
const element = document.querySelector(
|
||||
'.ol-mouse-position',
|
||||
map.getTarget()
|
||||
);
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be('');
|
||||
|
||||
target.dispatchEvent(new PointerEvent('pointermove'));
|
||||
simulateEvent(EventType.POINTERMOVE, 20, 30);
|
||||
expect(element.innerHTML).to.be('20,-30');
|
||||
|
||||
simulateEvent(EventType.POINTEROUT, width + 1, height + 1);
|
||||
expect(element.innerHTML).to.be('20,-30');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
152
test/browser/spec/ol/control/overviewmap.test.js
Normal file
152
test/browser/spec/ol/control/overviewmap.test.js
Normal file
@@ -0,0 +1,152 @@
|
||||
import Control from '../../../../../src/ol/control/Control.js';
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
import OverviewMap from '../../../../../src/ol/control/OverviewMap.js';
|
||||
import View from '../../../../../src/ol/View.js';
|
||||
|
||||
describe('ol.control.OverviewMap', function () {
|
||||
let map, target;
|
||||
|
||||
beforeEach(function () {
|
||||
target = document.createElement('div');
|
||||
document.body.appendChild(target);
|
||||
map = new Map({
|
||||
target: target,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
map.dispose();
|
||||
document.body.removeChild(target);
|
||||
map = null;
|
||||
target = null;
|
||||
});
|
||||
|
||||
describe('constructor', function () {
|
||||
it('creates an overview map with the default options', function () {
|
||||
const control = new OverviewMap();
|
||||
expect(control).to.be.a(OverviewMap);
|
||||
expect(control).to.be.a(Control);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setMap()', function () {
|
||||
it('keeps ovmap view rotation in sync with map view rotation', function () {
|
||||
const view = new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
rotation: Math.PI / 2,
|
||||
});
|
||||
map.setView(view);
|
||||
|
||||
const control = new OverviewMap({
|
||||
rotateWithView: true,
|
||||
});
|
||||
map.addControl(control);
|
||||
const ovView = control.ovmap_.getView();
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 2);
|
||||
|
||||
view.setRotation(Math.PI / 4);
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 4);
|
||||
});
|
||||
|
||||
it('maintains rotation in sync if view added later', function () {
|
||||
const control = new OverviewMap({
|
||||
rotateWithView: true,
|
||||
});
|
||||
map.addControl(control);
|
||||
const ovInitialView = control.ovmap_.getView();
|
||||
expect(ovInitialView.getRotation()).to.be(0);
|
||||
|
||||
const view = new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
rotation: Math.PI / 2,
|
||||
});
|
||||
map.setView(view);
|
||||
const ovView = control.ovmap_.getView();
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 2);
|
||||
|
||||
view.setRotation(Math.PI / 4);
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 4);
|
||||
});
|
||||
|
||||
it('stops listening to old maps', function () {
|
||||
const control = new OverviewMap({
|
||||
rotateWithView: true,
|
||||
});
|
||||
|
||||
const view = new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
rotation: 0,
|
||||
});
|
||||
map.setView(view);
|
||||
map.addControl(control);
|
||||
const ovView = control.ovmap_.getView();
|
||||
|
||||
view.setRotation(Math.PI / 8);
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 8);
|
||||
|
||||
map.removeControl(control);
|
||||
|
||||
view.setRotation(Math.PI / 4);
|
||||
expect(ovView.getRotation()).to.be(Math.PI / 8);
|
||||
});
|
||||
|
||||
it('reflects projection change of main map', function () {
|
||||
const control = new OverviewMap({
|
||||
rotateWithView: true,
|
||||
});
|
||||
|
||||
map.addControl(control);
|
||||
expect(control.ovmap_.getView().getProjection().getCode()).to.be(
|
||||
'EPSG:3857'
|
||||
);
|
||||
|
||||
map.setView(
|
||||
new View({
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
expect(control.ovmap_.getView().getProjection().getCode()).to.be(
|
||||
'EPSG:4326'
|
||||
);
|
||||
});
|
||||
|
||||
it('retains explicitly set view', function () {
|
||||
const overviewMapView = new View();
|
||||
const control = new OverviewMap({
|
||||
rotateWithView: true,
|
||||
view: overviewMapView,
|
||||
});
|
||||
|
||||
map.addControl(control);
|
||||
expect(control.ovmap_.getView()).to.be(overviewMapView);
|
||||
expect(control.ovmap_.getView().getProjection().getCode()).to.be(
|
||||
'EPSG:3857'
|
||||
);
|
||||
|
||||
map.setView(
|
||||
new View({
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
expect(control.ovmap_.getView()).to.be(overviewMapView);
|
||||
expect(control.ovmap_.getView().getProjection().getCode()).to.be(
|
||||
'EPSG:3857'
|
||||
);
|
||||
});
|
||||
|
||||
it('set target to null', function () {
|
||||
const control = new OverviewMap();
|
||||
|
||||
map.addControl(control);
|
||||
|
||||
expect(control.ovmap_.getTarget()).not.to.be(null);
|
||||
|
||||
map.removeControl(control);
|
||||
|
||||
expect(control.ovmap_.getTarget()).to.be(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
10
test/browser/spec/ol/control/rotate.test.js
Normal file
10
test/browser/spec/ol/control/rotate.test.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import Rotate from '../../../../../src/ol/control/Rotate.js';
|
||||
|
||||
describe('ol.control.Rotate', function () {
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const instance = new Rotate();
|
||||
expect(instance).to.be.an(Rotate);
|
||||
});
|
||||
});
|
||||
});
|
||||
644
test/browser/spec/ol/control/scaleline.test.js
Normal file
644
test/browser/spec/ol/control/scaleline.test.js
Normal file
@@ -0,0 +1,644 @@
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
import Projection from '../../../../../src/ol/proj/Projection.js';
|
||||
import ScaleLine from '../../../../../src/ol/control/ScaleLine.js';
|
||||
import View from '../../../../../src/ol/View.js';
|
||||
import proj4 from 'proj4';
|
||||
import {
|
||||
addCommon,
|
||||
clearAllProjections,
|
||||
fromLonLat,
|
||||
} from '../../../../../src/ol/proj.js';
|
||||
import {register} from '../../../../../src/ol/proj/proj4.js';
|
||||
|
||||
describe('ol.control.ScaleLine', function () {
|
||||
let map;
|
||||
beforeEach(function () {
|
||||
const target = document.createElement('div');
|
||||
target.style.height = '256px';
|
||||
document.body.appendChild(target);
|
||||
map = new Map({
|
||||
target: target,
|
||||
});
|
||||
});
|
||||
afterEach(function () {
|
||||
disposeMap(map);
|
||||
map = null;
|
||||
});
|
||||
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
expect(ctrl).to.be.an(ScaleLine);
|
||||
});
|
||||
});
|
||||
|
||||
describe('configuration options', function () {
|
||||
describe('className', function () {
|
||||
it('defaults to "ol-scale-line"', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
const element = document.querySelector(
|
||||
'.ol-scale-line',
|
||||
map.getTarget()
|
||||
);
|
||||
expect(element).to.not.be(null);
|
||||
expect(element).to.be.a(HTMLDivElement);
|
||||
});
|
||||
it('can be configured', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
className: 'humpty-dumpty',
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
|
||||
// check that the default was not chosen
|
||||
const element1 = document.querySelector(
|
||||
'.ol-scale-line',
|
||||
map.getTarget()
|
||||
);
|
||||
expect(element1).to.be(null);
|
||||
// check if the configured classname was chosen
|
||||
const element2 = document.querySelector(
|
||||
'.humpty-dumpty',
|
||||
map.getTarget()
|
||||
);
|
||||
expect(element2).to.not.be(null);
|
||||
expect(element2).to.be.a(HTMLDivElement);
|
||||
});
|
||||
});
|
||||
|
||||
describe('minWidth', function () {
|
||||
it('defaults to 64', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
expect(ctrl.minWidth_).to.be(64);
|
||||
});
|
||||
it('can be configured', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
minWidth: 4711,
|
||||
});
|
||||
expect(ctrl.minWidth_).to.be(4711);
|
||||
});
|
||||
});
|
||||
|
||||
describe('render', function () {
|
||||
it('defaults to `ol.control.ScaleLine.render`', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
expect(ctrl.render).to.be(ScaleLine.prototype.render);
|
||||
});
|
||||
it('can be configured', function () {
|
||||
const myRender = function () {};
|
||||
const ctrl = new ScaleLine({
|
||||
render: myRender,
|
||||
});
|
||||
expect(ctrl.render).to.be(myRender);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('synchronisation with map view', function () {
|
||||
it('calls `render` as soon as the map is rendered', function (done) {
|
||||
const renderSpy = sinon.spy();
|
||||
const ctrl = new ScaleLine({
|
||||
render: renderSpy,
|
||||
});
|
||||
expect(renderSpy.called).to.be(false);
|
||||
ctrl.setMap(map);
|
||||
expect(renderSpy.called).to.be(false);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
expect(renderSpy.called).to.be(false);
|
||||
map.once('postrender', function () {
|
||||
expect(renderSpy.called).to.be(true);
|
||||
expect(renderSpy.callCount).to.be(1);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('calls `render` as often as the map is rendered', function () {
|
||||
const renderSpy = sinon.spy();
|
||||
const ctrl = new ScaleLine({
|
||||
render: renderSpy,
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(renderSpy.callCount).to.be(1);
|
||||
map.renderSync();
|
||||
expect(renderSpy.callCount).to.be(2);
|
||||
map.renderSync();
|
||||
expect(renderSpy.callCount).to.be(3);
|
||||
});
|
||||
it('calls `render` as when the view changes', function (done) {
|
||||
const renderSpy = sinon.spy();
|
||||
const ctrl = new ScaleLine({
|
||||
render: renderSpy,
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
map.once('postrender', function () {
|
||||
expect(renderSpy.callCount).to.be(2);
|
||||
done();
|
||||
});
|
||||
map.getView().setCenter([1, 1]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('static method `render`', function () {
|
||||
it('updates the rendered text', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
expect(ctrl.element.innerText).to.be('');
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
multiWorld: true,
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('10000 km');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getUnits', function () {
|
||||
it('returns "metric" by default', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
expect(ctrl.getUnits()).to.be('metric');
|
||||
});
|
||||
it('returns what is configured via `units` property', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
units: 'nautical',
|
||||
});
|
||||
expect(ctrl.getUnits()).to.be('nautical');
|
||||
});
|
||||
it('returns what is configured `setUnits` method', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setUnits('nautical');
|
||||
expect(ctrl.getUnits()).to.be('nautical');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setUnits', function () {
|
||||
it('triggers rerendering', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
multiWorld: true,
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
ctrl.setMap(map);
|
||||
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('10000 km');
|
||||
|
||||
ctrl.setUnits('nautical');
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('10000 nm');
|
||||
});
|
||||
});
|
||||
|
||||
describe('different units result in different contents', function () {
|
||||
let ctrl;
|
||||
let metricHtml;
|
||||
let nauticalHtml;
|
||||
let degreesHtml;
|
||||
let imperialHtml;
|
||||
let usHtml;
|
||||
beforeEach(function (done) {
|
||||
ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
})
|
||||
);
|
||||
map.once('postrender', function () {
|
||||
metricHtml = ctrl.element.innerHTML;
|
||||
done();
|
||||
});
|
||||
});
|
||||
afterEach(function () {
|
||||
map.setView(null);
|
||||
map.removeControl(ctrl);
|
||||
});
|
||||
|
||||
it('renders a scaleline for "metric"', function () {
|
||||
expect(metricHtml).to.not.be(undefined);
|
||||
});
|
||||
it('renders a different scaleline for "nautical"', function () {
|
||||
ctrl.setUnits('nautical');
|
||||
nauticalHtml = ctrl.element.innerHTML;
|
||||
expect(nauticalHtml).to.not.be(metricHtml);
|
||||
});
|
||||
it('renders a different scaleline for "degrees"', function () {
|
||||
ctrl.setUnits('degrees');
|
||||
degreesHtml = ctrl.element.innerHTML;
|
||||
expect(degreesHtml).to.not.be(metricHtml);
|
||||
expect(degreesHtml).to.not.be(nauticalHtml);
|
||||
});
|
||||
it('renders a different scaleline for "imperial"', function () {
|
||||
ctrl.setUnits('imperial');
|
||||
imperialHtml = ctrl.element.innerHTML;
|
||||
expect(imperialHtml).to.not.be(metricHtml);
|
||||
expect(imperialHtml).to.not.be(nauticalHtml);
|
||||
expect(imperialHtml).to.not.be(degreesHtml);
|
||||
});
|
||||
it('renders a different scaleline for "us"', function () {
|
||||
ctrl.setUnits('us');
|
||||
usHtml = ctrl.element.innerHTML;
|
||||
expect(usHtml).to.not.be(metricHtml);
|
||||
expect(usHtml).to.not.be(nauticalHtml);
|
||||
expect(usHtml).to.not.be(degreesHtml);
|
||||
// it's hard to actually find a difference in rendering between
|
||||
// usHtml and imperialHtml
|
||||
});
|
||||
});
|
||||
|
||||
describe('projections affect the scaleline', function () {
|
||||
beforeEach(function () {
|
||||
proj4.defs(
|
||||
'Indiana-East',
|
||||
'PROJCS["IN83-EF",GEOGCS["LL83",DATUM["NAD83",' +
|
||||
'SPHEROID["GRS1980",6378137.000,298.25722210]],PRIMEM["Greenwich",0],' +
|
||||
'UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],' +
|
||||
'PARAMETER["false_easting",328083.333],' +
|
||||
'PARAMETER["false_northing",820208.333],' +
|
||||
'PARAMETER["scale_factor",0.999966666667],' +
|
||||
'PARAMETER["central_meridian",-85.66666666666670],' +
|
||||
'PARAMETER["latitude_of_origin",37.50000000000000],' +
|
||||
'UNIT["Foot_US",0.30480060960122]]'
|
||||
);
|
||||
register(proj4);
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
clearAllProjections();
|
||||
addCommon();
|
||||
});
|
||||
|
||||
it('is rendered differently for different projections', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: fromLonLat([7, 52]),
|
||||
zoom: 2,
|
||||
projection: 'EPSG:3857',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('2000 km');
|
||||
map.setView(
|
||||
new View({
|
||||
center: [7, 52],
|
||||
multiWorld: true,
|
||||
zoom: 2,
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('5000 km');
|
||||
map.setView(
|
||||
new View({
|
||||
center: fromLonLat([-85.685, 39.891], 'Indiana-East'),
|
||||
zoom: 7,
|
||||
projection: 'Indiana-East',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('100 km');
|
||||
});
|
||||
|
||||
it('shows the same scale for different projections at higher resolutions', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: fromLonLat([-85.685, 39.891]),
|
||||
zoom: 7,
|
||||
projection: 'EPSG:3857',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('100 km');
|
||||
map.setView(
|
||||
new View({
|
||||
center: [-85.685, 39.891],
|
||||
zoom: 7,
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('100 km');
|
||||
map.setView(
|
||||
new View({
|
||||
center: fromLonLat([-85.685, 39.891], 'Indiana-East'),
|
||||
zoom: 7,
|
||||
projection: 'Indiana-East',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('100 km');
|
||||
});
|
||||
|
||||
it("Projection's metersPerUnit affect scale for non-degree units", function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
resolutions: [1],
|
||||
projection: new Projection({
|
||||
code: 'METERS',
|
||||
units: 'm',
|
||||
getPointResolution: function (r) {
|
||||
return r;
|
||||
},
|
||||
}),
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
|
||||
ctrl.setUnits('metric');
|
||||
expect(ctrl.element.innerText).to.be('100 m');
|
||||
|
||||
ctrl.setUnits('imperial');
|
||||
expect(ctrl.element.innerText).to.be('500 ft');
|
||||
|
||||
ctrl.setUnits('nautical');
|
||||
expect(ctrl.element.innerText).to.be('0.05 nm');
|
||||
|
||||
ctrl.setUnits('us');
|
||||
expect(ctrl.element.innerText).to.be('500 ft');
|
||||
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 0,
|
||||
resolutions: [1],
|
||||
projection: new Projection({
|
||||
code: 'PIXELS',
|
||||
units: 'pixels',
|
||||
metersPerUnit: 1 / 1000,
|
||||
getPointResolution: function (r) {
|
||||
return r;
|
||||
},
|
||||
}),
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
|
||||
ctrl.setUnits('metric');
|
||||
expect(ctrl.element.innerText).to.be('100 mm');
|
||||
|
||||
ctrl.setUnits('imperial');
|
||||
expect(ctrl.element.innerText).to.be('5 in');
|
||||
|
||||
ctrl.setUnits('nautical');
|
||||
expect(ctrl.element.innerText).to.be('0.00005 nm');
|
||||
|
||||
ctrl.setUnits('us');
|
||||
expect(ctrl.element.innerText).to.be('5 in');
|
||||
});
|
||||
|
||||
it('Metric display works with Geographic (EPSG:4326) projection', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
multiWorld: true,
|
||||
zoom: 0 /* min zoom */,
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('10000 km');
|
||||
map.getView().setZoom(28); /* max zoom */
|
||||
map.renderSync();
|
||||
expect(ctrl.element.innerText).to.be('50 mm');
|
||||
});
|
||||
});
|
||||
|
||||
describe('latitude may affect scale line in EPSG:4326', function () {
|
||||
it('is rendered differently at different latitudes for metric', function () {
|
||||
const ctrl = new ScaleLine();
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [7, 0],
|
||||
zoom: 2,
|
||||
projection: 'EPSG:4326',
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
const innerHtml0 = ctrl.element.innerHTML;
|
||||
map.getView().setCenter([7, 52]);
|
||||
map.renderSync();
|
||||
const innerHtml52 = ctrl.element.innerHTML;
|
||||
expect(innerHtml0).to.not.be(innerHtml52);
|
||||
});
|
||||
|
||||
it('is rendered the same at different latitudes for degrees', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
units: 'degrees',
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [7, 0],
|
||||
zoom: 2,
|
||||
projection: 'EPSG:4326',
|
||||
multiWorld: true,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
const innerHtml0 = ctrl.element.innerHTML;
|
||||
map.getView().setCenter([7, 52]);
|
||||
map.renderSync();
|
||||
const innerHtml52 = ctrl.element.innerHTML;
|
||||
expect(innerHtml0).to.be(innerHtml52);
|
||||
});
|
||||
});
|
||||
|
||||
describe('zoom affects the scaleline', function () {
|
||||
let currentZoom;
|
||||
let ctrl;
|
||||
let renderedHtmls;
|
||||
let mapView;
|
||||
|
||||
const getMetricUnit = function (zoom) {
|
||||
if (zoom > 30) {
|
||||
return 'μm';
|
||||
} else if (zoom > 20) {
|
||||
return 'mm';
|
||||
} else if (zoom > 10) {
|
||||
return 'm';
|
||||
} else {
|
||||
return 'km';
|
||||
}
|
||||
};
|
||||
|
||||
const getImperialUnit = function (zoom) {
|
||||
if (zoom >= 21) {
|
||||
return 'in';
|
||||
} else if (zoom >= 10) {
|
||||
return 'ft';
|
||||
} else {
|
||||
return 'mi';
|
||||
}
|
||||
};
|
||||
|
||||
beforeEach(function () {
|
||||
currentZoom = 33;
|
||||
renderedHtmls = {};
|
||||
ctrl = new ScaleLine({
|
||||
minWidth: 10,
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: currentZoom,
|
||||
maxZoom: currentZoom,
|
||||
multiWorld: true,
|
||||
})
|
||||
);
|
||||
mapView = map.getView();
|
||||
map.renderSync();
|
||||
});
|
||||
afterEach(function () {
|
||||
map.removeControl(ctrl);
|
||||
map.setView(null);
|
||||
});
|
||||
|
||||
it('metric: is rendered differently for different zoomlevels', function () {
|
||||
ctrl.setUnits('metric');
|
||||
map.renderSync();
|
||||
renderedHtmls[ctrl.element.innerHTML] = true;
|
||||
while (--currentZoom >= 0) {
|
||||
mapView.setZoom(currentZoom);
|
||||
map.renderSync();
|
||||
const currentHtml = ctrl.element.innerHTML;
|
||||
expect(currentHtml in renderedHtmls).to.be(false);
|
||||
renderedHtmls[currentHtml] = true;
|
||||
|
||||
const unit = ctrl.innerElement_.textContent.match(/\d+ (.+)/)[1];
|
||||
expect(unit).to.eql(getMetricUnit(currentZoom));
|
||||
}
|
||||
});
|
||||
it('degrees: is rendered differently for different zoomlevels', function () {
|
||||
ctrl.setUnits('degrees');
|
||||
map.renderSync();
|
||||
renderedHtmls[ctrl.element.innerHTML] = true;
|
||||
while (--currentZoom >= 0) {
|
||||
mapView.setZoom(currentZoom);
|
||||
map.renderSync();
|
||||
const currentHtml = ctrl.element.innerHTML;
|
||||
expect(currentHtml in renderedHtmls).to.be(false);
|
||||
renderedHtmls[currentHtml] = true;
|
||||
}
|
||||
});
|
||||
it('imperial: is rendered differently for different zoomlevels', function () {
|
||||
ctrl.setUnits('imperial');
|
||||
map.renderSync();
|
||||
renderedHtmls[ctrl.element.innerHTML] = true;
|
||||
while (--currentZoom >= 0) {
|
||||
mapView.setZoom(currentZoom);
|
||||
map.renderSync();
|
||||
const currentHtml = ctrl.element.innerHTML;
|
||||
expect(currentHtml in renderedHtmls).to.be(false);
|
||||
renderedHtmls[currentHtml] = true;
|
||||
|
||||
const unit = ctrl.innerElement_.textContent.match(/\d+ (.+)/)[1];
|
||||
expect(unit).to.eql(getImperialUnit(currentZoom));
|
||||
}
|
||||
});
|
||||
it('nautical: is rendered differently for different zoomlevels', function () {
|
||||
ctrl.setUnits('nautical');
|
||||
map.renderSync();
|
||||
renderedHtmls[ctrl.element.innerHTML] = true;
|
||||
while (--currentZoom >= 0) {
|
||||
mapView.setZoom(currentZoom);
|
||||
map.renderSync();
|
||||
const currentHtml = ctrl.element.innerHTML;
|
||||
expect(currentHtml in renderedHtmls).to.be(false);
|
||||
renderedHtmls[currentHtml] = true;
|
||||
}
|
||||
});
|
||||
it('us: is rendered differently for different zoomlevels', function () {
|
||||
ctrl.setUnits('us');
|
||||
map.renderSync();
|
||||
renderedHtmls[ctrl.element.innerHTML] = true;
|
||||
while (--currentZoom >= 0) {
|
||||
mapView.setZoom(currentZoom);
|
||||
map.renderSync();
|
||||
const currentHtml = ctrl.element.innerHTML;
|
||||
expect(currentHtml in renderedHtmls).to.be(false);
|
||||
renderedHtmls[currentHtml] = true;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('scalebar text', function () {
|
||||
it('it corresponds to the resolution', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
bar: true,
|
||||
text: true,
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: [0, 0],
|
||||
zoom: 2,
|
||||
multiWorld: true,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
const element = document.querySelector('.ol-scale-text', map.getTarget());
|
||||
expect(element).to.not.be(null);
|
||||
expect(element).to.be.a(HTMLDivElement);
|
||||
const text = element.innerText;
|
||||
expect(text.slice(0, 4)).to.be('1 : ');
|
||||
expect(text.replace(/^1|\D/g, '')).to.eql(139770566);
|
||||
});
|
||||
it('it changes with latitude', function () {
|
||||
const ctrl = new ScaleLine({
|
||||
bar: true,
|
||||
text: true,
|
||||
});
|
||||
ctrl.setMap(map);
|
||||
map.setView(
|
||||
new View({
|
||||
center: fromLonLat([0, 60]),
|
||||
zoom: 2,
|
||||
multiWorld: true,
|
||||
})
|
||||
);
|
||||
map.renderSync();
|
||||
const element = document.querySelector('.ol-scale-text', map.getTarget());
|
||||
expect(element).to.not.be(null);
|
||||
expect(element).to.be.a(HTMLDivElement);
|
||||
const text = element.innerText;
|
||||
expect(text.slice(0, 4)).to.be('1 : ');
|
||||
expect(text.replace(/^1|\D/g, '')).to.eql(69885283);
|
||||
});
|
||||
});
|
||||
});
|
||||
10
test/browser/spec/ol/control/zoom.test.js
Normal file
10
test/browser/spec/ol/control/zoom.test.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import Zoom from '../../../../../src/ol/control/Zoom.js';
|
||||
|
||||
describe('ol.control.Zoom', function () {
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const instance = new Zoom();
|
||||
expect(instance).to.be.an(Zoom);
|
||||
});
|
||||
});
|
||||
});
|
||||
264
test/browser/spec/ol/control/zoomslider.test.js
Normal file
264
test/browser/spec/ol/control/zoomslider.test.js
Normal file
@@ -0,0 +1,264 @@
|
||||
import Event from '../../../../../src/ol/events/Event.js';
|
||||
import EventTarget from '../../../../../src/ol/events/Target.js';
|
||||
import Map from '../../../../../src/ol/Map.js';
|
||||
import View from '../../../../../src/ol/View.js';
|
||||
import ZoomSlider from '../../../../../src/ol/control/ZoomSlider.js';
|
||||
|
||||
describe('ol.control.ZoomSlider', function () {
|
||||
let map, target, zoomslider;
|
||||
|
||||
const createElement = document.createElement;
|
||||
function createEventElement(type) {
|
||||
const element = createElement.call(document, type);
|
||||
const eventTarget = new EventTarget();
|
||||
element.listeners_ = {};
|
||||
element.dispatching_ = {};
|
||||
element.pendingRemovals_ = {};
|
||||
element.dispatchEvent = eventTarget.dispatchEvent.bind(element);
|
||||
element.addEventListener = eventTarget.addEventListener.bind(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
beforeEach(function () {
|
||||
target = document.createElement('div');
|
||||
document.body.appendChild(target);
|
||||
zoomslider = new ZoomSlider();
|
||||
map = new Map({
|
||||
target: target,
|
||||
controls: [zoomslider],
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
zoomslider.dispose();
|
||||
map.dispose();
|
||||
document.body.removeChild(target);
|
||||
zoomslider = null;
|
||||
map = null;
|
||||
target = null;
|
||||
});
|
||||
|
||||
describe('DOM creation', function () {
|
||||
it('creates the expected DOM elements', function () {
|
||||
const zoomSliderContainers = target.querySelectorAll('.ol-zoomslider');
|
||||
|
||||
expect(zoomSliderContainers.length).to.be(1);
|
||||
|
||||
const zoomSliderContainer = zoomSliderContainers[0];
|
||||
expect(zoomSliderContainer instanceof HTMLDivElement).to.be(true);
|
||||
|
||||
let hasUnselectableCls = zoomSliderContainer.classList.contains(
|
||||
'ol-unselectable'
|
||||
);
|
||||
expect(hasUnselectableCls).to.be(true);
|
||||
|
||||
const zoomSliderThumbs = zoomSliderContainer.querySelectorAll(
|
||||
'.ol-zoomslider-thumb'
|
||||
);
|
||||
expect(zoomSliderThumbs.length).to.be(1);
|
||||
|
||||
const zoomSliderThumb = zoomSliderThumbs[0];
|
||||
expect(zoomSliderThumb instanceof HTMLButtonElement).to.be(true);
|
||||
|
||||
hasUnselectableCls = zoomSliderThumb.classList.contains(
|
||||
'ol-unselectable'
|
||||
);
|
||||
expect(hasUnselectableCls).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#initSlider_', function () {
|
||||
it('sets limits', function () {
|
||||
zoomslider.initSlider_();
|
||||
expect(zoomslider.widthLimit_).not.to.be(0);
|
||||
expect(zoomslider.heightLimit_).to.be(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#direction_', function () {
|
||||
it('is horizontal for wide containers', function () {
|
||||
const control = new ZoomSlider({});
|
||||
control.element.style.width = '1000px';
|
||||
control.element.style.height = '10px';
|
||||
control.setMap(map);
|
||||
control.initSlider_();
|
||||
|
||||
const horizontal = 1;
|
||||
expect(control.direction_).to.be(horizontal);
|
||||
|
||||
control.dispose();
|
||||
});
|
||||
|
||||
it('is vertical for tall containers', function () {
|
||||
const control = new ZoomSlider({});
|
||||
control.element.style.width = '10px';
|
||||
control.element.style.height = '1000px';
|
||||
|
||||
control.setMap(map);
|
||||
|
||||
const vertical = 0;
|
||||
expect(control.direction_).to.be(vertical);
|
||||
|
||||
control.dispose();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Pointer event handling', function () {
|
||||
let map;
|
||||
|
||||
beforeEach(function () {
|
||||
map = new Map({
|
||||
target: createMapDiv(500, 100),
|
||||
view: new View({
|
||||
center: [0, 0],
|
||||
resolutions: [16, 8, 4, 2, 1, 0.5, 0.25, 0.125, 0.0625],
|
||||
}),
|
||||
});
|
||||
});
|
||||
afterEach(function () {
|
||||
disposeMap(map);
|
||||
});
|
||||
|
||||
it('[horizontal] handles a drag sequence', function () {
|
||||
document.createElement = createEventElement;
|
||||
const control = new ZoomSlider();
|
||||
map.addControl(control);
|
||||
document.createElement = createElement;
|
||||
map.getView().setZoom(0);
|
||||
control.element.style.width = '500px';
|
||||
control.element.style.height = '10px';
|
||||
control.element.firstChild.style.width = '100px';
|
||||
control.element.firstChild.style.height = '10px';
|
||||
map.renderSync();
|
||||
const event = new Event();
|
||||
(event.type = 'pointerdown'),
|
||||
(event.target = control.element.firstElementChild);
|
||||
event.clientX = control.widthLimit_;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(16);
|
||||
expect(control.dragging_).to.be(true);
|
||||
expect(control.dragListenerKeys_.length).to.be(2);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = (6 * control.widthLimit_) / 8;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(4);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = (4 * control.widthLimit_) / 8;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
event.type = 'pointerup';
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(1);
|
||||
expect(control.dragListenerKeys_.length).to.be(0);
|
||||
expect(control.dragging_).to.be(false);
|
||||
});
|
||||
it('[horizontal] handles a drag sequence ending outside its bounds', function () {
|
||||
document.createElement = createEventElement;
|
||||
const control = new ZoomSlider();
|
||||
map.addControl(control);
|
||||
document.createElement = createElement;
|
||||
map.getView().setZoom(0);
|
||||
control.element.style.width = '500px';
|
||||
control.element.style.height = '10px';
|
||||
control.element.firstChild.style.width = '100px';
|
||||
control.element.firstChild.style.height = '10px';
|
||||
map.renderSync();
|
||||
const event = new Event();
|
||||
event.type = 'pointerdown';
|
||||
event.target = control.element.firstElementChild;
|
||||
event.clientX = control.widthLimit_;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(16);
|
||||
expect(control.dragging_).to.be(true);
|
||||
expect(control.dragListenerKeys_.length).to.be(2);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = (6 * control.widthLimit_) / 8;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(4);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = (12 * control.widthLimit_) / 8;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
event.type = 'pointerup';
|
||||
event.target = 'document';
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.dragListenerKeys_.length).to.be(0);
|
||||
expect(control.dragging_).to.be(false);
|
||||
expect(control.currentResolution_).to.be(16);
|
||||
});
|
||||
it('[vertical] handles a drag sequence', function () {
|
||||
document.createElement = createEventElement;
|
||||
const control = new ZoomSlider();
|
||||
control.element.style.width = '10px';
|
||||
control.element.style.height = '100px';
|
||||
control.element.firstChild.style.width = '10px';
|
||||
control.element.firstChild.style.height = '20px';
|
||||
map.addControl(control);
|
||||
document.createElement = createElement;
|
||||
map.getView().setZoom(8);
|
||||
map.renderSync();
|
||||
const event = new Event();
|
||||
event.type = 'pointerdown';
|
||||
event.target = control.element.firstElementChild;
|
||||
event.clientX = 0;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(0.0625);
|
||||
expect(control.dragging_).to.be(true);
|
||||
expect(control.dragListenerKeys_.length).to.be(2);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = 0;
|
||||
event.clientY = (2 * control.heightLimit_) / 8;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(0.25);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = 0;
|
||||
event.clientY = (4 * control.heightLimit_) / 8;
|
||||
control.element.dispatchEvent(event);
|
||||
event.type = 'pointerup';
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(1);
|
||||
expect(control.dragListenerKeys_.length).to.be(0);
|
||||
expect(control.dragging_).to.be(false);
|
||||
});
|
||||
it('[vertical] handles a drag sequence ending outside its bounds', function () {
|
||||
document.createElement = createEventElement;
|
||||
const control = new ZoomSlider();
|
||||
control.element.style.width = '10px';
|
||||
control.element.style.height = '100px';
|
||||
control.element.firstChild.style.width = '10px';
|
||||
control.element.firstChild.style.height = '20px';
|
||||
map.addControl(control);
|
||||
document.createElement = createElement;
|
||||
map.getView().setZoom(8);
|
||||
map.renderSync();
|
||||
const event = new Event();
|
||||
event.type = 'pointerdown';
|
||||
event.target = control.element.firstElementChild;
|
||||
event.clientX = 0;
|
||||
event.clientY = 0;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(0.0625);
|
||||
expect(control.dragging_).to.be(true);
|
||||
expect(control.dragListenerKeys_.length).to.be(2);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = 0;
|
||||
event.clientY = (2 * control.heightLimit_) / 8;
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(0.25);
|
||||
event.type = 'pointermove';
|
||||
event.clientX = 0;
|
||||
event.clientY = (12 * control.heightLimit_) / 8;
|
||||
control.element.dispatchEvent(event);
|
||||
event.type = 'pointerup';
|
||||
control.element.dispatchEvent(event);
|
||||
expect(control.currentResolution_).to.be(16);
|
||||
expect(control.dragListenerKeys_.length).to.be(0);
|
||||
expect(control.dragging_).to.be(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
10
test/browser/spec/ol/control/zoomtoextent.test.js
Normal file
10
test/browser/spec/ol/control/zoomtoextent.test.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import ZoomToExtent from '../../../../../src/ol/control/ZoomToExtent.js';
|
||||
|
||||
describe('ol.control.ZoomToExtent', function () {
|
||||
describe('constructor', function () {
|
||||
it('can be constructed without arguments', function () {
|
||||
const instance = new ZoomToExtent();
|
||||
expect(instance).to.be.an(ZoomToExtent);
|
||||
});
|
||||
});
|
||||
});
|
||||
282
test/browser/spec/ol/coordinate.test.js
Normal file
282
test/browser/spec/ol/coordinate.test.js
Normal file
@@ -0,0 +1,282 @@
|
||||
import Circle from '../../../../src/ol/geom/Circle.js';
|
||||
import Projection from '../../../../src/ol/proj/Projection.js';
|
||||
import {
|
||||
add as addCoordinate,
|
||||
closestOnCircle,
|
||||
closestOnSegment,
|
||||
equals as coordinatesEqual,
|
||||
createStringXY,
|
||||
format as formatCoordinate,
|
||||
rotate as rotateCoordinate,
|
||||
scale as scaleCoordinate,
|
||||
squaredDistanceToSegment,
|
||||
toStringHDMS,
|
||||
toStringXY,
|
||||
wrapX,
|
||||
} from '../../../../src/ol/coordinate.js';
|
||||
import {get} from '../../../../src/ol/proj.js';
|
||||
|
||||
describe('ol.coordinate', function () {
|
||||
describe('#add', function () {
|
||||
let coordinate, delta;
|
||||
|
||||
beforeEach(function () {
|
||||
coordinate = [50.73, 7.1];
|
||||
delta = [-2, 3];
|
||||
});
|
||||
|
||||
it('returns a coordinate', function () {
|
||||
const returnedCoordinate = addCoordinate(coordinate, delta);
|
||||
expect(returnedCoordinate).to.be.an('array');
|
||||
expect(returnedCoordinate).to.have.length(2);
|
||||
});
|
||||
|
||||
it('adds the delta', function () {
|
||||
const returnedCoordinate = addCoordinate(coordinate, delta);
|
||||
expect(returnedCoordinate[0]).to.eql(48.73);
|
||||
expect(returnedCoordinate[1]).to.eql(10.1);
|
||||
});
|
||||
|
||||
it('modifies in place', function () {
|
||||
addCoordinate(coordinate, delta);
|
||||
expect(coordinate[0]).to.eql(48.73);
|
||||
expect(coordinate[1]).to.eql(10.1);
|
||||
});
|
||||
|
||||
it('does not produce unexpected results with string delta values', function () {
|
||||
addCoordinate(
|
||||
coordinate,
|
||||
delta.map(function (n) {
|
||||
return String(n);
|
||||
})
|
||||
);
|
||||
expect(coordinate[0]).to.eql(48.73);
|
||||
expect(coordinate[1]).to.eql(10.1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#equals', function () {
|
||||
const cologne = [50.93333, 6.95];
|
||||
const bonn1 = [50.73, 7.1];
|
||||
const bonn2 = [50.73, 7.1];
|
||||
|
||||
it('compares correctly', function () {
|
||||
const bonnEqualsBonn = coordinatesEqual(bonn1, bonn2);
|
||||
const bonnEqualsCologne = coordinatesEqual(bonn1, cologne);
|
||||
expect(bonnEqualsBonn).to.be(true);
|
||||
expect(bonnEqualsCologne).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#format', function () {
|
||||
let coordinate;
|
||||
beforeEach(function () {
|
||||
coordinate = [6.6123, 46.7919];
|
||||
});
|
||||
|
||||
it('rounds the values', function () {
|
||||
const string = formatCoordinate(coordinate, '{x} {y}', 0);
|
||||
expect(string).to.eql('7 47');
|
||||
});
|
||||
|
||||
it('handles the optional fractionDigits param', function () {
|
||||
const string = formatCoordinate(coordinate, '{x} {y}', 3);
|
||||
expect(string).to.eql('6.612 46.792');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#createStringXY', function () {
|
||||
let coordinate, created, formatted;
|
||||
beforeEach(function () {
|
||||
coordinate = [6.6123, 46.7919];
|
||||
created = null;
|
||||
formatted = null;
|
||||
});
|
||||
|
||||
it('returns a CoordinateFormatType', function () {
|
||||
created = createStringXY();
|
||||
expect(created).to.be.a('function');
|
||||
|
||||
formatted = created(coordinate);
|
||||
expect(formatted).to.be.a('string');
|
||||
expect(formatted).to.eql('7, 47');
|
||||
});
|
||||
|
||||
it('respects opt_fractionDigits', function () {
|
||||
created = createStringXY(3);
|
||||
expect(created).to.be.a('function');
|
||||
|
||||
formatted = created(coordinate);
|
||||
expect(formatted).to.be.a('string');
|
||||
expect(formatted).to.eql('6.612, 46.792');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#closestOnCircle', function () {
|
||||
const center = [5, 10];
|
||||
const circle = new Circle(center, 10);
|
||||
it('can find the closest point on circle', function () {
|
||||
expect(closestOnCircle([-20, 10], circle)).to.eql([-5, 10]);
|
||||
});
|
||||
it('can handle coordinate equal circle center', function () {
|
||||
expect(closestOnCircle(center, circle)).to.eql([15, 10]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#closestOnSegment', function () {
|
||||
it('can handle points where the foot of the perpendicular is closest', function () {
|
||||
const point = [2, 5];
|
||||
const segment = [
|
||||
[-5, 0],
|
||||
[10, 0],
|
||||
];
|
||||
expect(closestOnSegment(point, segment)).to.eql([2, 0]);
|
||||
});
|
||||
it('can handle points where the foot of the perpendicular is not closest', function () {
|
||||
const point = [0, -6];
|
||||
const segment = [
|
||||
[-5, 0],
|
||||
[0, -1],
|
||||
];
|
||||
expect(closestOnSegment(point, segment)).to.eql([0, -1]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#format', function () {
|
||||
it('can deal with undefined coordinate', function () {
|
||||
expect(formatCoordinate()).to.be('');
|
||||
});
|
||||
it('formats a coordinate into a template (default precision is 0)', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const template = 'Coordinate is ({x}|{y}).';
|
||||
const got = formatCoordinate(coord, template);
|
||||
const expected = 'Coordinate is (8|48).';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
it('formats a coordinate into a template and respects precision)', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const template = 'Coordinate is ({x}|{y}).';
|
||||
const got = formatCoordinate(coord, template, 2);
|
||||
const expected = 'Coordinate is (7.85|47.98).';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#rotate', function () {
|
||||
it('can rotate point in place', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const rotateRadians = Math.PI / 2; // 90 degrees
|
||||
rotateCoordinate(coord, rotateRadians);
|
||||
expect(coord[0].toFixed(6)).to.eql('-47.983333');
|
||||
expect(coord[1].toFixed(6)).to.eql('7.850000');
|
||||
});
|
||||
it('returns the rotated point', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const rotateRadians = Math.PI / 2; // 90 degrees
|
||||
const rotated = rotateCoordinate(coord, rotateRadians);
|
||||
expect(rotated[0].toFixed(7)).to.eql('-47.9833330');
|
||||
expect(rotated[1].toFixed(7)).to.eql('7.8500000');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#scale', function () {
|
||||
it('can scale point in place', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const scale = 1.2;
|
||||
scaleCoordinate(coord, scale);
|
||||
expect(coord[0].toFixed(7)).to.eql('9.4200000');
|
||||
expect(coord[1].toFixed(7)).to.eql('57.5799996');
|
||||
});
|
||||
it('returns the scaled point', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const scale = 1.2;
|
||||
const scaledCoord = scaleCoordinate(coord, scale);
|
||||
expect(scaledCoord[0].toFixed(7)).to.eql('9.4200000');
|
||||
expect(scaledCoord[1].toFixed(7)).to.eql('57.5799996');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#squaredDistanceToSegment', function () {
|
||||
it('can handle points where the foot of the perpendicular is closest', function () {
|
||||
const point = [2, 5];
|
||||
const segment = [
|
||||
[-5, 0],
|
||||
[10, 0],
|
||||
];
|
||||
expect(squaredDistanceToSegment(point, segment)).to.eql(25);
|
||||
});
|
||||
it('can handle points where the foot of the perpendicular is not closest', function () {
|
||||
const point = [0, -6];
|
||||
const segment = [
|
||||
[-5, 0],
|
||||
[0, -1],
|
||||
];
|
||||
expect(squaredDistanceToSegment(point, segment)).to.eql(25);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#toStringHDMS', function () {
|
||||
it('returns the empty string on undefined input', function () {
|
||||
const got = toStringHDMS();
|
||||
const expected = '';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
it('formats with zero fractional digits as default', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const got = toStringHDMS(coord);
|
||||
const expected = '47° 59′ 00″ N 7° 51′ 00″ E';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
it('formats with given fractional digits, if passed', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const got = toStringHDMS(coord, 3);
|
||||
const expected = '47° 58′ 59.999″ N 7° 51′ 00.000″ E';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#toStringXY', function () {
|
||||
it('formats with zero fractional digits as default', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const got = toStringXY(coord);
|
||||
const expected = '8, 48';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
it('formats with given fractional digits, if passed', function () {
|
||||
const coord = [7.85, 47.983333];
|
||||
const got = toStringXY(coord, 2);
|
||||
const expected = '7.85, 47.98';
|
||||
expect(got).to.be(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('wrapX()', function () {
|
||||
const projection = get('EPSG:4326');
|
||||
|
||||
it('leaves real world coordinate untouched', function () {
|
||||
expect(wrapX([16, 48], projection)).to.eql([16, 48]);
|
||||
});
|
||||
|
||||
it('moves left world coordinate to real world', function () {
|
||||
expect(wrapX([-344, 48], projection)).to.eql([16, 48]);
|
||||
});
|
||||
|
||||
it('moves right world coordinate to real world', function () {
|
||||
expect(wrapX([376, 48], projection)).to.eql([16, 48]);
|
||||
});
|
||||
|
||||
it('moves far off left coordinate to real world', function () {
|
||||
expect(wrapX([-1064, 48], projection)).to.eql([16, 48]);
|
||||
});
|
||||
|
||||
it('moves far off right coordinate to real world', function () {
|
||||
expect(wrapX([1096, 48], projection)).to.eql([16, 48]);
|
||||
});
|
||||
|
||||
const swiss = new Projection({code: 'EPSG:21781', units: 'm'});
|
||||
|
||||
it('leaves non-global projection coordinates untouched', function () {
|
||||
expect(wrapX([1096, 48], swiss)).to.eql([1096, 48]);
|
||||
});
|
||||
});
|
||||
});
|
||||
63
test/browser/spec/ol/css.test.js
Normal file
63
test/browser/spec/ol/css.test.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import {getFontParameters} from '../../../../src/ol/css.js';
|
||||
|
||||
describe('ol.css', function () {
|
||||
describe('getFontParameters()', function () {
|
||||
const cases = [
|
||||
{
|
||||
font: '2em "Open Sans"',
|
||||
style: 'normal',
|
||||
weight: 'normal',
|
||||
families: ['"Open Sans"'],
|
||||
},
|
||||
{
|
||||
font: "2em 'Open Sans'",
|
||||
style: 'normal',
|
||||
weight: 'normal',
|
||||
families: ['"Open Sans"'],
|
||||
},
|
||||
{
|
||||
font: '2em "Open Sans", sans-serif',
|
||||
style: 'normal',
|
||||
weight: 'normal',
|
||||
families: ['"Open Sans"', 'sans-serif'],
|
||||
},
|
||||
{
|
||||
font: 'italic small-caps bolder 16px/3 cursive',
|
||||
style: 'italic',
|
||||
weight: 'bolder',
|
||||
families: ['cursive'],
|
||||
},
|
||||
{
|
||||
font: 'garbage 2px input',
|
||||
families: null,
|
||||
},
|
||||
{
|
||||
font: '100% fantasy',
|
||||
style: 'normal',
|
||||
weight: 'normal',
|
||||
families: ['fantasy'],
|
||||
},
|
||||
];
|
||||
|
||||
cases.forEach(function (c, i) {
|
||||
it('works for ' + c.font, function () {
|
||||
const font = getFontParameters(c.font);
|
||||
if (c.families === null) {
|
||||
expect(font).to.be(null);
|
||||
return;
|
||||
}
|
||||
font.families.forEach(function (family, j) {
|
||||
// Safari uses single quotes for font families, so we have to do extra work
|
||||
if (family.charAt(0) === "'") {
|
||||
// we wouldn't want to do this in the lib since it doesn't properly escape quotes
|
||||
// but we know that our test cases don't include quotes in font names
|
||||
font.families[j] = '"' + family.slice(1, -1) + '"';
|
||||
}
|
||||
});
|
||||
expect(font.style).to.eql(c.style);
|
||||
expect(font.weight).to.eql(c.weight);
|
||||
expect(font.families).to.eql(c.families);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
BIN
test/browser/spec/ol/data/14-8938-5680.vector.pbf
Normal file
BIN
test/browser/spec/ol/data/14-8938-5680.vector.pbf
Normal file
Binary file not shown.
842
test/browser/spec/ol/data/bing_aerialwithlabels.json
Normal file
842
test/browser/spec/ol/data/bing_aerialwithlabels.json
Normal file
@@ -0,0 +1,842 @@
|
||||
{
|
||||
"authenticationResultCode": "ValidCredentials",
|
||||
"brandLogoUri": "http:\/\/dev.virtualearth.net\/Branding\/logo_powered_by.png",
|
||||
"copyright": "Copyright © 2015 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.",
|
||||
"resourceSets": [{
|
||||
"estimatedTotal": 1,
|
||||
"resources": [{
|
||||
"__type": "ImageryMetadata:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
|
||||
"imageHeight": 256,
|
||||
"imageUrl": "https:\/\/ecn.{subdomain}.tiles.virtualearth.net\/tiles\/h{quadkey}.jpeg?g=3542&mkt={culture}",
|
||||
"imageUrlSubdomains": ["t0", "t1", "t2", "t3"],
|
||||
"imageWidth": 256,
|
||||
"imageryProviders": [{
|
||||
"attribution": "© 2015 DigitalGlobe",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -67, -179.99, 27, 0],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [27, -179.99, 87, -126.5],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [48.4, -126.5, 87, -5.75],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -67, 28, 86.5, 179.99],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -67, 0, 37.8, 28],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [37.7, 18.5, 59.8, 28],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [43, -81.6, 48.4, -10],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [27, -70, 43, -10],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [27, -10, 35.8, 0],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [27, -120, 32.3, -105.8],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [43.4, 13.78, 54.9, 18.5],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of NASA",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 8,
|
||||
"zoomMin": 1
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© Harris Corp, Earthstar Geographics LLC",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 9
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of USGS",
|
||||
"coverageAreas": [{
|
||||
"bbox": [17.99, -150.11, 61.39, -65.57],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© Getmapping plc",
|
||||
"coverageAreas": [{
|
||||
"bbox": [49.94, -6.82, 60.17, 1.78],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 GeoEye",
|
||||
"coverageAreas": [{
|
||||
"bbox": [48.95, -152, 65.5, -95.4],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [45.15, -73.2, 48.9, -70.2],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [31.87, -67.56, 49, -50.46],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -23, -180, 30, -145],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -37.7, -110, 26.5, -33],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -46, -20, 67, 180],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Pasco",
|
||||
"coverageAreas": [{
|
||||
"bbox": [23.5, 122.5, 46.65, 151.66],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© GeoContent \/ (p) Intergraph",
|
||||
"coverageAreas": [{
|
||||
"bbox": [47, 5, 55.5, 16],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [46.25, 9.4, 49.2, 17.3],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Intermap",
|
||||
"coverageAreas": [{
|
||||
"bbox": [49, -11, 60, 2],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 1
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of the IndianaMap",
|
||||
"coverageAreas": [{
|
||||
"bbox": [37.7, -88.2, 41.9, -84.7],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of the Nevada State Mapping Advisory Committee",
|
||||
"coverageAreas": [{
|
||||
"bbox": [34.85, -120.2, 42.12, -113.91],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 InterAtlas",
|
||||
"coverageAreas": [{
|
||||
"bbox": [48.37, 1.4, 49.28, 3.37],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [47.72, 1.67, 48.05, 2.18],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [45.55, 4.57, 45.95, 5.33],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [43.18, 4.92, 43.77, 5.82],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Eurosense",
|
||||
"coverageAreas": [{
|
||||
"bbox": [51, 3, 53.65, 7.67],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [50.58, 5.42, 51, 5.47],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 IGP",
|
||||
"coverageAreas": [{
|
||||
"bbox": [36.88, -9.6, 42.27, -6],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 IGN",
|
||||
"coverageAreas": [{
|
||||
"bbox": [42, -5, 51.25, 8.5],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [41.25, 8.3, 43.1, 9.65],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [17.85, -63.17, 18.15, -62.77],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [15.75, -61.9, 16.55, -60.9],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [14.35, -61.25, 14.95, -60.75],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [2.25, -54.65, 6, -51.4],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [ -21.5, 55, -20.75, 56],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [46.7, -56.5, 47.2, -56.1],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© Province of British Columbia",
|
||||
"coverageAreas": [{
|
||||
"bbox": [48.99, -139.05, 60, -114.05],
|
||||
"zoomMax": 18,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Blom",
|
||||
"coverageAreas": [{
|
||||
"bbox": [36.1, -9.51, 51.04, 11.67],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [55.69, 9.8, 61.17, 13.23],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [62.2, 25.82, 62.24, 25.89],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Aerials Express",
|
||||
"coverageAreas": [{
|
||||
"bbox": [34.63, -90.41, 35.52, -89.48],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of LAR-IAC",
|
||||
"coverageAreas": [{
|
||||
"bbox": [33.27, -119.02, 34.9, -117.59],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Image courtesy of ImagePatch.com",
|
||||
"coverageAreas": [{
|
||||
"bbox": [25.74, -106.76, 36.63, -93.97],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}, {
|
||||
"bbox": [34.36, -93.14, 35.44, -92],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "State of Michigan",
|
||||
"coverageAreas": [{
|
||||
"bbox": [41.68, -86.87, 45.89, -82.91],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 14
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "Earthstar Geographics SIO",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 8,
|
||||
"zoomMin": 1
|
||||
}, {
|
||||
"bbox": [70.61, 78.75, 71.52, 81.56],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [68.66, 135, 69.66, 137.81],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [67.61, 171.56, 68.66, 174.38],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [67.61, 70.31, 68.66, 73.13],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [66.51, -180, 67.61, -177.19],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [65.37, 36.56, 66.51, 39.38],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [64.17, -171.56, 65.37, -168.75],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [54.16, -70.31, 55.78, -67.5],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [52.48, -180, 65.37, -163.13],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [47.04, 140.63, 58.81, 154.69],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [36.6, 132.19, 40.98, 137.81],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, 64.69, 34.31, 67.5],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, 28.13, 34.31, 33.75],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, 16.88, 38.82, 19.69],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [29.54, 61.88, 31.95, 64.69],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [27.06, 123.75, 31.95, 129.38],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [24.53, 2.81, 27.06, 5.63],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [19.31, 16.88, 27.06, 22.5],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [19.31, -8.44, 27.06, -2.81],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [19.31, -95.63, 29.54, -84.38],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [16.64, -87.19, 19.31, -81.56],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [11.18, -81.56, 16.64, -61.88],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [5.62, 106.88, 21.94, 118.13],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -11.18, 143.44, -8.41, 146.25],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -13.92, 177.19, -11.18, 180],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -13.92, 137.81, -11.18, 140.63],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -85.05, -180, 85.05, 180],
|
||||
"zoomMax": 13,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [76.18, 67.5, 77.47, 70.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [74.02, 59.06, 75.5, 61.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [71.52, 118.13, 73.23, 120.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [70.61, 154.69, 71.52, 157.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [70.61, 146.25, 72.4, 151.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [70.61, 50.63, 74.78, 56.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [70.61, -11.25, 71.52, -5.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [70.61, -180, 72.4, -177.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [67.61, -180, 69.66, -177.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [62.92, -25.31, 67.61, -11.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [62.92, -56.25, 70.61, -50.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [62.92, -70.31, 64.17, -67.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [58.81, -47.81, 61.61, -42.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [52.48, 171.56, 54.16, 174.38],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [50.74, 0, 54.16, 5.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [47.04, -11.25, 61.61, 0],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [38.82, -33.75, 40.98, -30.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [38.82, -73.13, 40.98, -70.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [36.6, -11.25, 45.09, -2.81],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [36.6, -30.94, 40.98, -22.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [34.31, -75.94, 38.82, -73.13],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [34.31, -123.75, 36.6, -120.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, -67.5, 34.31, -64.69],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, -78.75, 34.31, -75.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [31.95, -120.94, 34.31, -118.13],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [27.06, -95.63, 29.54, -87.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [27.06, -180, 29.54, -177.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [24.53, -174.38, 27.06, -171.56],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [16.64, -163.13, 24.53, -154.69],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [13.92, -25.31, 19.31, -22.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [13.92, -171.56, 19.31, -168.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [11.18, 143.44, 21.94, 146.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [8.41, 137.81, 11.18, 140.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [8.41, -109.69, 11.18, -106.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [5.62, 157.5, 8.41, 160.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [5.62, 149.06, 11.18, 154.69],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [5.62, 132.19, 8.41, 135],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [0, -177.19, 2.81, -174.38],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -2.81, 165.94, 0, 168.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -2.81, -92.81, 2.81, -87.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -2.81, -163.13, 8.41, -154.69],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -5.62, 53.44, -2.81, 56.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -8.41, 70.31, -5.62, 73.13],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -11.18, 160.31, 21.94, 180],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -11.18, -140.63, -5.62, -137.81],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -13.92, 174.38, -11.18, 177.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -13.92, 95.63, -11.18, 98.44],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -16.64, -8.44, -13.92, -5.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -19.31, -154.69, -13.92, -140.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -21.94, 174.38, -13.92, 180],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -21.94, 61.88, -19.31, 64.69],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -21.94, 53.44, -19.31, 59.06],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -24.53, -140.63, -19.31, -132.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [38.82, -180, 71.52, -50.63],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -24.53, -151.88, -21.94, -146.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -24.53, -160.31, -16.64, -157.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -24.53, -180, 0, -160.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -27.06, -81.56, -24.53, -78.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -27.06, -132.19, -21.94, -126.56],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -29.54, 165.94, -27.06, 168.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -29.54, -109.69, -24.53, -106.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -29.54, -146.25, -27.06, -143.44],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -31.95, 157.5, -29.54, 160.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -34.31, -81.56, -31.95, -78.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -45.09, -19.69, 74.02, 180],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -45.09, -177.19, -43.07, -174.38],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -47.04, 50.63, -45.09, 53.44],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -47.04, 36.56, -45.09, 39.38],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -48.92, 177.19, -47.04, 180],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -50.74, 67.5, -47.04, 73.13],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -54.16, 165.94, -34.31, 180],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -54.16, 73.13, -52.48, 75.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -54.16, -61.88, -50.74, -56.25],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -55.78, 157.5, -54.16, 160.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -55.78, -39.38, -52.48, -33.75],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -57.33, -120.94, 31.95, -30.94],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -58.81, -28.13, -57.33, -25.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -61.61, -47.81, -60.24, -42.19],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2012 DigitalGlobe",
|
||||
"coverageAreas": [{
|
||||
"bbox": [47.04, 67.5, 48.92, 70.31],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [21.94, 45, 24.53, 47.81],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -19.31, 14.06, -16.64, 16.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -38.82, -64.69, -36.6, -61.88],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [ -47.04, -70.31, -45.09, -67.5],
|
||||
"zoomMax": 17,
|
||||
"zoomMin": 10
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Microsoft Corporation",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 1
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 HERE",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 9,
|
||||
"zoomMin": 1
|
||||
}, {
|
||||
"bbox": [14, -180, 90, -50],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [27, -32, 40, -13],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [35, -11, 72, 20],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [21, 20, 72, 32],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [21.92, 113.14, 22.79, 114.52],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [21.73, 119.7, 25.65, 122.39],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [0, 98.7, 8, 120.17],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}, {
|
||||
"bbox": [0.86, 103.2, 1.92, 104.45],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© AND",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -90, -180, 90, 180],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 10
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 MapData Sciences Pty Ltd, PSMA",
|
||||
"coverageAreas": [{
|
||||
"bbox": [ -45, 111, -9, 156],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 5
|
||||
}, {
|
||||
"bbox": [ -49.7, 164.42, -30.82, 180],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 5
|
||||
}
|
||||
]
|
||||
}, {
|
||||
"attribution": "© 2015 Zenrin",
|
||||
"coverageAreas": [{
|
||||
"bbox": [23.5, 122.5, 46.65, 151.66],
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"vintageEnd": null,
|
||||
"vintageStart": null,
|
||||
"zoomMax": 21,
|
||||
"zoomMin": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"statusCode": 200,
|
||||
"statusDescription": "OK",
|
||||
"traceId": "510519adad2f4977a0ce328eafbf702c|DB40190745|02.00.163.2700|"
|
||||
}
|
||||
BIN
test/browser/spec/ol/data/dot.png
Normal file
BIN
test/browser/spec/ol/data/dot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 478 B |
446
test/browser/spec/ol/data/mapbox-geography-class-1-1-0.grid.json
Normal file
446
test/browser/spec/ol/data/mapbox-geography-class-1-1-0.grid.json
Normal file
@@ -0,0 +1,446 @@
|
||||
{
|
||||
"grid": [
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ! ",
|
||||
" ! ",
|
||||
" ! ! ! !!! ",
|
||||
" !!!!!!! !! ",
|
||||
" ### # !! !! !! ",
|
||||
" ###### ! !!! ",
|
||||
" #### !!! ",
|
||||
" #### !! ",
|
||||
" ## # ! ",
|
||||
" ## # !!! ",
|
||||
" # ! !!!! ! ",
|
||||
" !! !!!!!!!! !! ! ",
|
||||
" !!! ! !!!!!!!!! !!!!! ",
|
||||
" !! !!!!!!!!! ! ! ",
|
||||
" !! !!!!!!!!!! ! ! ",
|
||||
" !! ! !!!!!!!!!!!!!!! !! ",
|
||||
" ! ! !!!!!!!!!!!!!!!!!!! !!!! ",
|
||||
" ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
|
||||
" ### !! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
|
||||
" ####$! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" ##%%$!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" #%%%$$!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" #%%%$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" #%%% $$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" #%%%$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" ###%% $$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||
" ###%% $$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ",
|
||||
" ###%%&$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
|
||||
" ##%%% ''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
|
||||
" ( %% ))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
|
||||
" ((% **+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
|
||||
", --....*+!!!!!!!!!!!!///!!!!!!!!!!!!!!!!!!!!!!!! ! ",
|
||||
", 0--....++11!!!!!!!!!//////!!!!!!!!!!!!!!!22!!!!!! ! 3",
|
||||
" 4---5...11111!!!!///!///////!!!!!!66!!!!!!222!!!! ! ! ",
|
||||
"444--5771111111!!//////////////6666666666622222!!! ",
|
||||
"44489:;;<<<111!!!!/////////////26666666666622222!! ! ! ",
|
||||
"44499=>??<< 1!!!! //@@///////222266666666222222!! ",
|
||||
"44 499=??A B!! /@@@@//CCC22222666666222222D! EE ",
|
||||
"F 9 99GHHIIIIIIJJ KKK@@@@@C22222222222222222DD E ",
|
||||
"F HHHIIIIIILL KKKK@@MM222222222222222 2 D EE ",
|
||||
"NNNO P HHH IIQRRLLLLLKSSSTT222222222222222 UU EE ",
|
||||
"NNNO QQRRLLLLLSSSTTVV22222222222222 UEEE ",
|
||||
"NNNOWW WWX XYZZRRRLLLLSSTTTVV222222222222222 E ",
|
||||
"NNNNWWWWWXXXXZZZZ[LLLLTTTTTVV]2222V222222222 ",
|
||||
"NNNNWWWWWXXXXZZZZZ LLLTTTVVVVV]]VV^^2222222 ",
|
||||
"NNNNWWWWWXXXX ZZZZZ_` TTVVVVVVa^^^222222bbE ",
|
||||
"cNNdddeeWfffffZZZZZZ`` VVVVVVVa^^^ghh22 ",
|
||||
"ccddddeeefffff ZZZi`` VVVVV ^^jjh 2 k ",
|
||||
"ccdddeeeefffffliiii VVVV ^jjjh k ",
|
||||
"ddmdmeeefffffnnii VV V jjoh kk ",
|
||||
"pqmmmreeeffffnnssst VV j hh k ",
|
||||
"pmmmmreuuvvvnnnnnt w V j k ",
|
||||
" mmrruxuxvvvnnntt y z zz ",
|
||||
" {||xxxx}}~~tt yyzz zy "
|
||||
],
|
||||
"keys": [
|
||||
"", "185", "165", "71", "207", "7", "69", "62", "134", "132", "30",
|
||||
"79", "59", "177", "115", "164", "226", "43", "228", "74", "58",
|
||||
"149", "205", "41", "109", "18", "98", "184", "96", "28", "202",
|
||||
"229", "25", "80", "117", "179", "113", "68", "6", "87", "222",
|
||||
"19", "217", "105", "216", "64", "221", "146", "211", "106", "3",
|
||||
"170", "121", "101", "127", "66", "108", "188", "123", "166", "147",
|
||||
"9", "169", "24", "223", "145", "159", "213", "189", "124", "235",
|
||||
"240", "215", "174", "67", "161", "70", "118", "214", "22", "45",
|
||||
"199", "200", "39", "190", "130", "46", "99", "156", "86", "47",
|
||||
"225", "116"
|
||||
],
|
||||
"data": {
|
||||
"3": {
|
||||
"admin": "Afghanistan",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"6": {
|
||||
"admin": "Albania",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"7": {
|
||||
"admin": "Aland",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABBEAIAAAD4cUrFAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAFKklEQVR42u2dTUhVQRTHB7JN5VdiBGEQgW0kRIWgReEiiijQ3NRCQQnpY2dFhZtoFSRCRJBBSIFQQauihRFBRlCCleU2KioeCSkokW4s3zxjHnPnvnPmw/fue//N4TF37tyZub935szMmXOFEB0dIyPJke3d91r3DZ9NXRhaWD9+uuzqUufEJXEySy5NCiF+zp8f3dw+2V9xp2VIlx82VTc2/5C/P26o3dv0eu7JrV8VTfJevcwvO5/P1Mxtfd/TeO1x0nosXzLpYOkoGMCSMKlIyd85wEqnAKzSA4ugsVSYdMigsQAWC6xz89lg6dJ2KFyuA9ApbbAOl39qmXC3sb5Pv9hd9RkaC2Blg/W2am3LLpOlZQRL+Q2NBbCijHcJVlqyjXfYWJgVqlK1sVSw2ENhxKwQGgtDoToU6lJCNlxzpnk/NBbA8geWHBzZYEFjwcZyBwsLpLCxKMZ7lgkPjQWwfM0KdbxWwLp99D9YGl7QWACLDRZmhQArF1iKvolYefdmvAMazAr1LR0Pxjs0FobCWIcZbEIDLG+OfqQtHQ0vbEIDLONQaOnoB40FsCL2CtNgmRz94JoMsCLAWqwb/7NmQndx8ayxsPJuC5aq2E1KXqarknuV8lsvITpPBFiBHf1WwOquu17PrS2nvZSrdr1q96boPGj37ujqbRtoSJbsOXD5aW85CSz3wxSK8d7a1/et/1ASe2z1pUh1jZ2oPJiRo2M3KisiJCWPmtPu3lgpX62UM5Wv7q77bbKubJcblC0dQ8nTV17OlO+RdXBpC0PG9ydF+iqTUk9FCtOLMVkbxhRKfr/lk8GK11sUjUVqEbeN9H6I7w2HXvLwHg0ptEokS5r2Ch1sLEiuFMWBUWifd7Y+CNe6/JZJvldkKeQikVMNucDKklluM8v3FmOfrLYUs+8GH1UPzB4beLaxliQLM78mv9488mDbYjxY6tVU+6mpLZ0RT+fWx1e7El6OMJ0SToqMdzuOP6WjD4uQvqSIn4rHRz2I39ylTPXdy88BlskpmVw3bs3zVQ43DyX4AL0+erqgNDi+CPcOdSmfC1YILPz2gF3OEH8Su/clfws60fQ8do20+7eFA4v+mn31iak+vmro8izucwW3I+yUs7syN6bkdSh0+ePZ/eW4xgN3NHAZFo1DIVdjhUCK+1w7sCidbtded/vJ7lkhLGAXXVvss0LCUIgZXJBZYcLWq8hrWpl1LIqNZVrH8rWmFX8XvUx6fShPtLuXnLPYV94JNla2dwNW3j2tvOdtByrcvpvujxVrY3nbhKb7BRTOvmGwJ4oCbVIwsErIu2F12mJ4irDztrG8i9tsOx3APQmdhswJLDsvKLs83P7k9qG73pVDofSHlL6RDJ9GXx6nindopg4ED0aaB6nP+Fi6B6mptsarhPZaeqgq5UeU7OkdkdqipCfM5337wvGHg13S590lPhYjjFE6BT7vbJ93zukL+lkOejrlHIia3lZ/P/XvlE7ZxTcu0Wai/LG4p3TiT8hwz9L46k+X8zZ2+U1XSzLwWo74WDnCcePMIGI3ID4WwAoexgjxsQBWkMBriI8FsBAfC2AVY3wsfKQJYCE+FsAquPhY+EgTwMoF1qrGx4LGwlDoOT4WNBbA8hofCxoLYPlYbtAGVmgsgBUkPhY0Fr7+ZQTLcoEUGgsaizIUwsYCWN6Md8R5B1jBlxvYnzzBUFgaYC1Ly29CQ2MBrHCOfvqwCBsLYI2QvkyR2Sv0GdwWGgsai+02Q/EghdsMV/4FWkOpeRgUuWYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjAtMDQ6MDDXccruAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjE2OjMyLTA1OjAw4QrLNgAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQUxELnN2Z5NDSAsAAAAASUVORK5CYII="
|
||||
},
|
||||
"9": {
|
||||
"admin": "United Arab Emirates",
|
||||
"flag_png":"iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACnklEQVR42u2avUoEMRDHF7XV48BCS0Gv0kp7fQMRbNQXEBQLLX0DQSwVfAKLK6+xUMHG6rAQROz8wMJCLLVQOVQ8WHaZZCZLcv7+C2HZzd0mk18mk4+s3a7XG40Y0su12kdjs/U8dji2N3K/Mziwn2UHV1n2mx42/9L886Kc3W/z90V5yp+Xl0r+D5pv+f2zJL+fVXNP4gZLUj0/I8qRLW8wefOUdwk9HOGg9KpXCmAF6E/GXkpeKnmDhfagErgV9UoZLL2rD+EJystW3uM19bIaUo3qlc5Q6DrEWBnO77lrw8t9idXw59oVHT1iah7LKobwC//9GtI1xvKrqd9b21AhSbBcDRQiOLUKgW1jrBB+UR1TpjYU6t11OC8liaLk4Fo1vP5bXkCn5rH08ZDVXNJ1icFvMUK/XFJ9fZP3WPoGDrGEoQnJqx8i9UsVBW/T9Fh+w4TV1NpqvUczmfCbperrK7ZhrwyF+tWgomYwnSup/I1m50A/BDvGlGlu6YQIhF1ncLaIuPotq/0GW1tFClZ92mfl3dUQIfYQJX09HND6fU8r+JIEK99IVfZO+ZzU6le2e4WhbRX1ckMerCKYSKNP4wHrOz27nnid3F49Pmoubizdnj6tTHany+cnu8vn3feh03wZikrVS2m5tSU2iQms9drM+NZVa6o9t/Q+fD/7ePFZoI+X6q78d6svQ2zXp0BJgoXiF2AhwEKABViABVgIsBBgARZgARYCLARYgAVYgIUACwEWYAEWYKFeB+tt/G7+4UZSAflxDvJUkyc+sH4O+o2+dA76LTwubnQOlnGleUV4NLnW3zma3DfUOZqMkhVgIcBCgAVYgAVYCLAQYAEWYAEWAiwEWIAFWICFAAsBFmABFmAhwEKABVj/T1+gjm/JSCOymgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMTk6MTc6MjQtMDU6MDChspWsAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9BUkUuc3Znl/8CUAAAAABJRU5ErkJggg=="},
|
||||
"18": {
|
||||
"admin": "Austria",
|
||||
"flag_png":"iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABEklEQVR42u3dsW2DQBiG4WMb2xPYnpHeg1B5Fs/AAFRQuKE5Cc7/YRDPV7xVgpzTI0VxdEnq++vlcVeNbXIECpaCpWA5CAVLwVKwVMFSsBQsVbAO1fHWPBuwVMFSsHzzAksVLAVLwVIFS8FSsCr/+P195rxbPm35x0e9wqhn/vJZNc4nB2t4dZ93qxrbNJpVGFgGloFlYJmBZWAZWGZgGVgGlhlYBpaBZQaWgWVgmYFlYBlYZmDZbmG5T6JVbukU3jjL3T5b0rU32sqelnudsR+/5ddb9pw/nY+b0OqKvYLlr+aB5SAULAVLwXIQCpaCpWCpf2IAlvfGwFKwVMFSsBQsVbAULAVLFSwFy3vlp/o11ATvdjw6QaUN+AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMTk6MjQ6MTMtMDU6MDCYT3HDAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9BVVQuc3Zn13qM2gAAAABJRU5ErkJggg=="},
|
||||
"19": {
|
||||
"admin": "Azerbaijan",
|
||||
"flag_png":"iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACw0lEQVR42u2aPWgUQRiGp7KysJADK3+wsbCRWBmL+I9gjpB0iohyNiLKWYhgRIJVIERJcyBamKCIEjgLUXKKkkJFLQQtREKEJBqjBHL+K4cWbwIjyx6zu3PnXfZpHvb29r7ZnX3u+2Zn1hhTGB39CKFv0gUQsSBiQcSiIyBiQcSCiAUhYkHEgogFIWJBxIKIBSFiQcSC6WN25ODp829gtm3/QN/9eXYfONu/c572/lq0q1aq76k17ev1dLwZ/2xutuTd+XbKrGlpDdL+NmrMJPHDjq8eJ6zdicHMnR27353ZsHffxpnOPaV8Zqa36+HJgrYnL6y+0f4j2G6S621kxutbbZuoP07SmMvNrs/5BCl1vvfczT4qVb7OPi93/LlWWVEpir9fjF2cHPxZeJp5NTH3oHfzlW1T4+uWdT1Lfg6N0P+1IGLl55ace33pm61RZen7wqf+8pOB7uunPqzdPnRkqzQSpeDsiWNDfcuV2+p/2xqfJm0XXF2pX7df9ozlJJNLHKmmAopMiJWfXrlp+tBVZSY7S7koVV1WJEu1WCpzdq7Snqjl2M5bklVZUHppsI9YqaBuuYbhtljSIp6mX1Zdfnxrl3KeBv6KHzX//a+BNmJ5oLKInvLsIhjvKU/qBDUV7exFxkKsCNGU54JiKW8hFqWwmGTYrlIoWe1SqIkJxlgpYtjgPZ6myoIM3hGrVROb9gy7tu285bLE5GsxBLEWFZVdbL3sCVIXsZggRazQQqa1v3+yV8iSjkobSzqIFWEAXs9FaMRqsrU/X9GCr80ob4W9NrOY/mC+pnBNduT4vc5y07P96JaO9Z6j2TH9xk8BjTHF0uE2CH3TDA/ncgsftO3CsON97Xdv1z1C9SPDOiheHF/n0yxxgt9GuKkQupMugIgFEQsiFh0BEQsiFkQsCBELIhZELAgRCyIWRCwIPfEv4VStsKuTQYgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjI0OjQ1LTA1OjAws39KnQAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQVpFLnN2Z3usgD0AAAAASUVORK5CYII="},
|
||||
"22": {
|
||||
"admin": "Benin",
|
||||
"flag_png":"iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABo0lEQVR42u3br0sDYRzA4TMYHS5sQZwiCBYPsS0Z1KQzXFldMhoGCy4IwsQZBZNt/gVms0GDZeKKYU0YFmEilvkjrGxG3YF6T/mEi3cP3/e997ggCOr1KEpCZ6rHextL7dp1O5d/f7ndzjR6vWYzm9U4GoClYIEFFlhggaVggQUWWGCBpWB9o4fP0RVYYMUOy4MHy8QCCywFCyywwALLcYOaWB4/WGCBBZaCBQFYYIEFFlhgKVjOscAyscACS8ECCyywwAJLwQILLLDAAkvBAgusXwnrY6WVyxTe1u9qmUsdbfv3NkGwcmsH7c2T1nllaqHU7ZbLc2caXxP0rXB6fPdpa+zmfra4XH8sT+yE+U4jVQr3O510OgyHruiPm6CJNQTrYnJ+8aFPSuNoUicWWGCNokeV6BQssMACCywF6wuswaIAlokFFlhg/UtMgwULLBMLLLAULLDAAgusP7KFBwsssMCyFCpYYIEFFlhgaaJhpaqrhVewwBr1WyFYYFkKwQJLwQILLCfvYJlYChZYYFkKwQJLLYXD/xVCAJY9FlhgJbufplbALlZTXuoAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjI1OjM1LTA1OjAwVngougAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQkVOLnN2Z88UG/8AAAAASUVORK5CYII="},
|
||||
"24": {
|
||||
"admin": "Bangladesh",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8EAIAAABPzVTaAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACn0lEQVR42u2dPS9EQRSGtxalaIhGSFYk66tQEcuusGyyFY0NiYpOIhK1hlqpQjZR+An4AVQKttSpVEKikChexSTiI+7dufPxNE/Bunfu5smZM+fOHLlc+8ZGtQphyuQrgIgFEQsiFl8ERCyIWBCxIEQsiFhus/N5fW+x62eiCGL9ItD0yPLd/MXOUqVv9vW4d/KxdH65Nb49k79ujr1Mb933DL8Xm6J+IuqT+itdAeGiFquQr7dVbvavyrXymxR5GRjonppIwqeDwa6phq6mKw9trjQrV2gUuFimTA8dhUaxnlymv6imO/bfrq4tzKBUUGKt9tVKc6OayFot03fU3TUSxMr5njkpWmQl088xLOpszF+llFa7o9RXaoSR6oVS6IVY1f9NfJqestVLI0csR9NzX6LUd3JHlNq7P0Qt47Nd8aW7coyiMBHq9Ofy5BjFtOjy4FTXtlPqtCmfrhx41T6MWOVCek7c8kAsLc7TesfnJvV0wZYh3ByW9hG0Ig65E9s0Ej0pYlmitqmEGqtM6kkRyxL9qq0nr8sjliX6nl39fcLVZsMAMy0303YXyqF2srFgU/hQxfKlACGxAqzFE7EoOiAWYiFWMrGU0saTvLMqtMSTs8nd0iHlBsQKqkBqM/GnQOr0Kx0fX0LzSoeX0KTtsW6b8XGiZNtMxiebs9ro1zrqifR0iOV93DIjDVuTEevzMEUY+RaHKRw9/uXj6s9k/ah2Olfm+BfpPNNfTEfs/arLc8SeDg4plxVoCuJ9GyPXjkjQxojGaymv+CJKz+NpFallvM1WkboLrSIjam5rSqY9T8mny6/NbZGJdtyf7bglhNmO22zEbVK/pR03YqXwbwQUgVAHsSBiQcSCELEgYkHEghCxIGJBxILw3/wAd3GLQCDAyg4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjI2OjE3LTA1OjAwaPWF7QAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQkdELnN2Z8hsolUAAAAASUVORK5CYII="
|
||||
},
|
||||
"25": {
|
||||
"admin": "Bulgaria",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8EAIAAABPzVTaAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABOklEQVR42u3aIVICcRjG4S94AbcZsLHJRqNRTEYS1Sw2K8yQOAB4AJt3oOEFDIyVA2DxABo06CzMLMzHiPK84ZEh6PDnN8uMS7yb7WHhCExYJiwTlpmwTFgmLDNhmbBMWGbCMmGZsMyEZcIyYZkJy4RlxxbWsv3WfR2Sucb500NnsCJzjYjJ/OZqe6fTfn/dM1V3+/38LTe9a9u+v18/7u9uy83W+QPkd3+EVX1cfcaRsVZY1SvT52NHw7QrlisThUUfhTzasBwEk8NyBBQWhUVhOQgKi8KisEhhrfnahjsHwkp2f3cO/Os47ZbOX7fO98b+0+s9YM+ex8V1l8w1Zietx8YFmWu8jJqXpz0y11gsyrIoyFyFRWFRWBSWg6CwKCwKy0FQWBQWhUUKi8KisEhhUVgUFiksHrAfuwGIY4Xi14MAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjI2OjQwLTA1OjAw5bK1BwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQkdSLnN2ZyfMwHcAAAAASUVORK5CYII="
|
||||
},
|
||||
"28": {
|
||||
"admin": "Bosnia and Herzegovina",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"30": {
|
||||
"admin": "Belarus",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADcUlEQVR42u2dMWhUQRCGX62FEkyr2BmCYGXEQiyvtrGxSyFpbERSiW0KRSvhGhsb0Ua7tBYRDBoMIhIEScBCOQhaHEYlaPFd8cPy7r0NpPJrfoa5bQ4+ZmZ3Zvc1f+/tr+2v/fk2ujG6iX49sXJ/ZZie9JfrPxyfez336s1ac6w5oqpoAyi7K08uPBn8eLc6Xv318cXCeGGMnX4ASr9gqR1g7S1uzWyd+/J0+e3y5qezg73B3s77pY2lDfzY+Fnz+8P25Z2jgqX2Auvzmav7V/e/n3y++nwVm8hU+lkvWGoHWKNbw8HwCpFpfGd9Z/0nFRVpkSiFH5v1gqV2gAUuwERkAh2gwcbPGtYLltoBFtEo0xw2AKWfSov1gqVWgEVCxGYPmP5Ml4Kl9jpuQDP9pX/z9Oz67Hp6BEvtFbGAifQHOnjSj836H9vjX7szgqV27Aoz/ZHygAY706K7QrUXWOz1sn7KQ9HSn20fwVJbweIoAWhIguUpPP6MXoKl9qqxwAWYQA0PNn487grVil0hUYofsoRv8wuW2gEWTWUaOPyQswzpx7YJrVbUWLg4rwIX9oDY+FnDesFSO8CiJM+YVKa/jFusFyy1AyxSHjEJBabSRlnvAanaCyxiUk6QlpVW/mrEUitaOhx+lmMz6RcstWIeq5x8p5Yqp+Cdx1IrwGIPiHIcCkaAlb8KllqRCkEEJfGl5q/OvKsVxTtxKNvMeTMHP7Y1lnpAsLIJDWQkQWzBUg8lFdqEViuK9xySoWCneMdv8a4eEKwclfG4QT3EA1IaOKXfVKhWt3TKNk7Z0nG6QT3EJrRgqRVjM1nCJ1iOzdRqTrD9b/+rY9APyNoG/Ribuf7g9uP5i4OHi6eaRlXRXqPJGZNyNHl09+ej0bX588+OzV9qmuHLplHVidZepmBvOLknLVjqdLA4PshrXm3Xv7AnxxOCpU4Ha/qF1YxerJm8oSVY6nSwaq/YTx4LESx1OlgHexREsNReNVYmwXzAqPQz6CdYaq9dYT6wlkhl3zBXCpbaK2LlY5BtT0ViuytUK8CiVJ/+uK1gqRVg5XPcRKm8V5jPdOdz3IKl9toV5rFCOfPucYNaDRa9v/IzJ22fPLFXqPYCq/xIU37mpO0jTYKl9jpuaPt8XPrzxEuw1A6wGNnL9k7bhzDTI1hqm/4DcvO4XhRykw8AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjI3OjUxLTA1OjAwYK3VEwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQkxSLnN2Z00LMLQAAAAASUVORK5CYII="
|
||||
},
|
||||
"39": {
|
||||
"admin": "Central African Republic",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADs0lEQVR42u3dTUgUYRzH8YHIBfUQ2otGHTQhA6UCMygvRRYVeAgihKgIMUI6FL1TVIJJSgkhBZ0yKshL0SGRQFEoCiNRumRgdQmDQBIC7W2D+W/wyLPPMPsy+/Z8Lz9kdmaemWc/83+emV1cx8lbV9vaYVvuGqx41Nw7/npRec2m4FJasbOHHWABK9tgjVUfu/TnTOjcVP1k2alt/cfvAAtYScgVn7c8PVk2GnpyumR234vmtr0fgJVQLqhuuHLTblhuFwim8Le3407+rbnrbRumgEXFiuUaUq8k5W/BFA6P/XYcqVuLl9WFzr7MhGsRWOp0JeNgbZ1s7Dp0Y8fd/S0HStSUWvW+tG9N8YRULEmZb+nrS6ZyHgasjK5YAuVL52Be4ZzQmXo2VFTwScWkp75Oz0x3+9rvKYLlVkdgZcEcS+qTDHbepCLpDo7CS2jmh2r+XqhkKARWlJR6I7XHG5YQlGGUyXvQtTlH7gqFi16fIuku6Zi92rR5IL2nneOw9JuqZEH0v8/kqhc0xhmVy+vN4ccblx+M3CGmiRewsqxiCRoB9Lz4fvmqMrnj08FFhkL/J692VsJdlmWw/JyvPDhQM+thuScggKQ+CSP9qZX6GCLmATGpXZaDFUuHFdwzqhhg6W+V/9qgPGeP8tGNtp/1ww0TR7fPux+M74pUO87wkNZ03WcQrPguEn0r/7CCmHvp60cZYuJK45zJsH6ElFqB9JpkelXruHlAvVtMPSzvS9R01t5L9DT1j3eatk3kHZHc2dgy/rArXSkfVKe+3fMVu+sv/gwalrSS3h6OL6VMJLIHJ/wg3Bd+Z1tOD/UO9t0LGpa0YmcPAwtYwAIWsIAFLGABC1jAAhawgAUsYAELWMACFrCABSxgAQtYwAIWsIAFLGABC1g2wuouHPnYvdK27N1zre7EkqBhSSt29rBTWXW7Z/VX27Kp/0h7VX3QsKQVO3sYWMACFrCABSxgAQtYwAIWsIAFLGABC1jAAhawgAUsYAELWMACFrCABSxgAQtYwLIR1vDSgdmCNkn5P8fqEj2HRoZD+aN+1vFeM+j9mLaVJa8WXv5ROhM0LPk5BfVI9MzM/onveNR0/PzWTZQfBDAt0V/1sx/TVt5t+V+ivTr9q7O2qDXwrya7rRiP0Mdxxtw/yXqPYu1VLWNYNUcyE2BZkMACFrASw6QmsICV/bBsGxMYClNasSyrW8BiKAQWsIAFLGABC1jAAhawgAUsYAELWMlIYAGLigUsYAHrf/4D+/vF6KjUa1UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjMwOjM1LTA1OjAwcd88PgAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQ0FGLnN2Z8KCGZwAAAAASUVORK5CYII="
|
||||
},
|
||||
"41": {
|
||||
"admin": "Switzerland",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkEAIAAACvEN5AAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABlElEQVR42u3bsQ2CUBSGUcMQVizEGCQOxAjMwBZsQ03zNPkbOxtzMc9zi6+9EU/57q2122tUv1ufQMFSsBQsVbAULAVLFSwFS8FSBUvBUrBUwVKwFCxVsBSsX+q4j3tr0zZtVc1GsDrvvMxLa+f9vFc1G8HqvI/hMbTSyUawwAILLLDAAgsssMACCyywwAILLLDAAgsssMACCyywwAILLLDAAgsssMACCyywwAILLLDAAqvDN+9gdQUr9yr5a/O5K5u967EetbCyMdvrf3s2Vl8KFcPKOVRuV0zN5Gvny4NlwAILLLDAAsuABRZYYIEFlgELLLDAAgssAxZYYIEFFlgGLLDAAgsssAxYYIH1P0+T358FX/s0+aoH2Z0/TXZM4ZjC+RdYYIEFFlhggQUWWGCBBRZYYIEFFlhggQUWWGCBBRZYYIEFFlhggQUWWGCBBRZYYIEFFlhggQXWpzfvuV2paTaC1Xlzr5JzqJpWX8iApWCpgqVgKViqYClYCpYqWAqWgqUKloKlYKmCpWApWKpgaX2fUJVDxRBlOpcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjMxOjA1LTA1OjAwEJJQ4wAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQ0hFLnN2Z6ItMoQAAAAASUVORK5CYII="
|
||||
},
|
||||
"43": {
|
||||
"admin": "China",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADC0lEQVR42u2cv0ocURSHL674L/gvr2AVLaIi6CsoadIYfANJuqRQ2yVgZSk+gIXaaCWChVgmD5AqKAqCIEgIEhESWMHfFAduZh135u7MznzNx7DizO7cb88599w7687P3oyNjMIi8KL29tNwvRyfxTGcELEgYuXBy+O5H0P7DCpitVqLzE1uDi9bjW4OP04PvL9e/LDz6g+DilipItNdbeuk55349+LbQZe7XVj93P+aQS3CVMO1J7qEOLPiU2P37IsbbzQul5yTXr9nN/71TpAWSx6xlKRCDPOvta/rfbVIrCcqel19n98enAonNMxZLMn08PPorrYivbKNgjqnNJJS2V4FFlQsm6qUnkJLLMkY1JKLJZlU/Shu5ZWe0K4kYtkkaGugvNoBUup+Zq/efapjSyToGLH8+ZoYOiE2r8Y0ZxQlGTPHQoil77cGqTlVSttYZdsBSc4gNdOkTv2vOlu6br6KI1aitqQfjf7zin3d/tW+4lEJNNukqbNJL53fpkUkKFAqtMklVpckepnjcI1N+5XQMeV8oWssWxS/OEp5ybGda4uwA4p3DVvUXIiLW96xUhIxA7ESRa/m9ZPVSwsyDABiJVu5i0uFHpVAWdFDrGdSYdQO9cSKKrCYequdqVDXotLqGLE0YHaGaHdHSTtN+P1efDt3UOla7NkqkFjNt3RpqOyaYFwXyu5EsCV86E07mljYzrvdDUE6LmjEUrKze6GSx4/Qc8O4hojtafHgV4j349I3HqPvfUtvRQMfenHaLuyIzEnZ856ZWNJXKkf1X4keEEWs3J7qKeszx4gVvJVAHx+xMlhUtglO5XmINUdiW+UiVtTm8J7SSb+XC1ZaLMUnK5ZtzNJhR6xU+ynEEA+ZweqJ9VT38NsNiJVbWwEiFkQsCBELIhZELH5kDGYlFjcXErEgYkHEghCxIGJBxIIQseic5XZ+xKLRilgIhFiQGosbARELIhZELG4EpTdiQcSCiAUhYsFqikXxCx0zLEgqhB2zAwKxIBELIhZELG4EExfEgogFq8xH2u1W8NlacbkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjMxOjI1LTA1OjAwUrdXngAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQ0hOLnN2Z9X9A5UAAAAASUVORK5CYII="
|
||||
},
|
||||
"45": {
|
||||
"admin": "Cameroon",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAFQUlEQVR42u2dTUhUURTHZ6WbyIQaNb9txiIigjIigiKCFiER0SZrtNoFCRJFCG0KFxW1iBJdJCZSESR90M5N4EKC/IxIneyLJIwikgpslGDOCE/evDf3vnPvzPv4bw6PN/fd4N1f5/zPuec+Q6FQa2ss5nXb1r791M6VYxcKtkbXDw0VFtbWesY2FeyrrSc7/eJwvKpnYePYjXCe0Sbqhu6GG8XvW1nzeMuZx0aj4ajVtf2vdB0CWO4B6/2GIwerzsviYg+NNHwWoIgDRxZguQgvI1jiXkotiLJeymo8wHIdWJyQZz9SZB5ZgBAKPQCWlcaSBUVCS5lH2gY4ccgAlqs1lrMwx7f2MIl4NYDlUo1l5V34GaLVPKn7AhmfiJAHWK7WWM40E1/go9wQCz1trYxtNoLl3YAoW8figCICR7DFuwksf2gsVb7KCgtxpFBu8K3GylBzsr1OA4HVfYF8EJV3X9Wxspn98X0YPJZL9wqFypjiOSBDXXFGAizXaSz+NrN42RPiPaAaK4N+0rBFA/FuCZZ3/ZYqjQWPBY/lsI7F78RSfB97hf6oY8lqLLX+T6RsAbA8Vsfib1Gr6ke113MAKxgaS1soDFK5gYKLZzWWuE/KfpepeNaJrNADhynUts04g8++zQYF0sB1kKoCSHZrCGC5tPKezd5RTk89skKWHekuvhO9TFaxhmOcK9Qn6vkFWIAltPDvGuoT1UVk9YElfq5QY++obOhE5d2ZpTm/Xb2ytixlc3uuULyaxZ+BgxeywgyLPT4Y/Ro5/Wfb89biFrLj3dEVkYs6/JYbzhVKQwmPlSEYWVxT+Evkv3obbia7LCCardK2GT4iCipV9jkmwLJfVCs7u+rS57KehUevn6yZoFdGd0SeFUJN6blC/uaPs5EQ70vKKVqRiMxPfd4/Xd1LHijef6Cl+qjRUo5G4c/4QukO/Wp+iizNTP+K2nOF/M1m87Mc/wePlaZ88KnhZF/lib+z/QNFcWOwW2YTo2PhcBprWB6jpdlo5lR5Qtu5Qn1lBX5uGNRQaAhSk3m7P9Ts+dV/b7HkocT/+CReqfvJQEkz0Gyq9gr5nyvS8X0H83swW4j3pewvmeuRfvq392Vn+LEIZPMDg9fCcXqK8kd9e4Vuq8KnxgMsETt8f3VHdHLmzNmu8p8iL5RGKuiqEN6EdhtwAQKLhVdygWemzh0vH8nwipPhj0bq2IRW9pEPyfvSdSx4LPFsca7yQUdJm7HEQCGPrPEV00iJ7M+RxuLU2ZVpKXgsztKS9E4BlATrd9ez/OJeWnKydId+pZETm3btqOnkF0ideazcdjoALKGlNaqr73M3F0sb3hza0rTuunEM3aFfaSQ9pVtjudMCrAyLSuHsx63bw6VlX+qa2yuOpWmSMeBF42kkQcYKiIxQKKulZD80AvHuVLxTuaGo5mOkLxXUJLGgp2gGTkB0VsdSK/algYbHkt6Q1v2UojqWvuNcCIWB6HnPbR0LYHkeLIdaR5uWyjAeYHnx+BenC1T79xqgsfx0rhChEGB5so4l7bd8C5ZPP8etWzOhbSbQ4p2zl2e/8LotwPKMxlKrgQAWNBbAAlg6NZazPiqABbBYGktWXAOsgGosZUdSARY8lu46FsBCKGxU1dueurY/IwmwggyWvdcxAgSPBbCk61j2YEFj4Q9hOuzHEgcr++EPe4Ve3iu0XU54LIRCa43F10mGGQAWwFrusUx4pQltFsEOHgtgSdexrPxZrgACWD4JhW7L/gCWl/9eocugCShYXs8K3aOTAJa/wMpp/UmV/Q9UzC80rC9rUwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMi0wNDowMEDu28cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMTk6MzI6MzktMDU6MDCyioZ3AAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9DTVIuc3ZnICDopQAAACB0RVh0c3ZnOmRlc2NyaXB0aW9uAEZsYWcgb2YgQ2FtZXJvb26Jr9hlAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"46": {
|
||||
"admin": "Democratic Republic of the Congo",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"47": {
|
||||
"admin": "Republic of the Congo",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACrklEQVR42u3dv0tbYRTG8Qt1dCyCIBgkiKijtEgNhEaMOvUfEPwLSku3IrVbXRwUhWopLg4OLgpZBAlWEEUo0qEFKZrNoYg/IKW0JTi8S6D1F7nvveec97uc1SEfn/PkwL2Jos75xUKBme7sqC2NDfZsH3x+O7z+59fR4eiIxlltKo3ny6ezU1uPXkR8qBJIra3vPR7u0UvKTUfqqLv3YeY3sFKbLc8+rBa+WCL1/TDb2t7mJrBSTqm/ucrL0RVLpIBFSnkhBSxIxdClgKWelISleXNKAYuU8kgKWBwRYlt8wEoopVZGdl4XT5JHEO+6vG9KAYvF55EUsIyklITFByxSymNKAYuU8pJSwIKUR1LAgpQXUsAKiFT9GcI3KWCJIHXfy1Mjl6pkSAHLbEo5fMmnFLCCIOXm2fu54/5ckqSAZbaeO1LJpxSw+MYHrPBINVLP01p8wPoPqYXdT/niJEcEYMVGamai/LVY0E5KTkoFDYsu1ci8+9+KICUzh7R0qaBhsfiART1XnFJBwNKeUnpJmYVFSgELUgZJmYLF4gMWpG4hdTzd96rjh15S6mGRUsCiS107z6sfm59kLJFSDMtSPbex+BTD4hsfsEip4BafMliW6nk4pBTAghSw6FLXktJVz+P6B4hIKe0pJTMLI7oUKWUQliP1bn/zwVCNlAIWpEgpqbAgBSy6FKRkw9JOyj3UACkRsCx1qcuny98GTiElAhaLD1iQIqVkw4IUM6JLQUooLE6dTC+wbial5TePraaUyldFak8ph14yqeAeWPVHynfC1b9R2JGq1HJd2QuWV8qw9KbUv6ToUiJgsfiYMcOCFDNmWG9+bjwf2rRBii4lApalUyekRLzclnrOjC2x3PVc++IjpcTBskSKlBIBy0aXqjaVxvNlnpCRM68Am91UDENA4fcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjM4OjE4LTA1OjAwQfoadwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQ09HLnN2Z8XoUVwAAAAASUVORK5CYII="
|
||||
},
|
||||
"58": {
|
||||
"admin": "Czech Republic",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADnklEQVR42u2cS0hUURjHhxZZJpVUlho1NggtUrKCUCsYUiFqelGLaBXE3UiCLuyJpKRSoK3sBQpGrSx6LCxIJCGhRRBEohUKQZE0RdEDLStbnM2F68iM9zvX+/ht/sxi5g733h+/853vnHtDRkbznVutA/kjDaP9k2OTvyYnSNJ+hhZ2lp2o21WaZeS2lXcN9Ba/OPKx42v85w8uDWkLrMw15VvrqhVeubFY2bn0qlOtFffCOIwUAMuMl9VhXCbSFlhWyNRn5bCRrPdnP3dwyUhbYFkhw2GkMFjWpA4jtYClEoeRWsCyziWpw8gp2g32IcNhpICxknHY24bRdV9OcqEBSzhxGGBpSRwGWA7l9olji64tv7uk7/zL29wAwNLisOPdbWe683BYoDvvOvAyzyVxWKCNpQ8yHObz3Q3Jm0bfQKnqsIeXnxa92slNCpCx7ICV/G9xWIDAUjfb+WIfh/lko5/zs8VUHfbh5qfxb8+4hYClpR+GwzwAlvKBFFiJjiO14K1ydfbeLU3ZOIwGKQ5jz7tTA6KsI5XD6v+0Nz66z6NsGAuH0cfyToGPwzxmLDNezne27AygO8aqe9oP4jCGwoRAzwwsHOaZhylmd+ON/aPhME8ay9wbc3Nllle/f2Wz0XSps6R3Nw4Te9uMmwcv51M5rK/zeXSkCERmbSj0Ci7O12FOmi+Z/3LyOyF3ekj3slKqvz392njTeCM+fGFuSwaZTIakqig/GUudUTg/2lL7rmZ+wcZYzZOCFV2Rx4ODS+fkpJHJpM877zPLzbWl/ZW516/mRTf9BRHAsjVc4ictYE1fi0htdHFbP0xldEGxYZThJ2Gw/D2zS3Re+MlRsOyU4W5D03pe6jN+cl2N5UWrmed3Vb8L0/Ysxk8BKt71PUym/HQlEhkqqeBmMysUmN/hJ8AS7j/hJxcV77JlspMwKT9VLiv8t28efvKhsZwp7c3/Qn88QGBZ8ZICzuxC/ESNRf0EWG6d3+GnQICl+81YKvETxqqWrZ+Orlr/4EBLkP3kj3MPuaHbjp8wlvCOcuWnnsyc72vD3AzfgkX9RGrZ6Gd/Mdh6HOqnQINl/7FSK1jqmPiJoVD4jciq/0T9xFA4xUJyqm9+V366OJ4/vM3g4gKWwMog8zsyZbCmr5/wE5kCWIn2Kaj1u8OlG+KH0vETOUOwqJ9IYbDMDQj8RIq1G/ATKdYgVZ/xEyn2MAV+IoXBUo904idSNv8DQU9eyPkl1PwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDE5OjQxOjI3LTA1OjAw7BNTNAAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvQ1pFLnN2Z+wzkRQAAAAqdEVYdHN2ZzpkZXNjcmlwdGlvbgBGbGFnIG9mIHRoZSBDemVjaCBSZXB1YmxpY9YC5UcAAAAASUVORK5CYII="
|
||||
},
|
||||
"59": {
|
||||
"admin": "Germany",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8EAIAAABPzVTaAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAA60lEQVR42u3VMQ4BQRiG4f8Y4hqO5ULOoHcC/UYrIqJwAoVCMS5gWPyTjM3zFk9lN0w+uxGSJEmSJEmSJEmSJEmSJEmS9HvzNZlvbBdkvnFake897p9b+3z1gtcXj7lqvFn3//QO4w+u3e/97tp+zqdm8pFNzxbDmtL3qQ3RdNhER0DD8pI1LHpikYblRfMn5+OI/QHaD6v1j+z/ED3nPLFoWDQs0rBoWDQs0rDY67DOt9mBzDbul82VzDZK2S3JbKOUYSCzdQQ0LBoWDctB0LBoWDQs0rBoWDQs0rBoWDQs0rBoWDQs0rDYsQ+EqqV97vWrJgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMTk6NDE6NDEtMDU6MDBJrG+JAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9ERVUuc3Znu/SIVgAAAB90RVh0c3ZnOmRlc2NyaXB0aW9uAEZsYWcgb2YgR2VybWFuecjsIlEAAAAASUVORK5CYII="
|
||||
},
|
||||
"62": {
|
||||
"admin": "Denmark",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABMEAIAAABE71kbAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAByUlEQVR42u3bMUoDURQF0FGIomQRLkBRyAKs0ggJrkBEbIRgFV2DaCq1tAyptLOxE6xDUtrYiCJoGsFCFBnB32g7Zob55LzilpMQDnd+8ibJcFit1mpRZnOutZK+1E9ve/Nptpn+uP+8vPtaX2xth6tF/GmULBOwAqxBuzK1tAYEWBoLLLDAAgsLsMACy+EdLI0lwdJYYGkssCaxsd5nL5YPgAALLLDcCsFyeMcCLI0FFlhggSXBAgssh3ewNJYES2OBpbHAstKRYIEFllshWA7vEiyNBRZYYIElwcoKa6sxs3PtjAWWxooBVvj9Jsr86Zjnp+NRd3dcjVXMOw+Ii3zF4jN53Nzf6OzFmA+v7YXDk7fmzVF/Nf3HjAZn/fOrcLWQ8X4m5ckkNSaHAcuAZcAyYBkDlgHLgGUMWAYsM7mwrHR+r3SsYsa20rGE/rOEDg/PhCVxDu82lyuXcwntsRmPzXgeCyywPEEKlsbSWGD5JzRYGgsssJyxwNJYYGkssDSWxgILLLD83AAWWECA5VYIlm+FYGksLMDSWGBpLLDAkmCBBZYzFlgaS4IFFlhWOmCBJcFyKwTLt0KwNJYES2OBpbHAAktmy2/hVcWm46JcXgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMi0wNDowMEDu28cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjE6NDM6NTEtMDU6MDCnkUmcAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9ETksuc3ZnDuNRdgAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"64": {
|
||||
"admin": "Algeria",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"66": {
|
||||
"admin": "Egypt",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADJUlEQVR42u2aPUhVYRiAz5ItFhTRUARCYEVL0w2CApeGIlwKCqIlpCFBSppqCLKoiAoiQhTRyCT7gZKgGqIfbZASSQzCLIzsh4uSgQkut+G5wyunazdwO8/ycHi/Hzifj+/7ne+7ycDgstXVm6RcWCYugVQsqVhSsVwIqVhSsaRiSalYUrGkYkmpWFKxpGJJqVhSsaRiSalYUrGkYkmpWFKxZKbEmrx4e9eDF7IUx1e0VFw4AL+/7WhsOeOalMOkMFuYKeRlmrMnfp//sX+s9/W60zdHtj4/cvjU1w1D09caibs+86+bYv2DMy+nxj52/6r+1t83ESOuzPxUrLL+/xBr+uREYfi4YinWf6iDLukyR3xy9HPTk7UQvcqfQbEyRxSZSD4d6qlEiKgIrVGpn7vHq55diXpFmWA+NzJ4q8mslmmxUGpgcfee3KLR4b76Y70x3/CMQJRCmJaGCDMwGzMrVkZfnuyCCkO1PQd3NiAHcciXIHpBIrEPo5iB2YgrlmIVxXp39FHv3urBrnsfah6+yrVOrjxHa8xhRGilJ6MUS7GKJPekxeK5lFj9d25cWn+f1vQo+jOzYinWHLEgcRi35zEe+yuWYhXJqXopsYjAdCmMrWmxmFmxFOsvYpF16BO/Ftmq0/r+7tPauuWKpVhzGA8IoljcDHJexcFBPHRgY86ZVimxmFmxMvryCJQubcTjASkCwXhASiSOVSzFyqNFFIsIZY78RMbiSxASoTUWxCgWEcVSrGKOocDFK2fUiWLFI9N4Ih8LK8VRsTL68vz50Sve/cWbwagLYrExRyZ6MgpSRhXLc6zGeBUN01c6yASJpC92pgpf3jzuQi/PsfzZTJ7MhFI8owi6xJ1W3F3FnrGA8uyqKlaechZlirkKmdJ9ECjmrVgcXVXFmvMbUYhAMF0cY+GLz4z1h35FsTprOrd1bpbw+o72jc1bOra31V9d1b6mteFyXVtVc8XZfWnSChnl6kUmSWWyJFkq5QLTJZCKJRVLKpYLIRVLKpZULCkVSyqWVCwpFUsqllQsKRVLKpZULCkVSyqWVCwpFUsqlswS/wBhPLGpf7jDnwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjE6NDU6MDYtMDU6MDAnyAkxAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9FR1kuc3ZnlbvP6AAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"67": {
|
||||
"admin": "Eritrea",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"68": {
|
||||
"admin": "Spain",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"69": {
|
||||
"admin": "Estonia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABAEAIAAAAzLZlgAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAA50lEQVR42u3ZQQqCUBhF4X8braNRK8hJG3BV5cxRO3Ed1U6MkAZORFEM3gvB7xy4k0TxcQZFURS36vmyNu2GI7DCssKywnIQoz1318/j7RyEZYVlhWWtsKyw7A5+oAjLCssKywrLQVhhWWHZPf9BJCwrLCssKywHYTOE1X+1nPuCOfx0es300+Vrctz/1/vkfq9/vm+O5665fs1z43A/1peTtWk3AAAAAAAAAAAAAAAAAAAAAADYKmVDpje6lkyvsCgsCovCIoVFYVFYpLAoLAqLFBaFRWGRwqKwKCxSWBQWhUUKi1v1C8pommxuYBvBAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIyLTA0OjAwQO7bxwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMTo0NjozNS0wNTowMHOYr0wAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0VTVC5zdmf1bEvUAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"70": {
|
||||
"admin": "Ethiopia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"71": {
|
||||
"admin": "Finland",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA9EAIAAACEkYd/AAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABnklEQVR42u3cMUoDQRgG0G3EU4gKYmWj0cI1vUQECxsP4Als7EyKIAqCVoE0UYIHsEhpF7DwCBYWlvYiG4QV2cLGckdm2DfF1wYmj3+G5dvNyujX49zz6uvK/HAn73eybKvV69adrfVu+2p0P3y6LK2aVgYWWGCBBRZYYIEFVoNh7eZFfwkssAJNrB8EdcPaODx7AMtR2AULLBMLLJd3sMACCyywwALLAgsssMACCywLLLDAAgusqGF58g5WMhMLLLAchanA+sg/T2fjOLPYno2/7iYL07eXzdB9rPPJ7ft0UP1izHuSSmbt/eNidBFzrnWO9gbXYUj95vLiwclNGf9upJJZdcOIO0Nc2P+eWynsRioZ/A+TzUxbIMGSYEmwbIQES4IlwZISLAmWBEtKsCRYsqGw/qebEH+7QR+h1tTH0scK0sfSINUgDdIg1XmvUue9qS9T+AYpWKm9VwgWWCYWWCYWWCYWWGCBBRZYYIEFFlhggZUCLJ8xAgsssByFYIEFVtNhefIOlokFFlhggQUWWGCB5TkWWGCBFfv6BuluuD1YhrY6AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMTo0NzowMC0wNTowMEDt7DYAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0ZJTi5zdmdMmf+XAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"74": {
|
||||
"admin": "France",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABPklEQVR42u3cMRLBQBSA4Zc9CgqcALXC4bThBA5gNFyFM+wBVNFqjYTszpfi1Sm++bOv2ETEdNK2pc/T9ny977rCn+fx8rjtc7dMmybnxXy9KncGWGCBBRZYYIEFFlhggQUWWGCBBRZYYIE1/GzSLB0CLLAUCyywwAILLLDAAgsssGyFlcAqnJRiKRZYYIEFFlhggQUWWGDZCsFSLLDAAgsssP4DazQowVIssMACy1ZYG6wP30qxwFIssMACCyywwOr/HAYWWIplKwQLLLDAAgssZyywwAILLLDAqh6We4VgKZatECywFAsssMACCyywwAILLLBshWCBpVhggQUWWGCBBRZYYIFlKwQLLMUCCyywwAILLLBG+T8ZsMBSLFshWIoFFlhg/fp8BhZYigUWWGB9C+t9ggUWWGD5FA44XxBz7mcwZM9VAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMTo0ODozMS0wNTowMJkeu+wAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0ZSQS5zdmen2JoeAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"79": {
|
||||
"admin": "United Kingdom",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"80": {
|
||||
"admin": "Georgia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAC50lEQVR42u2dsa3CMBRFPQAD0FJRUbNCZmACSlpmQKJBrEBHS0+HmCETsAJFfnGFZP3gyE5iEsenuULBMfblxEls6z1TVVVZlXnrptgUVWVKU/ahqi13Vw0WABZgARZgARZgARZgARZgAZZT79f71a2ANQVXzdB/5Hw2n30+b+/bO2C11f1uvxuPq2ZoC2w9LA9LwGqrcq/eHrmdBVjn0/n0zYLL8/IErLYq9+rtkduTAutVvIoQC27v2zuknjzBkht1T+Sez+XqqiEBsNTo4lgcq2q9WC8+dut+7/oj7TL2ufocz4hUwJIDqj/UVd0Q7XPjuhoVLHWg+1+lehixpH25unqsHoC1YMTq21WBleStUE23X4BtrXfVVQawYria5IhlP6TroVLTdOqG6+Fdx1VG5XVu7LfFtG6FabhqxvRizHTDdFw1Y5rKG2bGZSpguWYHh5l2HgQsvR6PZY54iks6tma0pKNrSB2252AYsbqPWHVXMxqx2DbDthnAAizAAizAAizAAizAAizAGg9Y9f3R9nKBj/qXD63Z/yy7jKt8/biOaANJX2CpNp/2d+mXPrt65Doerz3/y5hvi5f2keZvx1DeVSa05njq0x7/fvnU6fNbcX028W1Fc1TAQgELBSwUsDACBSwUsFDAwggUsFDAQgELRSOCleK6Ybs1wd+sEnZpj79X7dYT+/r172WCdjeErpCHrqK7Vuab9yY0/6JPbWPY3dCuTPN+hL78abMDgv1Y7Mdiox9gARZgARZgARZgARZgARZgEbuB2A1EmwEsos0QH4v4WET0Sx0s/zjvCYNlR8UkBmmMy1Lq46pGMperSYbjJmpy7HDc2UVNJoHA+BMIxL1cSSCQbQKBhMHqkkvnd1lfUgMrDVd/kP3LP09VPfvXL/JUkf2LfIWA1WISZ4L5CkMnSMmwOh1XB1/SISd0bFeHaQ9Z7Euy2LNtBrDYNgNYgAVYgAVYgAVYgAVYgAVY/eoffW/ASfIPUTIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIxOjUwOjI5LTA1OjAwtAJqIQAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvR0VPLnN2Z6BMHegAAAAASUVORK5CYII="
|
||||
},
|
||||
"86": {
|
||||
"admin": "Equatorial Guinea",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"87": {
|
||||
"admin": "Greece",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADDklEQVR42u2dP0gcQRSHp0sjCMbC1sJOSJ10llYBKxGxESxFMGWaWAhKCGohEiS1IiGIkAMLAwZMCAEFMUElJCioKGoEJWBzFq+5sNzydndm72bmaz6WcXz3buZ3b3fe/FnTsjnU/WHeLnuvJn9/3r6eu2u7n6luVn9UL9Ip9V14AhtF405YGkmJ+BAWwrIcsaRO39Lr91urdAbCsnwrdC2sjrORnrW3dHZ0EYtbIcJCWNC2sPQ3FEaFMNiIJT+D6Terv/a7595Vnh3+TDL9r+UzJH9MqHmsrkejfZXF3dmjsZvnGh+gXQabxxJhnfZfL/zbp5uDElZj81hErKiF5S6PRcQKUFhPP75s3xgnYiGsYB/eiVgNE5ZEF7sc/rbw+Pug3gmpn++znpgXt+tnyXIR66fZvc7zNYlbSe6s/Jn4O6Av94VZ/c/aDhr7RuJKLeVXnizPSr2w0u3k80e+nohMclq1lHhWpDzUElvlJtRQLHKUeEYevAGZ97CFJb8kuhlhEbEQFsKCCIvORljlCSu2laVZv2+R9jGSQxJKBry2JElNHVluoU86SH29fT2XT7Yqx1OwfAa+HovMe4BzhfrUqIu5QoTFXOEFk9AIy5tbIZPQCGuGpckIizXvMO417/LwLkNfWTzztfXgy+Wr5HURhmqnyGdJeURnN9Qu6qiXAEwuCNH8b0h29OXpPkRxdgOM7hgjv3ZCN9sUUDNPSXF2A0RYHGMUubDkmYlDQaIWVr0xQvooI30EUeThPZ8/mlFSkZGU3fKs177489+o0EXmQ7YH6R/epX6+TIwL/5M203M2Gjt6m375U8+OIUcMnWTeaQKIsCDCggiLhoAIC3oiLPaTQIe7dFzvOCtzR5sta0V8sOV/mZNRdvvIMPkAvZkrhBBhQYQFERZk2YzNcyxdnGmpsZ/1jM0iZ3Km+0P7yLXx92xg2Mwk8w6Z0oEICyIsGgIiLIiwYNTCKvONxWLB1puP8aecN0zns0PmHTKlAxEWRFg0BAxaWL6cCdP8frr2UGOfiAW5FRJd/OEDrkySTY3bfGcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIxOjUyOjQ1LTA1OjAwsTjZ7wAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvR1JDLnN2Z3tvwsoAAAAASUVORK5CYII="
|
||||
},
|
||||
"96": {
|
||||
"admin": "Croatia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"98": {
|
||||
"admin": "Hungary",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAAwUlEQVR42u3WsQnCUBiF0ZeXlCIEG8FWgp1YiyOksBSXcgoXcAAHEFLoCg4hKDyH8C8CnjPC5StuNQxt23UJQmUTICyEhbBAWAgLYYGwEBbCAmEhLIQFwmLUmrJ83z8bQxAc1qw/PPcTQxCrKreSy9wQ+FgIC2GBsBAWwgJhISyEBcJCWAgLhIWwEBb8qDm+LtvTyhAEh3XePdbX2hAEh5VSXtRTQ+BjISyEBcJCWAgLhIWwEBYIC2EhLBAWwuKffAHRWBI+T4tO4QAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMi0wNDowMEDu28cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6MDA6MDYtMDU6MDDM8t05AAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9IVU4uc3ZnaLJGKgAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"99": {
|
||||
"admin": "Indonesia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAAtklEQVR42u3WsQmAMBRF0URcIKULZBcrV7F3H8cJOIq1ioIjyK/knBEet3i5tVJqTRCqMwHCQlgIC4SFsBAWCAthISwQFsJCWCAshIWwQFgIC2GBsBAWwgJhISyEBcJCWAgLhIWwEBZ806fpXK/dEASHNYzLNh+GIFa+X4bAx0JYCAuEhbAQFggLYSEsEBbCQlggLISFsEBYCAthgbAQFsICYSEshAXCQlgIC4SFsBAWCAth8V8P7lwPhQb9oxAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjAtMDQ6MDDXccruAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjAwOjE4LTA1OjAwUGem+gAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvSUROLnN2ZwZPnKAAAAAASUVORK5CYII="
|
||||
},
|
||||
"101": {
|
||||
"admin": "India",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACvUlEQVR42u2aMUgcQRRAN5WlYKNI0E6xvjSKYMBesLZKQNDy2oCCKUJAUl0ToyjBQjAgwkWOCLFIIylS5CAYOIJVRI4UKVIcKXIRXvNlPDBkwWKewiv+zs7i+Pj7588W3e7GdmVaynJZuARSsaRiScVyIaRiScWSiiWlYknFkoolpWJJxZKKJaViScWSiiWlYknFkoolpWJJxZKZidU6bDySslwW3ebVb1vKcqlYPXk2eTb5o7M/tz/39V6tWWt+egqJcNVVUqxb8ah11Pq2OD86P3rweKw+Vn/1BE6tTq3uvoUxzkjucvUU6xovji+Ofz1YmVmZ+fAbXRYaC436OJnpvP+8/+dOSq4ykruqg9XB9w+ZzVVVrDZCIMfm5ebl53HkgFGmGIljuCvq5apmLRZCDHWGOrU/vM6iLlRRp8Onw9+rKbkaxzMDszGzYmX3Z5N1KluVrZ2T9bX1tY9LMRuhDqKgSCzeiXCVkTGHMRszE1es7HIVL6+Ye6JSKMKrbXlieeLdS0gEyVK9mC2+WBUrI1J0x3I75iqEiDL1InqleYurPEWxMiKNA3aCadeKeJSDyglGsRgZ94/MRpynKFZGzQVqoCgEWScVa3ZkdmRvurj6ebYBiaRixbxFzuMpeTYgMs1Y/MvRIu4BU7HgbTJW7MWbsayxbqixqJzSst0aS7H+eVeYNhqQJpUJ4dgzMjLO4K7QPta1PlaMx3orPYRO+1ixTWofy857G1GonBAovhb/p/POzHbesz7VisfP8awwtiHiiWEs0omgkWeFitVTL/JN/LohzUy9vm6Ie0zXU7H8Hkux7u4LUkpy6BekiiXvTqw3r7/s7jWkLJfFwP3nL/oGpCyXiiUVSyqWVCwXQiqWVCypWC6EVCypWFKxpFQsqVhSsaRULKlYUrGkVCypWFKxpFQsqVgyK/4Fclp79PqRQrsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjAxOjEyLTA1OjAwG9WSigAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvSU5ELnN2Z+1kp2cAAAAASUVORK5CYII="
|
||||
},
|
||||
"105": {
|
||||
"admin": "Iran",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA5EAIAAAAfAMVpAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAEaUlEQVR42u1aTUgVURi9q4SIFiVE7lJ3b9nb1CKEDASXFm4Cg3KjRcsMBCFCKDJEKAohy0Ug9MrAjbtW5SIoKgJdJAVZqYhBaURii+PiyOFO896MP+TZHC/f/c79vvnumW/umzHU1Q0NNTQYjflicAmMFpbRwjJaWC6E0cIyWlhGC8totLCMFpbRwjIaLSyjhWW0sCrDQ+He6LH2jU4UUTYnljEHYfGGbQSqLLYbKzs3y5ppbqRkf7Un51DZCmlyY/9wfLr05fSj5vNPD589qojZI7dHOlueMSazmi49+XZmRFnAGAu401jJlcyXlZxnbK8rY4Vrsy+77l4ZOPh69/0hjPtHX10YOsdjtgC7l5+/uXnizsLbXQ+vsz07S8dgcYYxlsZKw4rFivloxXpuvVjqvwGfWERdB6zk+m8tC9VQVpp6BvzhgnJZeTxyYGr/WD/LIsZiH7AefH2/+Pgks1h84ILFsZSlRSk3FvyZBX9mKSazsDJvHrM4urLSx8LVJbN4F5ilt0EsQ1iUxZVkFsflqwu8SZwKwsPCwVSIzOKexCyM+Q6AhbeTU1SWxtJt4AtD/ixZZqmd8+eScYacA3OVpRujNVFZ6K2bzOJaYRzbNe0ufBMi/xiLK5mGhXFYHVu9vNpmBP75NVc/V+86ZEcLy2hhbQX+LI1XjVcpujIWVqYHImQ0M9sy3DIMZGHB0w9QCyuKvzsn+yb7Fi72rvSuQDqwQDSfm5u6m7qBsGAWnot7BqoHqmFxJS2sdZJCN/qxtzRVmoJQuBt93FcoFAqfrhbni/NshydYkJ3lZWGt4WxDR2tHKxAdaP5U10zXDD/sICnIix98zOJ1XNXgXjU9XbtUu4SuA0mhD7GndizY4QkW5AVP960dLazlmYniRBHCwhgPRBYWd6yYsMBimWI1C2tHv0rgHgOJ8KMQyMJiOzz5dIXV/ErCHasIuUAWOCGxgJI7FixgsbDcsYLfV/HbKZy0PvTU1NTUcNfRjoVZeIIFxGo+vPtXYRv/EuS3VtzJMOZHHlvA4iO8q2phrZMXRIMHGR5qkA7GaoEnvyx1JS2sf3zMYXlNvQshBKCeovxJx8Iq41D/vX2wcbARB3PuWLBg1od0CyuH7uUuZWEZt6uwku/I2Oz/zdqcTDYz1satGfCPIjgx4AMFxvjxjDF8gLDzLCN/a8uLhTMN56ZZKfJJKF+W5skZcp5pYul18fqxWLxr2Vmx+sdYaXYtMBlj3k4WBNuzs3RWWTyrUkv2z8JKn1vMp1xWuZWsjKW7pitk3+s1YWmYGKrGYyxWcbks7WoxeVXG4r6SF0trqHdzMou3RHuAdkGVl8ZSll6dxuJdq4yF2YCPEkD+UY2v9Dzm/0lilnoyJrMwy/6YjbH431c4ruafHEuvkS3JGTILs7FYWpP0LK0tZ5Jm12Ks2FXrrqWPpfkHfvVnNOaFLoHRwjJaWEYLy2i0sIwWltHCMhotLKOFZbSwjEYLy2hhGS0so9HCMm5v/Avargl1nz+mlQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6MDQ6MDctMDU6MDBjbnb3AAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9JUk4uc3Zn08B9JgAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"106": {
|
||||
"admin": "Iraq",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADjUlEQVR42u2aTUhUURiGB2pXC1tEi9oUVJvIRa1yE2gtK11EEGlRUG2KQFAoqIVBZQsJijYhSSVhiopkfxBJZVT+hGGQRdiPUFFGP9BuWjybA5eZZvTOOKMPL7xczhzvOXO/x+8758xNDA4vWrqqVNfj9YSPQBcsXbB0wfJB6IKlC5YuWLouWLpg6YKl64KlC5YuWLouWLpg6YKl64KlC5YuWLouWLpg6XMKrO9NbZXdT3U9Xk8kXyV/JCd0PV6fc2B9Pf+37FdF/kfM/7iCldcA1999XtvW8L7999i3nvyMy1iXTr0+3XcmfR/BKko/MTnU2tm/ZEfr+kO1/VVfDr9pzefoI12TKz/uBe6hhd9qxo9y3dk8fmtw177Rh3+aKwSryByMQIqMlc/CNNb1c+3n6mu9b5NPyoG7sWXkZu9u2jcM9DxruIPPpnI5y8GixBC2LfPulTRdySR4YUaJC6xoluJ6+9b71RdWMEN65j+bClbWTn5a/aL9XP0HQpv5XxHyeLPIuRujVXc7mA8Y7ax8sPjiBGDdOfjp2MtGPgU+wSo4JzCUP8KZajkfzRCAteBky6P9a+PKH2F+WlZ2fduRd4AVZizAYlzmIFgFWv4IW6ryRHGMrr24JvzT2a9xN1ZU5Euuo2BtrrtdfrYkBIs1mWAVkB9Y87j08qaw3ET7gBQBZkdGODkUCAvodEohmZI7A00UrGgppH/H8PjygRrBKggnGGSg9P/xYT4jwGHRjAss5jA1sMxYM+bhHoqCtW5VV/fxq2FpI5Chs+EntFGw6BOWwmzBoj+IhGu1ECzGEqwCwihcRYFFiAIhSeXzNzbX7ekLrymC6TNWtmus8BgWZyzBKtD9Hctb8gElj4CFh41kr8wdaFJlrGgpTJ+9+JSsCS6s2NKXwuiuMFrKi/EHn0SxnEWBEXgRDFoICblnas7dCH+YsWjhUzz92RLhBxqgZG7hPGkPvwsYRXeFAEp7MR49JIrrBxkeOsHLhZNjwrwSgpL+iBWwQIH+mTsZjm8aIogzH8HKCVhh4AlhLjx8xSXaku1LMtl6qju4xooZJgoTOYDSQLApDcV+Nu37WDP27lS4lAY12kEtXM4bSMGK7Ueb2fdynGDp+v/AulqhVPxKJBYqlQP5CJRgKcFSgqWUYCnBUoKllGApwVKCpZRgKcFSgqWUYCnBUoKllGApwVKCpZRgKcFSc0n/ACD6ZYnG6V1CAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjowNDoyMS0wNTowMEKbRLAAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0lSUS5zdmcxcH11AAAAAElFTkSuQmCC"
|
||||
},
|
||||
"108": {
|
||||
"admin": "Israel",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABJEAIAAAAUIsioAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAEA0lEQVR42u2dO2hUQRSGV0FsrHzESmxVsLEQCwMxooUGUqYJiZ2FWohBFBFEooiFNhoQArFIoxiRBMXCQESIkSWghhQWiRKNGHyFiFqkWIu/OTDMde5jH3fv13wsc2fnzj37M/fMmTOzpcpK5XdlFcJsWcIEEGFBhAURFoaACAvmRFhT32fXLd/z8eWxmenl1ug6cWva+j6Gt5Nt/9369Cduf1RS2jDVvvPZoXqxdGffxadv7GdxU9vhD+M/3ZpueTX647L2/VHLjdOf2PbxVYUwFTEBRFgQYUGEhSEgwoIICyIsCBEWzL+wQqKu0Vd9daIj7+F1wluI28NkDOlnmueNWyeZfdLbs/TwysSppaPik7HJ8tcB3+fi0H3qEDsU01Y+kt0ASZupH3+sX1m7ukbEGggrM/Z3D52ZuyliDYSVAWda57b+urrtbefuiSVRJVgGYaXi8bZrl2Z77XxHJVgGYSWkZje+qbuuYiWEFdtVP9Jz+uN0hy/+pKu48wgrBgdaRjoX+u0odXb81u13I6Itv/vt8fDiOSyGsP7D+YHFlT9jezb2DE2ekHR2POo6/2Je5Qubv9z/+8Be1WeVY71CCEs7RjT2hLOr5cLo61d2TDrYe7Kv3G3rqMTW6SlfbpnZEvde6iHCyqWwove61IvqlbZJIaxc0vWK7E9rGVIn2bfcOuoVr8Lc+0zyk/Sjbr/R+fn5LgULFOq83ju89/1++8PrhairosY/WyK6r061pqu6i5WX9dgQVhPO8rQ444YV4r6k3BeuPDC1rLvY+6onOO9NFZeyTrfGLcXQbXQq2WqgKyC97HQXV3AIqxCR9PQvKTdI4XpdytYi3NC045a79icO9o22fzqQpn214LasYARxrCanRo6sxqroiYJYtLGqoMLS+OGOK+ndaneKYEesoq0qFkhYWtfz+VjykNL4WO5YVeRxq9CzQjd8mix06WuHWSFxrA4ruPBVPNVUZqlNp/GFIYhjNW3kXZP/8Mi7jbm7ByiGRN7tuKWeFCG5mbXCKq4V+vw51grJbiC7AWFlkY/lBiNsPpZCoG4+loKu5GORQeqlmyMqr0jlovXYyCBFWLEjXuS8I6yq79JxfTV26SAs9hUirDxkQ7ATGmFlfHaDQp2c3YCwMqPi6SLWQFicj4WwYJMJqxHO+bTnoNbmJE8tp/juVcueNKZ9MjiDNP1ZudHn+IaffJzmROT6npqcR/uEn6ycsCecSA75AwGIsCDCwhAQYUGEBREWhAgLIixYWNpoqc2TtCeb23I3l9JudXKZpk5If3xt+uqE9KeW7aR5lkZ+3pJWzaJpt2iGlIQzzXerwaz602jPVfvnJbsBkjYDERZEWBgCIiyIsGCR+Q/Uod3rvtSw9wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMi0wNDowMEDu28cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6MDQ6NDUtMDU6MDBwu2kkAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9JU1Iuc3ZnvYzUAAAAAB50RVh0c3ZnOmRlc2NyaXB0aW9uAEZsYWcgb2YgSXNyYWVsYsv/cwAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"109": {
|
||||
"admin": "Italy",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABPklEQVR42u3csQ1BQRjA8XeGEAuwAdEqsINBUCqJRGEBlREUJpAQFiASnWiMcGqd4j1x3u+3gfjnu/suImTZctnrZolbt/ur8XWwa5w6l3Q/xXOxmW6Pt+F4PunGQ6zFerqfpZJ6UqEaRmGfISyEBWUNKz7iLLZ8kcJCWC7vmFh/I/WHBmH96gxuhns4CwtshQgLYdkKMbEQFsICWyHCQli2QkwshIWwwFaIsPjeMpTTj3ZshbyfADn9zNDEwlGIsBCWrZD8r/8mFoVc/22FOAoRFsICYSEshJXycusdS1gIKxnesYTFZ4e7/8eikBns/7HAVoiwEJatEBMLYSEssBXyfkMt7M3MxCq14l75bYU4ChEWwgJh2QqFhbBshQgLYSEsEJatUFiUOqx0dytb4U+H5UDBUYiwXN6FBTl6AXMqeeREiAuGAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIyLTA0OjAwQO7bxwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjowNDo1Ni0wNTowMI35cycAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0lUQS5zdmeHyQnqAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"113": {
|
||||
"admin": "Japan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADEUlEQVR42u2cT4hNURzHr0dRysbGYnZSatTYWMgoC1KMlYSkqMlm7CykbCg1WVCmrExKUyjzyCuUUViYjDAZShopmklpYprXyGCexXf5es/7c8+553fuZ/NZzLx3zz33fTrnd37n3F9S+VMpV+YhTJcJjwAiFkQsiFg8CIhYELEgYkGIWBCxIGJBiFgQsSBi5Zm/188M/Rifq7w59KH36+j10v3Nn1ddWHFt3eTKkx0Xt79f6LtyriTqL/qvPqlv6Qo8ScSan50c65y4+bH39O6B8y+Xbl080v1kePVA961H75bNbhwcGU4KGxbrU5/Ut8YebCoeLEg7XRmxctThmYWHx0f7Jzr3jZw4KyEaEahZ6spqRS0iVoT8eerTpakeTWTuZKovmVrXnSBWJOPT846uo3vLPmWqRd1JHsawaMWamhtcXtz/9O2arm07G//hG4+u2h/DdIeIZUwp/1MeekUrlhb/4StVrZfuHLECTRw8W7L29a4trf3AfibBWtSdKx+GWAElNrWwtzJK1aJ6EUei1bxY0zeunrlzOdvxJi2qF3FEXYbF+rVnuv9bQflunz+861bUI/UOsTJb/cUxVlXT+rhlWKxXf3fcPnYg/BGoNY4Xe+72lRArgzVgummF0CRT7+yuExO7k2B8019ME6JJsbShmwex1FPEMhNdWaF6ilie0qHuTis0Emn5jMbUU4sp08Ri7qrZMwt2qa0ei6e4jImlR9zOniBiIZYnsZqd2up/Pt3JFLHMx1jtR04uYi9iLFaFDleFiJWLPJbPVSF5rEgy79lu7FS3TubdK7WDFuYR5LSCd/YKibScjIicbuA8FudI4xJLayXVXIhJLPWIE6S5G7fctaUr6xQ/Z95z9JaOa315SyfQdaKtPURpKvJeIW9C8yY0tRuo3YBYjl5kDVMv3VUcQTr1scohBO/Ux6KiHxX9EKsZfj/8+N6LLz5rkKpFapDmtGqydh5bqwCob+kKVE1GrP/Uedd6jTrviAURCyIWhIgFEQsiFoSIBRELIhaEiAURCyIWhIgFM+Y/dWVqkJkga9gAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjA4OjA2LTA1OjAw3yWdzQAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvSlBOLnN2Z6/gxrAAAAAASUVORK5CYII="
|
||||
},
|
||||
"115": {
|
||||
"admin": "Kazakhstan",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"116": {
|
||||
"admin": "Kenya",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"117": {
|
||||
"admin": "Kyrgyzstan",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"118": {
|
||||
"admin": "Cambodia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"121": {
|
||||
"admin": "South Korea",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"123": {
|
||||
"admin": "Kuwait",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACmUlEQVR42u2aTWgTQRiGP6ONmDShS0Vy2tSi8QdbWj2oSKpIQRBF/EOIIIgW61GkP1gFqSB4EC+KB1EET+3FS45eVKpCaqAg9CREizdBEE+irpbpIWXdddXZ3Vl93sBz2GxmZicPb5Z2RWR9ZeUmkdMnN/eKXMz1pUUujJXLEP4dF9J+dkVVZP9I6ZHI8Ocdl9gaqEUslWV9qaJI15FVkyJnprbM0WFQi1jNocNgKGLRYTBEsegwGLpYdBgMUSz/DkMyqEEsOgyGKBYdBkMXy6vD2GjECr3D2HTECrHD+IlELO7DYBLE+rMOG123fXbxOerI//aFqR0Icu3R7I/XeoyIu8PUQt1U7/qfkxTqugr3OPHuj5rdoMx3WOb91oHVGw7M3useWXp8dPLOlYyblacTM+N7o2Fc8yaFXvsjpsWetmt2rbG7UW2MOR759sE55/REQ/e80a/BTDq+MVSsN73zL4ckNohFEIsgFmIhFmIRxCKIhViIhVgEsQhiIRZiIRZBLIJYiIVYiEX+dbHcj814Parh/yDHondrTsop/GQP1PFmeowT5JxfzOWe0T/mjBN8LtPEWr5Rbi85dPSLZRemXhUqjwfLjZ0Dz8+fgkmkEUp1PEtV09nxPZknhcyLE23ZNVfrb3NDnZ9efmyd6zwWhF7n/+44JjCJa25euWLM/bTvWvpg3p64nPta7J/JWrtKN+p1yyqVPKmW7n8k+GcNHmfhqwowjv+ZEY3juhYj+imQUjBRjKGfHm7LD3ccRibE0tdP79purs2jFGJp7ieUQiz6CcYtVvrWDzzg/glqE4t+gtrEop+gZrHoJ6hNLP7+BDWLRT9BbWJx/wQ1i1WcTt1vec3/76A2sfqtlrut11U/sR1QF78DzKEz7C4xic0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjEzOjA0LTA1OjAwcdSo0wAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvS1dULnN2Zz7Ccp8AAAAASUVORK5CYII="
|
||||
},
|
||||
"124": {
|
||||
"admin": "Laos",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAC50lEQVR42u2dT0gUURyAJ6JTLKWEHgQxMN1DHbZDoDdFjS6Bl0BkodgOBaJIdCgRT4pFoODFg4aUFGkEHroUBRJRsGGS4EHUy55CaCPKk7AefpcV3W3GeTvz/nyXD1ln3p/ffPvem3lv3norK1VVTU0QqqVHCCBiQcSCiEUgIGJBxIKIBSFiQcSCiAUhYkHEUsQfl84uXajmgpkSH8PEQi9T4mOkWEimf3y8UgWCMAy9qWe1r1vqIFRLz+tN1t655oenE6mT/XPhjwl6pNpzo2T4cqqqaQzp6H95oJEkBH6+ozUXW9P3U/K3Ke0lYmkk0JXfN0bG/w2kxxIL6ZeLbx9kXyyns6mNn9+b17/lEkL5RP6beTP06fl5OYsYItYBdiRvvZrMiig7W/lTf88VvhRWC9v+KWdJCpIaUXVULOnaJk7Mff3QkN/4k9kdDCpTKUpqkrLkglhOsD7Xtviw+93M50frv1TJVEovyaVxs+vx8EfEQinFlBwld8SycGAuY6AolSqm5O7QHaULlZR7N7VjqeN1jlISxLKk+5PHBHEpVUwpiemDel/trgttlQ5KFdOJdsvu6sU7rio/3kIsgzvB7cu5/p28bmJJqSx/DGFrxWSaJd4Be/mBvOUTQbZWrHu+b296WTeliiklRCzEUsyeznt3Z7sQC7FosRCLMZbRz7F0nqDQ/67Q8tlD5geZN0Qsnrwjlk4L+pgrtEosfZp6HVY3ONRWsR6L+UHEUtYtxrWC1Ln1766txZap32j0cnRRcnmx7L4ZlvbjyZmn19/frsRbOpIyb+k4/QZc++jNqxNrqt4rlNSIKmIdMRHEm9CIFdEd5eEdHIgMYsE4qHbXKxh99DRNn73nYEV29GO3TFiRPUh127U36LlB8w1zPPHxXx7EQqz/pH+8cnq6bWYf5gIEzTGundDVxkfP+lollgu/ImFKZPiRJohYELEgYhEIiFgQsSBiEQiIWBCxIGJBiFhQe+4DtSrzYBJ8V2EAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjEzOjE3LTA1OjAwjJay0AAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTEFPLnN2ZznaCwQAAAAASUVORK5CYII="
|
||||
},
|
||||
"127": {
|
||||
"admin": "Libya",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyAQMAAACQ++z9AAAAA1BMVEUAlTCNlXMpAAAACXBIWXMAAABIAAAASABGyWs+AAAADklEQVQYGWMYBaNgiAIAArwAAa44Of4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjEzOjU1LTA1OjAwn0OtAwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTEJZLnN2Z1DuG4gAAAAASUVORK5CYII="
|
||||
},
|
||||
"130": {
|
||||
"admin": "Sri Lanka",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"132": {
|
||||
"admin": "Lithuania",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8EAIAAABPzVTaAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABj0lEQVR42u3asUpCURzA4fMMOdTUmEsiPUBBcKfmIGhsy7Ggttaeo6XBqUbbpLV36BWilhaxwQpFT4b3nNtNv+VD5HLuuX9/XkUMg0Gv12iQaQ1GQGFRWBSWQVBYFBaFRQqLwqKwSGFRWBQWKSwKi8JaYofvD0dr9/mON59SYY2Wyzf0fOunHVyqfdZnnYrCim10/HkyZni+uNvZGJBpDZvX5697x2RaQwinT8XtLDsvxdm3naL4ehw7nhx3IpfpxzMcRZbUiaArXOc3x5ffVdrrLbOfHPOJORHNnKSyhVVnc4S1TPuJhRi/V61YQExr/KPQgFgqrOlPU3cspgprxjctA2KCsEhhUVgUFiksCovCIoXF2jn2a6hxzBuT/Sy0nyy15n43eCH/Q1g//0mGXMT1g5PD/SsyraF72d5tv5FpDY/F1s32kEzrZ1j9frPZauUw9/rT56ryjH97vXWYT2y1pQqrPi+e6w2rMwJWqbAoLAqLwjIICovCorAMgsKisCgsUlgUFoVFCovC4gr6AfbDZvCvuz1hAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIzLTA0OjAw5pnQcwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjoxNTozMC0wNTowMAYK+2QAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0xUVS5zdmdAkRcPAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"134": {
|
||||
"admin": "Latvia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAAwElEQVR42u3asQ3CMBCG0RuCEagjiwZlgoiShr0YAA8QZaTUUQZIi2CJOwmJ9xdvAOurbEfvrY0jmWs4AgqLwqKwHASFRWFRWKSwKCwKixQWhUVhkcKisCgsUlj84bBe6/C8LmSuMT9ul/uZzDWOaXvvJzLX+JgVTFgmLBOWCctMWCYsE5ZZdliu8lhyQerxgSVPOp5LWfII7YMH/ceisCgsB0FhUVgUFiksCovCIoVFYVFYpLAoLAqLFBaFxT/zC7rlujN+sttfAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjoxNTo1NS0wNTowMJJd3UQAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL0xWQS5zdmeYOYdGAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"145": {
|
||||
"admin": "Mali",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABNklEQVR42u3cMQ4BQRSAYWNFoxNH0LqAI2hUKoXCBcQFRKJWqjQKRyDuoVWpdAqFhqxTTNbj+04g8SfzdmYyqdM5HPr9WnCbbbt3242Grdlj836Xi7SP9fvTuTEvj/fLad58XrurSWsa/R+p10BYCKsyRZGW5TjWIiisAGLNWGXvtU4DYYGwEBbCMrxjeEdYCAuEhbAQFvxZWLYbhJWF7QZhISwQViDuYxnes3Afy/COpRBhISwQFsJCWAE4KxRWFrYbhIWwQFjh/N7BjrC+wu8dRQsLYSGsCnkfS1hZeB9LWFgKQVgI69+Hd2EZ3rEUIiyEBcJCWAgrANsNwsrCdoOwEBYIKxD3sQzvWbiPZXjHUoiwEBYIC2EhrACcFQorC9sNwkJY5OQZIxBWHN7H8lWIr0Kq8wHqzHuU9PMQqgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6MjA6MjQtMDU6MDBBJHKsAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9NTEkuc3ZnrHPmzgAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"146": {
|
||||
"admin": "Malta",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADJ0lEQVR42u3cT0jTYRzH8Z2Egi7hpVPUJUgCT/2jS9GtkxBYnSwpuhUYUhhB6SWXIf1QttFGhdNlSbXS4TQKKpPN5YpCC6NaMiISB5KRRQv22eGJ8RsM09r2vnz4sY3nMF77fr/P89vmSP9Kz6RTZP5cOPLxQzL4ylV9dPfgeKxyZdV6Mn86QAOs/wjW7PNgcmhfMubf3/c1ORA4cPtcNjOPLLx4+yOxAVjAKuQt9s+OpL69fmm5L28beRPeG06YOXbd0+I7MRd63Bj5VFKwMh8VYC05rMm0Z93Vn9Gt0TPRPcqxXfGp+I7o2kDljbMlCIuKBSxgFTGs96PeCX8TsMi/Buvzl9Ge6LvxWqfH2mIHS+xEEFjA+qMmmSx0LVK9cct1cToYDrj9DRrYB1eF6ge2m9fe3s7YpRohs1sNWGUES4cI2vGp6miW0rWqlEgJ0M2qnkiXT4z6a4IVtybNx+93d+zs9JqrmWsm1lgrvA3Fgoxd4aJg6SxKtcdsc2bqWdHpqGs933yw5cnJY8c3u0+1n249LFhCZreCUuBUCahYZQorOz9lrk063Ztc96yn7XXNQ021QiZweo3SDpZOvIBVHrAy5+bZo04DUy4ss+WJlFJt0Y6U1lGqIQKrjGBp6I5c6Zu/U5Gb5pCuuiVMZsUyX2O3jiY2YJUFrO/WxMzUcCoZqn9QnXo2vPHRITPVvNT+cutW7vD+8K7T0daoDUHuajrrKprhHVhLd44lBLHVXt+1ee34zOaoKqVq1D93ocvZpuMJ7hUCq+Cb0LmTk9qoah4n78DiXiGwuFdIK6RiAQtYhcHSDRntEzXOK3WIQCskHYt5o3U8YaY+2aX0vYblh1UafPkxBRULWMACFrCABR12hcCiYgELWMCCDrCABSxgMbwDiwQWsGiFwAIWsMh/Bqv0yAKLGQtYtEJgAQtY0AEWsIAFLGABCzrsCoFFxQIWsIBFAgtYwAIWsIBFsisEFhULWMACFgksYC1j6r90gAUsKhawgAUsYAELWMACFrCAxa4QNMCiYgELWMACFnSABSxgAQtYfB+LBBYVC1jAAhawyDz5G2cTMNB2jMTYAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIyLTA0OjAwQO7bxwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjoyMDo0My0wNTowMELsRaUAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL01MVC5zdmc0A7X9AAAAAElFTkSuQmCC"
|
||||
},
|
||||
"147": {
|
||||
"admin": "Myanmar",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAETElEQVR42u2aT0gUURzHp1MkRRQRdIpFMi8FphZZZJChEYRBB0krwzKIDppYiSLoIUNLIhc9ROTNys1KVjRFSIXQ/kBooiZkqIFYKGqabZTBfvfwZNr17ey4uzPzvXyQ+fPeb998mO/zzVP+zr/tUdaSpL5UOAQkxSIpFkmxOBAkxSIpFkmxSJJikRSLpFgkSbGCzaWovuKoXJCjQbH0EytndCS3EeRoUCz9xGqZsb+sBDkaFEu/EBx33fma8ccxUTWZzUCkWPqFYNPSqyW7hwxEiqVbCIpiOaZcjiGODMXSIQSXiYUjDESKpVGs8182XVizTCmR7rMcJYrlv1juyPMqFgORYukWggxEihUQyz4/OeP0qpRAXMkR+49YRbvaHti2kCIHb00kPrXJiIUrOWJqKrv7G7ticmJ/NvbHZqiJsyLVx8Uj3tqRb83fs9pa8FZbyubWyynrxyvn68abZcTClbhLpgaZkZG/Xq/Rk39SvisRqfjuwGq8sfdd8fVyGaVE4i6ZB2YdUqxldHaO5Tuz/BULd3H0LCGW/GsfRJwNP57dN1zkr1i4Cy14iyr5CQPFCuiRy19/uKo5K7EWFI/I/O37SOAhqA5E333JVO7vlRTLb2IQqysHd1Tv7LsymtR9COw5+C2he1Zfyk/YfU/kV6M28bdjNMJfLwNEISKmvmJkod4WyIM3OjECYuBSLJ3/awv87WIUYvaGX22UEDSYWOJk/KStvT41CdFgVqUQgvilnLyHbAbm2dtpdKXc3x/FWZRx/4tUzLGsgLDQtlgQDjKJkWeO5QnFTOtVCA5ti5yhIr42GmVKbtEFUuiFEKk40tdS/jw8p/moChVygdSQvJTwekN2QW/m1IveqHBQCpWgKq68G/4dFg4rYeIqlBU+7FjuIzQCaIXdobpOzM0deRTLw/Shjrb0dcF8V2Ve6yo856BYJidWiYIpFnq02m4ty4kV/Ik8euQby7RTeE8IBmd2pVpcQCByP5Yfu6F97yIPfM+Wtk1z6gqDH4LygSizU97frYursUFSfi+8kr+xpCW+1AoM7Udr9G6d0VYmx6Kj98eZm1NbUz+c3R7Ih+rFyGeFTZ9AbS2gd1SCqr7HxZ86etqsY24JsX7sKYu+26RNhbn20oTbMWJrc5FFF2++0aapujWKZWC6HvWceF8r//hx/XRD2nR2pLc2cVZbyxTLciG4UPOwoe64fEjhStylLRApliGJ2JJ52LPJeQXF9kD6Qgu/Oz5WDLhWCER3VRTLwPxV2l7TOeDtAeOsvu8PtOa730W7M6I1gmIZMwTjj42mJatDEEfmU+9V3T+wer0jItGLtxpQIcUyfAgipGa2XbqaVxLMStCjOiLNHYimFQtxI65ChfYNgd7FlTBzB6Ji1hDEGwIrWOG5roYKzRqIphXL9ypUOBAVUiySpFgkxSIpFklSLJJikRSLJCkWSbFIikWSFIsMEf8BFxxzt4ucGlkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjIwOjUzLTA1OjAwjkZFOwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTU1SLnN2Z3Afk/gAAAAASUVORK5CYII="
|
||||
},
|
||||
"149": {
|
||||
"admin": "Mongolia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADwElEQVR42u2cMWgUURRFA1YBSdQY1qggmNZW7dIoBBFsLEQQrWwUxMJC1MrWxkrRwkbEbjGFgqDYiGIV0IiNCgEVIYorhEAkhbBnizu8/bubZGfZmbnNY/g7CezO4b7733t/Rj5/rI3tnS56vHH86vLtfbOz9fr8fBHj0cdzp96v8C3K8URGDJbBMlgGy2AZLINV6C/w9cn0lT1neCQ8HoNVcrB45N8OHds6NToYxTJYFVKsP8/untt5MG+8DFYlwEKrftw5fWLX6Mrrtxe3z4DXYv3w9901gxWRMlg9RQD69eLm6uQ1BQvU8garuHgZrC7x56XzH2pHll89v7xjP2D9XXi0MHGy8fLB2Yk3ViyDtcGIo1o98Ondtpm1L43fY3NrU0tPx7cs3b9+YbJhsAzWpiKJjyQIUngvgzUMYOX3LAZk3kGK5Gjz3gtYeT/yQioWPwoq9e/e4q3xhyRBIq4rD7ysWCUHC2WKSGnEyBssg7Xucqga9hgx9f0VfJcbSg4WtaskWM11ChD5gWXFKglY2hNMFRoULODDafXLbxms0ioWuLATxGmhTPgtUFOkSJr90i2DVVqw0CpgUsg0Unpgb8g9ToXuFfaUENEq9Em1Sldo7Ni8W7E22IRGn8Ao7+EZp8ICgwUWpDCNpDlVLJDiU73WFTXv8R7+j8Eahunc3MFqU0poXlPw1L0hK3qPFhoiiPFOfFjvX8xgFVix0JVYREgNwwAQiKSa0NwTK14Gq9pgNa/VjGs1q3MkCWYUy2BVswndAisUPAGrlSib6+z+NOq6opPqLW4GLO8KCwaWohNToVp7EIwWXiNI5aFYxdUtp8I2qbBzuQGAIihOhVasLoqlZlzLoVSw2A9GyNqY98rvCivnsTqDxc8BQFpcQL24R49XaKsn7jSrBpZTYTIVtpJaQASM9BCYNnbapMJKKpbBaoHV2scJWPFTPfJF1HEa3RWm9oz2WFVKhUGx0CFVLJDSxJcpKESds3l3gTSjWOKx8FJq0qPH0r/NeCyDZcXSjp4qlu4K4+F61S2dxMrDYxULL89jdam8p84VApbOQbiOZcVaB1ipoZrUCE2y8u7pBpcbiHqIPnYJU71CDL4Vy2C1K5CKYum0gh6piJPvrKNwBstgdUmFQMA9WhSldqXX+hK2PFo6nm4oya4wmnfUCDi0vRNb0Rmw+jRBarAKOfMeR2JS7+nTvWHqYGqcedehGqdCn9IZive8l+NcoV9jZLCsWAbLYBksg2WwhhEsz7wbLCuWwTJYgwKrHLvC/+IqLfAqTqLbAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjoyMjo0OC0wNTowMEQewWIAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL01ORy5zdmdei/mkAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"156": {
|
||||
"admin": "Malaysia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"159": {
|
||||
"admin": "Niger",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABWEAIAAADmonjmAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACpUlEQVR42u3bPWsUQRjA8RVBlDOFtl4rgvkAdlpYCFpEBBsFCxVF0mpstPED+IKtECzEyph8CDUSQbBQwcLgSxSUKAQFETnBx+KW4y6X3N7eZufX/Lnb3ZuZnfszr89ki4vHjm7ZjFgsM1WAxEJiIbFUBBILiYXEQiQWEguJhUgsJBYSC5FYSCwkFiKxkFhILERiIbGQWIjEQmIhsRCrKtbxiUOb7lXo+eq86bBTixTKrJ+OvLJcIXBwdvuD6/2+nWJ9Wbrx6tQtxGKZtVZa31tLKfPPk5Wby031UCyJtYpwvxsfDrze8WvqzeTCyWBcibukJFZfGv2YeXzhQTMa80/bLs7su/ru3InnO/d3Mu7Gk/ErkhErx9CiXaNV5lNdBrCRws+9T3fPNdRqlnL7tLww/fbSdLFLBqFmpJxyG5alqdTXO7dfnD0y7FWoyCVNvZITK9dKlcLIkVg1H0v9H0WVKFbkGLkTq4bd3+drVz4enBjVRlDknk63mKXTVlVhVzGdOWMSYuWG6iNllIRYNekEY4WpChEQUZIUOsSaixXbL+/nTjea96vQYkVJolTE2sCM3b3yZ4K9Z4jEqkmLVTWxQndi6Qp1hcSq7OC9baPa4N1yg+UGYnVnLEtaICVWvbZ0/uVoS8cm9FBmgqkFACYXNvNt+93zl1+WKVbkKGwmvUC/IQ/VBfolp1e0JX3Fua8xdlRossMUucMUazic7jAFsQY5/hVr5e0Hv+KK41/EKvjAapBGxMJRiHVm17P5qeuIxTLb+ujh4T2TiMUyGxubnR0fjy/xuZ3drvfD3r9d313l2SjlydZXCMTeJBYSC4mFxFIRSCwkFhJLRSCxkFhILERiIbGQWIjEQmIhsRCJhcRCYiESC4mFxEIkFhILiYU4EP8CP3QcVcisNdYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjI1OjMyLTA1OjAwCHeMTAAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTkVSLnN2Z62kCwgAAAAASUVORK5CYII="
|
||||
},
|
||||
"161": {
|
||||
"admin": "Nigeria",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAA10lEQVR42u3YMQ4BQQCG0RmlOIRaRytKrdCKS+jcYJUuwQVUIipRSZRqN9BpxyVmNpnNezeY7JedyR9DaJrVMlTuOF7ctpf1a3Sd/eo9xWnynt/7m+/5eRikT9qlab1n6QUQFsJqSRzGfXz4kMLKrPa3iLD8sfDGQlh08nIXlstdWAgLYYGwEBbCAmF1nR2LIuxYICyEhbBAWAgLYZGZHYsi7FggLISFsEBYCAthkZkdiyLsWCAshIWwQFgIC2GRmR2LIuxYICyEhbBAWAgLYZGZHQuERbv+NLs9EzrgD8YAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjI2OjAxLTA1OjAwXCcqMQAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTkdBLnN2Z8csR1EAAAAASUVORK5CYII="
|
||||
},
|
||||
"164": {
|
||||
"admin": "Netherlands",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABJUlEQVR42u3aTa7BUACG4VPbQIIJElZgjG0ZYy1txMjEMmzAQhh0JEJKD9p6vsEzuJGmPXnjJ7khTTvt0ZCMa3AEFBaFRWE5CAqLwqKwSGFRWBQWKSwKi8IihUVhUViksCgsCosUFoX12Cx0k3Hy/esUeX3+mlh32IxzLhTWeZrN9isyruFi9oEJy4RlwjJhmQnLhGXCMhOWCcuEZSYsE5YJy0xYJiwTlpmwTFgmLDNhWWXD2rWOk9OBjGsYJMtke2O/t5hv1vd/f9VY16my1XnG/E7uLX/P7z3jwxuqi8+PtdkWCetXBofr2YXF2igsCsu3MWFRWA6CwqKwKCwHwSaG5feasEhh/avlPwHKX0FY9I5FYVFYDoLCorAoLP/oQu9YrINXxJp2iizafvMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjI3OjEzLTA1OjAw6NBQuAAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTkxELnN2Z2ULOOIAAAAASUVORK5CYII="
|
||||
},
|
||||
"165": {
|
||||
"admin": "Norway",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABJEAIAAAAUIsioAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADa0lEQVR42u2dP2hUMRzHA+rQDkIHLTg5WE97p54KQtEOXeqkg6ODq6f4B6UognQQnFQoTpbaQYodrJ0qLhWu2KEoCEJBlErtYqlSOZWCiH8q5YZ7Nc27JC95l6efDF8euSQvfz4kv/x5OVGp5Nt3FcLUz/t2DxUHf2wpby0/WZbc5MSL/W+PNT/eWzxXFmL7p5M3hNiRK5XUuhKmcOpI/7VHiz2V60tn5DS/Hb356tZiZSjXsbM75JoJX8W/AlZ9pAzAet8+XHgAHIDlGix6LMCqNxTmBkobAAuwPPVYhjYWQyFg6Rnv9FiAZQlWdcgDLMBKCawaUoAFWM57LNaxAAuwAAsbC8XGYuUdsFYrPRZgMRSiGO+ABViABVihgcUmNGB52Stk5R2wMN4BC7BQwOI8FmAxKwQshkIUsGqLDoAFWAyFgMUmNOoeLG9zqICGQlUZk5TdLm41Vjr5SZCa+D4+Kkaf1dF7IyMPL6/xrONjGl7S35vnx+a/pHMe6+fd6bbp2wY5jM25s3oLPz+SiuXMOh93N+Bcuf8ELN0eCwdYXu5uwDkD63Xr7PGFE9nSmfzc14/F+4fGrjzvamreM3X2qT5YbVcPT/YOTN15eWG2/822d50Lv7JYA43Var3F155oXX+w71KTvm7a2PGhZ840VvIU5Fgt5w/MXBzXu7WhpuuW8r2nJ0zz4CrPjQ3vI1bUP/os5HlTqLr2LM8ULHU6vvXvI4cmZQy5Farlkmfllg2Dxq+ZUQ9UAWABFgpYKGBREagHsNKfx7lNP4kllJUZcQZVtQ6R3Cc+pE6YeB/zdayVAkfXsVRl1/k1/lknHVd1YvesX147H6FaRY36JA8T72+afnTl3XQTWl5518mbKj929eC2TvTzY/reJO3OJjSOTWibTWiz81g4wOJ0Q9hgKc8Z6p9FNA1jGFfvBKmboXDVCdIkZTRVV+/y0S5W7SgMzlPLYVThdfw13tXgr3Ts6sGVmraLj/PyCfLDX56oP7HnQ3u+K3RlvPP5F2BxPxZgcXcDYAEW1xgBFnc3ABZgAVYQGhmMsLEAC+MdZSjEeAcseizA4qpIlP8rBCzAwsYCLGwsFLAAC7CwsQCLHguwAAuwAItNaMACLMBiKAQswEpjVsgCKWDRYwEWYAFW9v5WTr4gmr3CRuofeRNcTTFrboUAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjI4OjM1LTA1OjAwOC45cgAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvTk9SLnN2Zww/KG4AAAAASUVORK5CYII="
|
||||
},
|
||||
"166": {
|
||||
"admin": "Nepal",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"169": {
|
||||
"admin": "Oman",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADB0lEQVR42u2aQUgUURjHhzxE6EFhKSiUMLoEHVpICgqEDoEgkoFhmtVFukdIBLWB2UUS9KCHCD2VRFAnpdMGgRsUeUkCy81YWYkyzJAoo2D/e3jwdqdnq9tM89vDn8e337x5M+/H933zzXizM9trdsWCo+lP+0cOvFnryrRlbv3iF9qfFzSw3jXEaxt6AStCYL09V3diT4Vtnxvf+3Nfz0Jfy0DrgsbuxwIWYMU+VHWPX1idv3Jw/vC0bf+RmIm/Wvq4u2f48gvzX/kvPu1KnT8KWIBVQAXHSvVo9ViVGYGEwkr7/ckHLRqbUUr+gAVYf0iFq8mJ7GSbGZlUbgsgjWWXj/xJhYDllBDXrk1ffdmkNKfqSpZs/NSW9rTssrjHKsCKNFhmgltO9J/pn9NYKNh2ngoBq4C+Hz0y2zikpKZYpQik8ffHzzpTd6VCwbTIJzN4/E7TFx0l1ZyAFWmwljp6629ktc15zSU4obacGr45cs+ESSq7fORvzqA5ASvSYGmbzSilsRmH9DxoIqVulgp5O2LZDQvAihxYqqjMyKQIpK6VVPZvJ5OHkp2qq4q1SamxACtmNzkVsZTI1ETQ9n9NP6x8VJMv2HPRS/p3eAFWRJ8KleAEk927Ekyyy8dsmQIWYBWNW4pVSo7+bw/lI39VWnzdAFgFXuaoilIqdOmky0fPhjrWpVlKxIoEWOqkr/d9n/88GhfztJNpPu3m6jbbYtptH9vuPvZX/7X5r9P/LKVfr/u1u6/BZR7T4rkkplKe8uwYtlGzbba6v98M/lnKvxIv+BuMhlEBCwUsFLBQwOJGoICFAhYKWNwIFLDQMDRLAQslYqGAhQIWNwIFLDTA30eEDCz3G+f++WF5VrXZW27OX571uJ8lcGA96a5f3PH67NbW65UTzZ9PT227jYZLtXcBBWvnpYvPK455XmLM89BQKmChgIUCFmD9X7ruHQEslIiFAlaYwQJrwEIBC7AA6x++ugEswCJioYAVwU4SYJUOFiACFhELsIIBFpABFhGLyiyvvwGHAWiwJ1sgvgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6MzA6MjItMDU6MDDjephWAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9PTU4uc3ZnQpD4UgAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"170": {
|
||||
"admin": "Pakistan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADwklEQVR42u2dL0wcQRTGsW1DSLBYNI7cyaZBIjAIWlVBBQmpgqRJEW1IBYgKakpdEYW0iDpOUEETDEGCa3J3SVPDiUuqqLiKz7xkspvZ3WF2lvuZL5fLsvuy87vvvfnLxKg7Goy66WhvffCltz679PrR7NLE5ItnE5NoIzVNsGb6m/9m+jQPYAEWClgoYNFIgAVYKGCh4wkWww2AhWOhgIWSCkmFgIVjoTgWimPRPIA11mAp2oXW+ycLramzl2+mzgALsCrBtNH+9nWjfXh7cXF4O99/92kelwWs4io3Wu58PFjuXPZ6vy97ilZeBUwU7yWR2jv6Mdw7upn++/BmWrp4+qG1eApGOFZhFeJKdjbOne3Oq53tOAm3kXUbYOU36snK1YOTFRvh+dqv5+drcRpbWMspG9ZTBqysxOe6lFQ1Vky/1DuRR7pA65rV4cHm6jChEoIay1U1oRtbTK+yiKujYFOw3o8+643td38+3u8mlDRxLKsqxlWYu7FpcCG+dwpoG4mNMNG5CsDKb0LbkHPHb9tzxzHjUYLTO8l6Y8I9uQKfVChVE2ZFFScJ2gR3Pfjz9HqQ/66Ee8yaD8cK5lVS9cvuOhIhomcpnqykbFUIxnRTwApQV9VbXVkPc73KxqwCn15hQmDJIfKjqjfd6OkWKf0YNDupJK5eYUL11jiD5Xbms7TeqRvNRfokZYYbkije9RSfOqZesFQ/qepqzBLIcXYs4eITldJNvfOVifb+AKvoEEO9xTurGxoM1tbu989buz5RxRluAKx7AlbWnGAKs4SA1eDiXQnOJyoV+Cw+xrEC11gxF/cBVuMdy79XaEe3SYg4VrBxrHSGHgCrMSPv+dPPWb7FXm3ACjBXyAAEYJWciSuaEHU9aZHiPXBCdNcapNnAtXU1cKxyQw9uzKnN5WnUrbYFgIBlf9nuLsKi7pXCiii7ErW2jXSAVXQ1qY9qT2LMhK43Jpj0DmtO0NRYVeYQfTzM7gQM62S6pzzSbr5IYoYAxyq6E7oKZLqn3bXsg5pd/27TnLstTPdnaXLSZzeoIatUXT6oyWn0FGFhVd9rSDY/QevKhM53IBX61C5h3SusKrbkjgzBsfyTY6jaK2z1lugpNIBVrudYbkC1uiotNmD9O2BVP4PUZwNZdZj0rMackgVYoSCTi6jiUUlebv5Rf6v76J6NPJyc4v2uD+jW4II2bqgq0mCBPut7XaPr78kZ9zgWClgoYAEWYAEWClgoYPFv5QALsFBSIQpYgAVYgIUCFgpYFO+AhWOhofQ/1BYbV2meOR0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjMwOjMzLTA1OjAwiaeTfAAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvUEFLLnN2Z2wkW34AAAAASUVORK5CYII="
|
||||
},
|
||||
"174": {
|
||||
"admin": "Philippines",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"177": {
|
||||
"admin": "Poland",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA/EAIAAADJWSZ0AAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAAsUlEQVR42u3WMRGAMBBEUUJJRZEaH8xECxKQgABEIAcV0YCFw8RV8J6EnV9siYiIGCDVaAKEhbAQFggLYSEsEBbCQlggLISFsEBYCAthgbAQFsICYSEshAXCQlgIC4SFsBAWCAth8QPl2c/pWgxBclh9m+/1MATZYfVaWzMEPhbCQlggLISFsEBYCAthgbAQFsICYSEshAXCQlgIC4SFsBAWCAthISwQFsJCWCAshMWnvSpIDkC2ZYo+AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjozMzowNy0wNTowMBhQC48AAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1BPTC5zdmfkDuYeAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"179": {
|
||||
"admin": "North Korea",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADF0lEQVR42u2cv0scQRiGBwIpTJfC0iIBq4CpbOwstLMQBO1iE64JClb+A0FIYUrBgHaSOuYfEGx0CYmFYAh4Bo6IBEyahBAwFm8zYZxh9vbH7c0+zcuytze7N/P4zbvfjJ8Zuf9obOUFiparhi5AAQsFLBSw6AgUsFDAGlp98PTxk9Ux+qFI/xhdVI/GP3TbNO+gNl/N29X3rz/dQ9Fy1fx+tn/+7k0T9Nf24e7hbvz5Im0Oo1bRP9WpOb0wy2bZ1s+d0ZPRE/d8Xi2rnSbcJe8d63+qcp8n/nrflaY5Px5NSQELBaz/9cvV+Pz4vPT81eTS5JKOmzYNAdYQYPRtu7PWWZM9/PPxbPNsUyoDax//eLlztHPUe7h4sHgAaoB1hzG8er5+vH4saP59uMluMlt1XsC5n0oF4tfp2ZnZGYa81WApPv3c35vYm/DhIr2e21rYWhCCPvikf7PeZe9SmDLwrQNLSCnGhJGS2nFIkMV86/vpRnejy/C3CCx5oxg4FJ9s/yRHFfNdqa4HgsTByouF4pPrycITooumYiQoJAiWgNDbXPF4Ex/zpLiuZMHqrkxlU5nAkmEPq23Yfa2FWxB8OpafIyWRIFiKGXprq8f3CCNZeN1XKVaASAosN62gIa8iigggd9rFyCcIls9d6bymtuJ3URJV8cm9lz4FiKTACmethEJ/A6+YF2PnAStBsOLf4/Iuy2hKjWkZsJI17+GBV9zKm3MKryHainlPNt0QHngZ/P4WiHy+ynZypBtamiD1TVV6m1Nmyxd1wovZJEhbuqTjToJ2FspdonETB74JkSWdVi9C25OgnaOP307jmxDJXbUILKFgJyAUb8JZqLB/Eo52m2ybafVGP0WvvIvTvslU7YAUW5OjtibHxy22JgNWjn+mUDSyVeflsQQTqQTAyhHJbGNuKxgBFgpYKFo6WPWUwai/harLn/TXfnX9UOfzmFSL+6ADLmNEiTC0ksJrdqnCtIss1lOCMablOnu7v99bvGcMBWcpv1vFk1A1GaUcNwpYKGDREehAwcI+o0Qs/iQG3A+3LATc+rwtfbgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjMzOjUxLTA1OjAwM2Aw0QAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvUFJLLnN2Z+lmK0sAAAAASUVORK5CYII="
|
||||
},
|
||||
"184": {
|
||||
"admin": "Romania",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABPUlEQVR42u3aIU4DURCA4dlNg6HhFAiSOg7AIQiiJJyg9dgaFAJUT0AajkAFZ2hANAFEBQ5FQoKoeCwGW7ebdMr3yVWbff8+MZkqYjCYTCK5u9F49vhxMT35fn0qpfTrVa73r557o+bhczkf7q3fz64O90/jJc7jIO+J1AHCQlgIK7W3uI2ZgxQWwgJh7Y7kgwZhbaujuI8vYYGwEBbCAmEhLIRFe8yx6IQ5FggLYSEsEBbCQli0zByLTphjgbAQFsICYSEshAXCQlgIC4SFsBAWCAth/UP2seiEfSwQFsJCWCAshIWwaJk5Fp0wxwJhISyEBcJCWAgLhIWwEBYIC2EhLBAWwiKnnk+wFf/3cXPdjGMZi7j5e7RpKyvJGqAbK4OEO6U7dWOVUvr1KuOb/yyqy2oaEcNYb4wpVV6/I3I8w7RHvwYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjM1OjM1LTA1OjAwDF5tAgAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvUk9VLnN2Zx5hAsQAAAAASUVORK5CYII="
|
||||
},
|
||||
"185": {
|
||||
"admin": "Russia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAA20lEQVR42u3bwQmDMBSA4bziEi7iMO7XYVykbmFs01MPgg0RBb/vKJKExw96SeQiQVMPI0BYCAthgbAQFsICYSEshAXCQlgIC4SFsBAWCAthISwQFhfVnbt9nvP8+yT66I9fZ//73zfrTrVn939XrjvPcfPZEuM0Tm7p0FqUPoWFfyyEhbBAWAgLYYGwEBbCAmEhLIQFwkJYCAuEhbAQFggLYXET71s6KT0Hg6BxWMvrc2fMIPApRFgIC4SFsBAWCAthISwQFsJCWCAshIWwQFgIC2GBsBAWwoJqK8XrMLz36KVyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIwLTA0OjAw13HK7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjozNTo0Ny0wNTowMJEEdTIAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1JVUy5zdmczbNaZAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"188": {
|
||||
"admin": "Saudi Arabia",
|
||||
"flag_png": "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cZi1XlEaiDDJO4YwEspWPVZ23rS2oQ1ASSt3pbZovE7kW2gRmHoLyE9dx3umUKZ8ykFa8rhbcwgOdipwRvCad/vtILVZDYw8v70baCDafUqJHRBQqEx79QRp5O0UWgR8qZcLy8nlVp1Wyn7qdV86bvSB1q36GQe+pZKacURDp5j33GHHkxJY6EF31JSX5dWGrtQoMLKqsmLyyqtSW7VLBys+S46pWCgpxDSSwvLY4EsB7RRqADf13k3BsV9F1pdXLLt86rIt0CRNNzTqY9gdC6DYr9aB0V3cj01arw+h7ndPMIewCH1Yvv5QgwMDux/eagvu7pH7sybAfNH0w55OCOHHina5Re4LUeYLvmt+7CLm2cPRH48c4wWQ+U5pD3sLxgkcpEU2lUNf6xP5XHL3Y6jdt+OyXwoyruvIhlKX80mUtkdtI/MiSwMn08VlMRVxnGkzp4N0LDbHydHKyXHhec+HKcYon6LJsC7ujGhTKPSvTf4LMqwvf1vJCdZE0IRe1/TrSo08DeKcB8xuvPd1M1NJv07zC4a6T4Pmvu/m98w0H/n4fruxOw/TK4dOkM8tXWadRU72JR1/scjeX/x7kevhPrAW7zB8jvB0NLoP4PtstFNiEJxPU8fXO8Y8TR2KSD5NfZ6bsBnHaDi2zGF9gX6elWVLp197pVf5kQYD+h4YUhiZ5utrNkmJqZqVT1Of3nZMWHp8w/d4tdhcL+NMboKHUf4apPZoK7FTBN+R1peQz53SN2LFfI7ZUs2Rqz4b3YOKLD/5Q6z7uvjD6g3qerunbWhKk3dr6zjQL72ijfIDNx5ee2jdIndfxXfnZv8D1kC3Aba9j7R1/SYX3bYNUUxjU/OZ87llWOg/I+Sg0yXcr7vl0bxOtEj2wVRhHE90X9EBYwmkGeqXMD1fYxR/uKOpjDK/ThnNbTMlh3ioqKzyC/WSW1s5/ljReksnZvR6hG3poXYVx/Xzpp7vII0TX9AXWMf1F9McocyjuR8rtx+rzNpz2N9tjnFZEC7+MH5oW+R/rg5bs/U/oePPktzsHJdEidDzwQ5QnEyHKfqVZBEi1rvDN7R9kE8+xbef4tzN17O7IYe/O/7RqJLHWfNd6VH+otueY97L+5miHbgY9nfokXcp/j85E1SCjv1bgloG/aqzmN9S8udvxXc8/wVl7ibO/UJF9gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6NDI6MDYtMDU6MDB43n6GAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9TQVUuc3ZnghxoAAAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"189": {
|
||||
"admin": "Sudan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACWElEQVR42u2aPWgTYRiAP3+hEGj8IZQ6dOgQNaT2SIaAQ6EUBKmaajSQtDFSpB0EoaOEpsHJblWHgktFhUjcpXQrIg5msMVBDLEUQYqKHRS6lHM4h5PrhaZ97y45nuUZQu4uvN9DnvtTl39fehYdXqp1v48dXlkNBuNxCPdPpU5MTZ+JaD3Zmcirp6lwn7bAUKCYWAZDtyavnE0W6on+c4vVQ8ffxb4xICgglsGDV+/cD9+93nlxOfocvaCYWGaSSOiIWNZEMjIoJpaZRiK5ioTCYpFI6KBYJBI6KBaJhI6LRSKhg2JxoxU6KJY1keiFWI5wh0QWAzkt0fSP3ttW0PXZuiSWQCKLgZyW+LeVMYJdDML2KHbbWj7/74j7WBjb/dgdsdkl38WeG3/e9KwafsdVsWyvIs2iQF/QM7HMiSxfGH4wcmP90+0jhTz0Bz0Wy3iTwkjk/IG3yfKCvq7X9M+w3emxWGae6i2FBm5OXKs8Kf76+niztqFYHsQS5vnvj0rZ9JuT9S/V1ywSYjnyH2Yk8uePP/rmRxYMsYQ5sVXZnrlHIhGLRCJW+4hlTSRLiFhcRSJW+9A49+LUHrHEnjmSQsTi5B2xSB70/w3S6dL4wAeSh1gkD7aqWNxhRyySB1tWLJXO94yeTg2uabXMy8yLTBn6g96JpYbGuh4qpY6po9CPdP19UaX6osF5Ro9YYslTqnuuY5ahI5Zg8lAKscSUInmIRfJgi4rFVR4UFovkQTGxSB4UFovkQSmxuLEJpcUieVBYLJIHpcQieVBaLJIHpcmzPCjPv0cRG1YFsTmnAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIzLTA0OjAw5pnQcwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo0Mjo0My0wNTowMK6sX9sAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1NETi5zdmfF4V8gAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"190": {
|
||||
"admin": "South Sudan",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"199": {
|
||||
"admin": "Somaliland",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"200": {
|
||||
"admin": "Somalia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAC/ElEQVR42u2cMUscQRTH9zMEUqZJLeQTaBDEzsoiINoYxMLWQusgGpLGQkSCgkmaQLqksLGRxMIiTSCBgEdEvOh5nEiUqAhn8W8GJnvs3u56s/t+zb/YO2fGt7997817sxcNDr18tV8LQQfeLzb2p8JZD5pFI0yAAhYKWChgYQgUsFDAQgELRQGrxGqnVgdYIA5YKB4LBSwMgQIWClgoYGEIDvAUA1ZaU2J6FI+Vg/ca+bDc//uhFJsAVm66MPfppPFAijUAKzf9MvHr8nJUijUAK4cgOHm9MXdYP1xtjd00pLqCfQArE1gKf+3h9ut2TaorbF8AK5NuTX9f+vvEBUtXsEzJwArHEzybXR09+KHw54KlK/oUgPBYqeGe3/q49ufaRYqAmNwdAFasmfwgWN6AeP8PAGD95wbEBUE/IKpkit8yAZZuc3L1/6pzEHRV30w7oz87YJWg8aLsZ31z57T1vDv9Nn7Q9+9RErD0ze5mefvi6/nZUFWr+VH1fNXM3ruLo/nkcPRKtUKtFrBKlifJK4SGlFZV7fzMRPKuTOjnm/rx1W6vYFKyr5WQvFew66dG8n0ipcKEZue9wsruExWAVp5uf24eNesXj29XioBJI2sWm6e4Iss14iJCpEbzyxCAVbPmw9yDMdmzKGshr/RgFXGr3PJEXh5Lo/UWrBCwjmjg5FuS0Ghl91jZ128aLKXVReRYvHYRWc6uFLaS7A3do8lJ9oMhBETA6hle6tl1BkV1L6XkySthGpldodEgGNdPlNcRHG7jxa2E6dM4b6eRLQfEqEo7kbQ7QR8Lv/HS+f+Kq4S5ARGwDAVB1cT9xota18kfErfh7Z841SyEQkOqUOU3XrqDIK5ZpFls/tpFZM1XuQm4u3fL98ZrZDfxBywT59nThrwsL5DZfFGMyvtUlVor4fhF3tJBAQsFLBSwMARaMFgcT0PxWPxGMmChgIWigIWGW+wFLHI4PBYKWDzBgIUhUMBCAQsFLAyBAhZaUrDYtVFLw2OhgeodNePDm+0EpMMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjEtMDQ6MDBxBsFaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjQ3OjI2LTA1OjAw3NKyvwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvU09NLnN2Z+iG1TMAAAAASUVORK5CYII="
|
||||
},
|
||||
"202": {
|
||||
"admin": "Republic of Serbia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"205": {
|
||||
"admin": "Slovakia",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"207": {
|
||||
"admin": "Sweden",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA/EAIAAADJWSZ0AAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACGklEQVR42u3dv0rDQBwH8CA46ODk4uSggzi76QM4WRUVfBafQAVRdHB0sYhQN6GbgpOouPgIDg6C4ANYKUFMqa1p0kjPfJYvpX+u4fLhd+FyR6IoWl06PA4rh0/Xh/Yrl09nb7ObjcZDNYri/Pi4u+sl41/F7Qyfrl3vn4TYG4Oa/wJWr6TAAgsssMKBlRxAv2A12wQCLBULrDBgqVhggQWWoRAsFUvFAkvFAkvFAkvFAqLUsJoIwAILLLAMhViA1ddlMy7ewTIUggUWWCWHZSgES8UCCyywAoZlMwVYKhZY3XLl+Wjit9fdf5Wt5WYWCev7X/7qBKTpyfTH0+u5yHbuUhzPyPxGfW8+rByrbS7vjte3zudmHvPDituJ2wyxNwbhXLS/H13t1A6m62Hl9fvFwtTL6+3N5Oh2NlLJjNuJ2wyxNwYzWzZChZX5SXXaECbzZ8cu7u9pK0+Wrfcai/eVnxIF2TdYyfd1jSwkdYEES4IlwdIREiwTFmDJssFqmSA1826WvJCZd/cKQ7lXGNbdTKsbAljdEOLKi6j7yqd0n2ZbJ5S9/SI3rLb/b54jT/P9bOu3OmWe48yzTqv9O3ZC26VjabIt9mCpWGCBpWKB5Vk6YKlYYIEFFlgu3sFSscDy9C8VCyxDIViGQrBULCDAMkEKlooFlmssLMACCyywwAJLguXiHSxPpgALLAlWNesG9uS+QrD6m58+1tRKPATTOwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6NTA6MjgtMDU6MDCvvw1bAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9TV0Uuc3ZnN3MeBAAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"211": {
|
||||
"admin": "Syria",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADBklEQVR42u2aS0hUURzG79gDF1HZIqwostBatDArichdOBERGYGC1fQQJIJqU7StoEWERESFYg8hjMYQoqKHYoaZZBktGrQkI7Ei0h42oE1ii29zYJhhspm4587v/8HHcO7/3OE7/u6dey46XV1ZM/NycTy57rAE/8nHZ/mW+AALxwELBywcsHAcsHDAwtNhNwpYeEpQBiycOxYOWDhgsRA4YOGAxcYbsFgIHLBwwMIBC8cBCwcsPF3B0iY81lbcPBrdE300fs+/zE28J5EUE+v/21ypzjux742fN/FZcb/XGTodLLn5FMeT6844RaWgAIsCLAqwUlT9deGVQ1vk6fDnsTevZWCd9Ye6m6rk6QCWvXmtAWu0cGxf5PGGovtvqhrlGvEqUrbntQas0LNvxR/WZN+qbzsQkGvEq2DZntdx2zUq/7VnrPf3UfMavbCpu7Il2zftYu/OdrlGzLnmLPdf397O6yKwWvd/KujxldU/LD1/3Z9x7/KpoPlDkBMJbj603MmtfRmYIdeI2aNZOoPO5mawvJ3XdXesYGXf687ipfNvnDzywnFqfpSPm4trXsHmuDo1S2ew5Y6VhLzH+t53lnHHSqh65n0v/NhcuqLl+bnmSVsvTd81x1xo87OOqlOz7H2iipXXTG1LXlc/vA+GRmf/bCjquLPwRH80WHIdVaftD+xeyutqsPRiMPppw/TFaxsyD+/wxitTpVCiWHm1Gu/8w4NfVgPWBKt+/du8juNa0My7V0oqunbfbiuoDcs1omtanbaDpRRKFCuvfgrdn9fVYAUWPVpV3Ti34tr2g+XabI/kj02N5MhrJvdUt2bpHY86bQdLKZRI6cy8WgGthvvzuhSsgSnhpq/L9j5of1W38Unj5zO9A7E6dVSdmmUjUt7L61KwhrdF8kcWJP6Iqk7NshEs7+Xl32YowKIAiwIsikoBWFfXIZR8Ob4MhJIvwEKAhQALARZCgIUACwEWQoCFAAsBFkKAhQALARZCgIUACwEWQoCFAAsBFkKAhQALpZX+AJdtKUiI9nGvAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIzLTA0OjAw5pnQcwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo1MToyOC0wNTowMEB9ZmUAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1NZUi5zdmffuTTmAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"213": {
|
||||
"admin": "Chad",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABXElEQVR42u3aIQ7CQBBA0a2mpgnhAoRaeie4CxqBRXGWmqZILkE4Al0EBkVICLTbPjOWipcPMyWEUK6223RnlpXtJp6O+8XyEO/nWwhd1zSpzeeTX4vdpZjXMW/Xsa7zWVWlOwNYYIEFFlj9wUqRF1gDnYoFFlhggQUWWOOBlTgpW6FigQUWWL4KwVIssMACCyywwAILLLAmAssdy1aoWIoFFlhggQUWWGCBBRZYYNkKwVIssMCaOKzXCRZYigUWWGCBNaj5wRPaCsFSLMUCCyywwBodrAHQBMsdCyzFAgsssMACC6y3d6wUSYGlWGCBBRZYYIEFljsWWIoFln83gKVYYIEFVn+vrsECS7HAAgsssGyF7lhgKRZYYIEFFlhggQUWWGDZCsECS7HAAivJO9bXnwuWYikWWGCBBZatcGKw/gJXsRQLLLDAAgssv7EGfMcCCyzFAgusn2+ODxFBzpJgiMMKAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIxLTA0OjAwcQbBWgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo1MjowMi0wNTowME0fhVUAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1RDRC5zdmdX80m3AAAAAElFTkSuQmCC"
|
||||
},
|
||||
"214": {
|
||||
"admin": "Togo",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAA+EAIAAAACBfXRAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAEu0lEQVR42u2cTUhVQRTHb62UQgIhcxNFQptoEdLHJiqSCKEWLdKMdn0QQgiCi3JR0BcGkZRCLnoWEi7SkjJJssiUgsyIFCKTlNBMyTTxg8IXeITuY95M83Hnvnvf+2/+PMa5c8e5P84598yZ67z/teJS7gYPtCwja1NLnN82lDe+q/3F9aymzRk5S4rK9z51ik9W7NsC9VWtPGZei7inCY7M+AArzGCpoiCDoLGtot8AK/wWK2gKsACWPQVYiQaLF+XIR062w3OtOAxgBclisY/QT5g8vQvACqor5IFlYMO+tp0qOL+259rq+h01cIWpAZbM25aB7fn4MPfOge3Tu9/kf1hJvz17BwRYoQ/e5a0X03Pwy9GDZyLRjvnX8zNkt5ShUUQcYAUPLPNEJdM+frs+q3k9gTVZ1dLdfhGuMLUtljFkvc9yRvKG5wr7GgaiBNbvC992jXZLOUS4wpQDyx3aC1MDA9lF/aXVhJRbYxwibzQD3OkVIdJ6pXjdjaq6urNrtiVWEzUT2/flje9o7sdJ649lkdqGeRasn4ONDa0vNUeWmC2BNfXqVvHy2Wj0Xafj6OrbMbvqvotXc5C5yqv/NP6cHXmrQE6NXJiM9m3d2X/k3OzSnspP0yxY5BA/T+RvPHZcfkyagzxesyfu70nrTBw0qaYyYHGiJbJAhIVY/wyNV06ms0i5lfrIjEbh/2JkBrACr8p7heRiRhovl9Tky6BjojT+2KHq2rsFqraK5hkPLDWTDkT0HK7RJjQF5jxnZ6L0FknZL5MdQ4AVNrBcoTS5J3emykQnSpuetB1WdXm6YAUheA93LGURLHf901BeWWHFqKqLpP7kXhd3Eo2RknOFACtoYHGUIiFV50iO7z9WSqvOIgyukHeXoIGuNh/H20IXSh/oBfUUsXm17R2e4F3VmoYXLHE+Xfg4vw9e7Yo81ouuKJHhbWlyLFheLpz9B5bcFks6600WggpjWGimhjuyu+boLY82odk+5EAV0gpCp0nzmXlwryk9N95CiFtsZ71tgCX+72Qspfgqmfn8a3FktnL1nCAvCyXOhHEdomrJ4YI+P/2oN7MkRtOaBzL3i5UWSKZnHGXv6OfdzeejOmfOyF4c/3I5QQIlThaKcy2bCSMQ/S+bkelpXitho9rCZEzVaxX6myNF1oicILk52iWUsjGuTBhlsJQdolBRNhO2418MFpTB0qxnd7lIGkc5QYoDq8l3rjAmpWmh+hQVpKl9YNX8VA/AAlgefz7EwllFgIUj9rrWDmABLP+/YwOwABaOfyX9R0EAFjSgb4X+j8Z5rwRYKecK5ZOo7gwZ5eLlr7WxpQNVWEk6eUdKtQCkbLu7RfxX1f4m6h6NHTnONqp4Y1W8ZcvbmmXb9a4Vbv22l9/MWDWluqVtNAdVdY2pVEBiUs5hrrbHNylftq1+zkfmLhIHVnVP68pXIAWzXM6fB+nV3PwHS/5pGoEF9fKgQaIrP/2o2QcKKQWWjyehgQIUYEEBFhRgYSGgAAsKsKAAy+aHD/UyK3oHNcOYDgjm+pgcWF1IkCb3p13DMufkWx8Hu/FQK4olgAIsKMCCAiwsBBRgQQEWFGBBoQALCrCgAAsKBVjQoOtfD/eeMzorx/4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjMtMDQ6MDDmmdBzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjUyOjE4LTA1OjAwJcXahQAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvVEdPLnN2Z7uyOrAAAAAASUVORK5CYII="
|
||||
},
|
||||
"215": {
|
||||
"admin": "Thailand",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABZUlEQVR42u3dPUpDQRSG4bODpDNgIyG1jYvQNVhZp7Cw1Swi63AJgqWF7iG4A1tB4rXQ4oImjNw5JDrPVzwW/hDH1y6XidVqPJ5MyLqGI6CwKCwKy0FQWBQWhUW2EdbD6OLgssg2/3h7fz7xi5dIFhvP88PT6QtZ13hdPh4/vZF1jc4sYcIyYZmwTFhmwjJhmbDMhGV/Iqz3dTftbj4t+Yb+V5Z8b/9rhrirn19+Jm26Mazzu6vR7T1Z14g4Ors+IWv79WE2WyxyzP75+2Zrv+8mHQGFRWFRWA6CwqKwKCxSWBQWhUUKi8KisEhhUVgUFiks/u+wvGfSe1B/CMu7sznE/j9DT8+TMOUpnd0+x1f+Wc/0fT+HIc9FZr82T0KbR+xNWCYsM2GZsExYZsIyYVm7Ybn1hSl36biniim3f7lZjyn3FVa429NltS2fT2JY8mr5fKqFRbrFnsKisEhhUVgUFrnVD5SOZrLCehlyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIzLTA0OjAw5pnQcwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo1Mjo0MS0wNTowMPi9kTIAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1RIQS5zdmf11DYEAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"216": {
|
||||
"admin": "Tajikistan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACt0lEQVR42u2bP2gUQRSHt7O2EAVBECs7sVPLA2NncSrYqqSw1c4gCIIK2thoZSciCKcIWka0EpQkEohIEP+AIopeQFEvuZw4v1e8MHu52WQF2fmaj+N2ZzbsffzmzdtN8exl0SpaENbLglsAEQsiFkQsbgRELIhYELEgRCyIWBCxIEQsiFgQsSCsTaxvM50tna0Q1sti0B90B5NwBE/3up/aRu5GAhErSanFD/NvTr4Q0QuxKqjT//F57vZ5MT7aW5i9O/ZdjMVaMRbtEMu46eexV897h6bO7D7auzZzc9+OFXLoczjHGI8NozRDyTmIlXVinfh45/o2sWrqrGcsYjWxGG/GVRDrf+DykYXHT86qDO//+nrrwYERP39cgSXoopkX23NfDj/SFRGr4ZQcv288Pbj5qi1eCUvk8t7u7OQl6TJiVODSw/fzF6/YVeINAWI1tVS3rFq90A5HLdtcYlnTIWGsZVWW5TzFe5KISiCR8hyxaiuoh3a5KOERS8ufpU7F5WmNYintjr/dMDFuy2I2kmUk1tL21+9OjVlBrRorfaxfCiuqrCvq6iRWYxPLUidOLN9hj0ZZbz1QO8Q4mUrSSBuFcMWSUYjV8EorfNaC5Z8Jir4x4ZsIOqpOlT5rBqqrrIt3/7aC18g3FCSNPa5RjeX6WDoqmXTU5gmpxtsQmSaWdcbDD68c0lJVkj3u7QbJ5N/NUuWkoyrPNZtmzrPnTh9raDvU55Dlk74PGlmGaY8ZvklqmSJWbsuiMsYvZJ5KqZjxmZZ2FXeOiNXcZdFVUUP3d6tvAtxjojyfDJaI1dk5daGzawT3T5+73zamnL9neuO9iQrn/+v5h80Qz6Nv1jbnev6exs1TFK3xy3//XQfCWsktgIgFEQsiFjcCIhZELIhYECIWRCyIWBAiFkQsiFgQ1sU/YXON6H04CdkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjItMDQ6MDBA7tvHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjUyOjU1LTA1OjAwwFi1vwAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvVEpLLnN2Z/Ksj64AAAAASUVORK5CYII="
|
||||
},
|
||||
"217": {
|
||||
"admin": "Turkmenistan",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"221": {
|
||||
"admin": "Tunisia",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAEWklEQVR42u2cP2gTYRjGj06CWMUIbuqg4ORShXaRosRugkMX0Q51EUERddBFEBeNQ5GMoVJREBzq6NIhQZAK/sGlEhBFBOu/mlT7J9YahTwZvuPyfn3vcqGX757lGS53lyP3y/O+3/u93+fNznqbMxkqNV71+BNQCRaVYFEJFn8IKsGiEiwqwaJSCRaVYFEJFpVKsKgEi0qwqFSCRSVYDugFz+vNt1D+MgRLr183bt+yd8e383tqB57MZQcOD5V/3B3KDWehOIJPcSZ/MYLVwocAR6U+XBmdWBorPLvX9+fIi5nXN//e+TT5eax+uVKsLv17X39Un4biCD7FmbgKdyBqaQXLgOnX6JWV68urW2ey5ZMmOu0o7vazfOnQ1ckmZKkMmqkDq3LrWN/IAJwmLpgkxbfAyXy5GsFyw5++9Pd+39UDfwqGNknNkLf69t34h51wIylE2u+zsOlaJncDT5IGvBwHCy9y8WW+WHilef2/9z2+PVVDIJurDU4cfWom6b6kvvEpzsRVGtTwJE28CFb3IrVQzT3IH7S/bGCBEZ/PUUxfkcoNxjm4A+5m/0Y8FcHqSp0vnn5z8aPkIjiO4LhGeDKCKQoN1dJI/5kNCG1ABPdBLoVz7GEXx/GEBKtrFKEKmZD0UgGHxvOAiz7YIRtDyINKT4Iz8bQEqwsUVaWIPmEUI6T76LWZ+FvLGfgWgpXo0R/CkOQrmlcIpKQ8CXeG08RVksA98eQEK6Eqpeq+oCPkUgh8y8fv73+4aA9zCKNSgIum7qXznkuze1LQ0bw24KIJbQDUPjiIVq93aTrIEbCkIOgLNFavWilNn3h+VgMWXr/kcHA1HMfYUONtmuckWOuQXcE/pEkVsSCJzKxR6tR4jwkWroV7YfQHz8MRfWHW1PnBU+Pn6nSsBIElZVdwDvu18BXNi4ertQhYgZIpEElzpuW5XWKAZ9iDS/Bac/QXoiXGGJlGGzm6VHpwBCxpNIf6uB0s81oghRfsKwGo856w4S+EvxKs5DhWM7hYsZBQwEjNdCxNlZyO5RRYEXOshkbMsYKwGjkWEvmwxQjN34BgOTsqNAutMY8KHZqWdqWOJcChmTCJt46Fc9qqYxGspFXepYbjNYbxRvAKW3mPt4mZlfeEBkQxDVfPFdo7Gjo+V+hQy3KKuhs0bcHr3N1AsLqx9KCfNjH7sdqZZtb0Y/nGrQQryb6FkCf5iqqD1GhHbnaQFqa2lXbrO0gBJTtI2fPeY9+Rwex5h+e16HlvrFgM0fPu0JQzV+noVukEp5YVW4Og5MFVOq6vKzTCWbR1hUDNvq4QzoQaGNcVpm6JfRJWQvvCLpfYO7W7lbF3g6bOHtveDY1v5N4NKdptBiEv3t1mABP8Kc1bGnF/rM7sj5X6/f64o1+LcIlMSLOjX3pyJoLVmX1HgxkS9yAlWFSCRSVYVCrBohIsKsGiUgkWlWBRCRaVSrCoBItKsKhUgkUlWFSCRaX69T8dsauhR7BBrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6NTQ6MjAtMDU6MDCVu+NGAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9UVU4uc3ZnyMywkAAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"222": {
|
||||
"admin": "Turkey",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAD1ElEQVR42u2cS0hUURzG7y6kiFqERLQQImhRQgQhuQgpiJAiaZVbd7UwJCkKCiXIiBZC0KIX5CIIJCMVioSQ2kptRCTKtJcTOWk5PWxs8W1OTE7njnPvnHPvb/Mher3MPec33/9xzj3B5JuqfPUqFC2vBml4yKnBtY0b55lswEIBC0UBCwUs1O88FbAoL3As1B98AQsFLBSwUMBiIFDAQgELBSyWclEcCwWsGNp979u3HNrR/7G5bmJPS6Zh/+XDtabq97omPY5b2pOWd3w8A+vDie1V9bnsxOnejr7c8ODco6cL+151TtTnN8+MZfuli6/zs4uBVL/RNd87hs48yX0Z6tzbNSXgCO6pdqzpgw27G5u+td2+f+daITqlqe4zP35vw4Mjn7Y19TSPgoLTYJXLA95drNm1dfXche7s1YfLh8n0s6Vc7Wvm5oqeWgVNsEigYylI/Vg/fP3Zi9IA0v8q5MmN5HkKo2Y2NrPy6K22c/JChcufrSMHnk/qr8CRELA0/b9ujPWOD4SFSXDoDqW5prwq23Xy7tlRZW+ESO/BkpeERUruEsX0myWCYAUUz8B62149sqlGDmGPlK6POh+S8yks6nOCizdgKROyR0otA6X2cfaEACvsiAWVTdJ/X5l+mVmwQUqBUkHKtaGME3Qc6z+qVoK9V32ua2k91ufmIJpNV5CqGFjKjVTe22dULnfJVZMqTEcdNH1ZLagAWPKeZHiVVM1VfdrZx5fWdO8sjoUCerKbsUFlp6G4ytXcnwDzidRXM5sgwkjNWC0iydvczBcjBCs6s9Wd7bvqmgb3B7Hwq6JSQ0HcLFCEnfse7Jljhc2uiocVF4rqsAtQKllI3iPpsNu3GBQ+XBgmpeTCSB15hTP7ZxF86emHBfH3rux3K7gAllAQTPZe62MJkibHGjh+/tQ61wKfuc0wrGMlqZVaPBd3OsdS4zF5OVYadq4G8U9G2KrQ/WkorAr15TE3Tye1Klxqduhj0cei8+4DWDbhm847a4UhwFr+WmGScq+gUg+s5meSdjew19SJbTOqp+x9i/1YgBX5DtL4sxN2kLLnnT3vgPV3WNRbN6W9pVPeLFABN9mZU9SFQqLeK5S7hB0y83ARc7mG11Z5E/ofb0ILEfmZ7mkqb0Kn9FAQ5TSc3QBYMZ02Y7+bwP60mdICKOo0WGGns3DjinIy04cKfzaXhJN6PpZrz+L9iX5qTgoUeVvhiX66Bk8CLBSwUBSwUP/AIoNBcSwUsFA/2xaAheJYtCUBC005+oAFCoCFAhYKWAwEClgoR0WSdAMWA4GWWf8AK7hyUfoyPfsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDktMDJUMjM6Mjk6MjAtMDQ6MDDXccruAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDExLTAyLTI4VDIyOjU0OjQ2LTA1OjAwMATf+wAAAFJ0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hai9Db2RlL3RtLW1hc3Rlci9leGFtcGxlcy9nZW9ncmFwaHktY2xhc3MvZmxhZ3MvVFVSLnN2Z23cyhMAAAAASUVORK5CYII="
|
||||
},
|
||||
"223": {
|
||||
"admin": "Taiwan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAADnUlEQVR42u2csUtVURyAD02BEMiDlgeBFIGLENTgGE0m5Wpbg5v/QKTREE4P20IQikDiTRIiDrYEhZhBPoeccpC2HIqmgggTvuUnt3vx+bxy3/Nz+Hicc+7vwLsf5/zu755nSkNp6NmSLOalFyk9WfzxOqXzf/bPpYM/WcykNEcXa/d+Sv2/lUaxFEuxFEuxSmW9VW+9/AgVS7FOjOO18dqbOlQsxWpjNSqWZq411/rchMXyneaqpliVFqs2WBt8/mh1bXXt6/vJ9cn1d3eyvduN7cb3e5CWOIariJDtVawzvRXONmebWw/2VvZWfl2ZqE/U316jfbgx3Fi8S/vfg7/9QVroZSTtRHArVKz/bGQoAmlBo7gV0kJvFG6kf6R/eU2xzpxYVweuDry6gRbZDYvejb6Nvm+XWXsQhTVpZn5m/tMFSAu9qMZV2eyKWZiR+IrVg2Jx45ujzdEvF8mW0AJRonZTY1NjH9YZE9ewSHoZGdUhWpyFz2Uk9YpVoa2QG7y8sLywewtFYl7FmpQnUx65KruZMkt5z4mKVbkcK+rFihLT8OMxrlVlK6VYlU7eufFsZORJnYhFuYFop1PNUqxKiEUqTSbEtkWGRBoen++ORyIQjcjMwoxIoFg9IhYysUmxokSBSK6zuVEnJFpM/JkxFmBPqoh6lsU63im0VEahgVtOKYGNj5tdhlhEjsWLuHq5YvVsjhW3RbgzvTP983onShEhxiz79Y5iVTR5ZxVhe6Km1YlYRCDa6ZyDUKzKiUXWRfbDSkPSXVwULS6WEoFoRC5bL8WqkFhRKUgmFN8MHr30wMj49jBeS/zsiQnF6imxuP2k0tzs+N4QxjIBnxGFdQjSQrWdVYrPMQ6RmYUZ45kIxeopsYorSfF4TNzI4hNltiWOL1anjEResbrg2Ex8pUOxAIFi+TSWQOllJFeVt+UpVheLxTu+qFR87RPT/Ngb9SKCYinWoTeGFAvyCpioA/MKsETwzLtiHcp+ioUgkYfFgnrmXbHafqIs48lOsfwl9FIZJxQUS7H8ib1iKZZUrA4fOxSrDbEeP0zp9mbk082Ubm5Vvz2PRxnf7hg++4/X2hCLLyv7leV9icXjT6q9W85Jylyx/AqkYknFkoolpWJJxZKKJaViScWSiiWlYknFkoolpWJJxZK99U/VFEu6YknFklKxpGJJxZJSsaRiScWSUrG6u4qtWFIqllQsqVhSKpZULJ/dFEvK9A8j9Yu4TFwBigAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMS0wNDowMHEGwVoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6NTU6MTEtMDU6MDBSgYQvAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9UV04uc3ZnhQQRmwAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"225": {
|
||||
"admin": "Uganda",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"226": {
|
||||
"admin": "Ukraine",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAAAxElEQVR42u3SsQmAQBBE0W1TjqvFCszNLUOwCzGzlTU1PjZRXvLyGX5EtLbvZLUuoLAoLArLERQWhUVhkcKisCgsUlgUFoVFCovCorBIYVFYFBYpLAqLwiKFRWFRWKSwKCwKixQWhUVhkaNhTdvRyWLnXNd+k7VG5rUEWWxknue3fU/6+pb/6AIKi8KisBxBYVFYFBYpLAqLwiKFRWFRWKSwKCwKixQWhUVhkcKisCgsUlgUFoVFCovCorBIYVFYFBY56APt8YgxrmbUbAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMi0wNDowMEDu28cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjI6NTU6NDctMDU6MDB5sb9xAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9VS1Iuc3Zn8neiTAAAAABJRU5ErkJggg=="
|
||||
},
|
||||
"228": {
|
||||
"admin": "United States of America",
|
||||
"flag_png": "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"
|
||||
},
|
||||
"229": {
|
||||
"admin": "Uzbekistan",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyEAIAAAB1xzWqAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACgklEQVR42u2azUtUURiHL7VoFX4EKuIHuIpwpTCIpITiQhDLoJa5y/4BoZVCIO5aBC0ciKJBHVy4EAZqkqYRpSQQbIhaWJIwfuQXWEllzLT4bS4cG3TuvXpv82weLnPmvnPnnIf3vOfcY1nXR17FPsCTZEXV8L2n3//z/+VW0OIzj5fj7eUPIsXTYV0jUEHTyc3S6O7N+ecfI2O1S0Xpvb47Mz9T8bpr462JsPOHa+ycrJoN30i92F2ImrJ2NMaa5pOivVXXuksRGObAiCV1kltr9dsHqeqd89/OaoDdfThpKmUlsb31fum73s8bopk77aIz4QZALA3wy/r06Nbm+u/9uV/drfGp6OtVLx5Ov/Wv/KfPc7eaOkKfiqWJL/snm8lmzGwB4bHF0hSjXCWx3MpV+RX7uVM9C4jAiKVp5dPlvcofq6LzIl3F9VDTwtel22Y01W1qNUVR/WRWUfqmMqsXlR/0UCxVV87F0sCr0Daj3QoluhYvPHzzfvhLyBRLwommWLpLERhmpsJDPveiFfqueNfUQ/EOfbHdkDtz5Nea+y42GgK5QXrp0cRgcl96aYNUepkrNVVOqqJMBY9eY5miqDynxirQVzq61qRpvmA5yqpQ8Y+7KlRMVoWBFOtkXkI7mUbhqVGTF4Tu0poua4n2lECTiYkrmbY++iE/WgeRlf70AITu0tKOFITuErEgYkHEgohFR0DEgogFEYuOgIgFEQsiFoSIBRELIhaE7onFAQ/oybEZHWfzD+2H7GBwe8xqePbkaugiLEzWnIu9bW7xIrKl0BC6S8SCiAURCyIWHQERCyIWRCw6AiJWodK+pYlYkIwFIWJBxIKIBSFiQT/zL1RgScNKvfJfAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIyLTA0OjAwQO7bxwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo1NzoxOS0wNTowMGWbGnUAAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1VaQi5zdmdaHeTwAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"235": {
|
||||
"admin": "Vietnam",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAACnUlEQVR42u2cTStEURjHDyXEICSUYqGk7MROaRZk62WtbCxsbNhZWbKULJRk5xPwAXwAO1NIykskJKUUi//maozuHedy731+m1+TGffl9JvzP/d5TuMKhd7eri4I/dIxBBCxIGJBxGIgIGJBxIKIBSFiQcSCiAUhYkHEgogFS/GsYvigc09kNBDLG2+Olxeb+0VGA7G88WXgcKo2/7SzP1mXZzQQy1sIvo/cnlY+iwQiYnkLwY+Hjy3XIBKIiOWBir+gWAQiYnkLwaBYb+uFqqocgYhYZfJqcL6mdSioVJB6l1FCrMh8zO0216+UEkvvMkqIFTkEFXmlxCIQEctzCBKIiBVLCBKIiBVLCBKIiPWNNL5CUFQxIkwgWpPPpX0lpC6eL4afq4rnrd+f/XX0aLt6V6/TXt93aZ+B7tzqeNNScRkzjdRd6I6YsRLBy5bpjbZ9fePTqJSuXHdBFCZ0DlMvLy1zmJ4rs7cCy+ziXWuUZOqlNVm2d0lk/Knwom9irH1Ay+EkKKUr0VXxVJiRiHyY2bzOnfz9HKYz6ux2ig7OZrumvLJCeZFns+1jtPJ+/pTv6eiOLyJ1ZJ2Fyrs53s+tLTTOxiGWjkxLx+jNx1f30pERy9xtqxQZ30JeR7bw9IdYX6i2SdyL92w0ZxArESFIIBoVS/EUPgSDVSi1X6L+r81AdIRg1MZL1EqYzUA0J1aY2lWYxkv4ZpE+g1gZL4qWCjL9PWr9KcyeMJuBaEis4l9h8Nt4+Tkirf3ig7Mcgtq55bfxEtwTZjkQnbUQFP9m/gjuCRPtdA+dnRD8r+2/wW3TdgLR2Wng/O9eKJ09S7vaEQsiFkQsCBELIhZELAgRCyIWRCwIEQsiFkQsCBELIhZELAgRCyIWTC0/Ae7yUNeiWB9uAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA5LTAyVDIzOjI5OjIzLTA0OjAw5pnQcwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wMi0yOFQyMjo1OTo0Ny0wNTowMGONX/8AAABSdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWovQ29kZS90bS1tYXN0ZXIvZXhhbXBsZXMvZ2VvZ3JhcGh5LWNsYXNzL2ZsYWdzL1ZOTS5zdmdx4ikxAAAAAElFTkSuQmCC"
|
||||
},
|
||||
"240": {
|
||||
"admin": "Yemen",
|
||||
"flag_png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABDEAIAAAC1uevOAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0T///////8JWPfcAAABBklEQVR42u3XwQnCMBxG8X+cQN1BXcQF3MwlPHlzjB46iivUgxehGGJNRMjvPfgubZGUh9AYx816v7O27oZX8KOdtumQhGWtsKywrLCsFZYVlu3ha1RYtknKwrL+saywrLC8CCssKywf3sLyIqywrLCssKwVlhWW7TWs50f4u0/x16vze+ZX8/d882z5PSWnWHb/p+dqfd5lv5s/b/lT2d+N+/l6ug3W1t2YgAYIC8KCsCAsQFgQFoQFCAvCgrAAYUFYEBYgLAgLwgKEBWFBWICw8LdhXY5kfSOtyPoKi8KisCgsUlgUFoVFCovCorBIYVFYFBYpLAqLwiKFRWFRWKSwKCx25QO7IGoQUExASwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMS0wOS0wMlQyMzoyOToyMy0wNDowMOaZ0HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTEtMDItMjhUMjM6MDI6MjEtMDU6MDCSE+1yAAAAUnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FqL0NvZGUvdG0tbWFzdGVyL2V4YW1wbGVzL2dlb2dyYXBoeS1jbGFzcy9mbGFncy9ZRU0uc3Zn7W2pGwAAAB10RVh0c3ZnOmRlc2NyaXB0aW9uAGZsYWcgb2YgWWVtZW5boPDjAAAAAElFTkSuQmCC"
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
test/browser/spec/ol/data/osm-0-0-0.png
Normal file
BIN
test/browser/spec/ol/data/osm-0-0-0.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.8 KiB |
1
test/browser/spec/ol/data/point.json
Normal file
1
test/browser/spec/ol/data/point.json
Normal file
@@ -0,0 +1 @@
|
||||
{"type":"FeatureCollection","features":[{"type":"Feature","id":"01","properties":{},"geometry":{"type":"Point","coordinates":[-87.359296,35.001181]}}]}
|
||||
1
test/browser/spec/ol/data/tilejson.json
Normal file
1
test/browser/spec/ol/data/tilejson.json
Normal file
File diff suppressed because one or more lines are too long
29
test/browser/spec/ol/data/utfgrid.json
Normal file
29
test/browser/spec/ol/data/utfgrid.json
Normal file
File diff suppressed because one or more lines are too long
35
test/browser/spec/ol/disposable.test.js
Normal file
35
test/browser/spec/ol/disposable.test.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import Disposable from '../../../../src/ol/Disposable.js';
|
||||
|
||||
describe('ol.Disposable', function () {
|
||||
describe('constructor', function () {
|
||||
it('creates an instance', function () {
|
||||
const disposable = new Disposable();
|
||||
expect(disposable).to.be.a(Disposable);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#disposed', function () {
|
||||
it('is initially false', function () {
|
||||
const disposable = new Disposable();
|
||||
expect(disposable.disposed).to.be(false);
|
||||
});
|
||||
|
||||
it('is true after a call to dispose', function () {
|
||||
const disposable = new Disposable();
|
||||
disposable.dispose();
|
||||
expect(disposable.disposed).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#dispose()', function () {
|
||||
it('calls disposeInternal only once', function () {
|
||||
const disposable = new Disposable();
|
||||
sinon.spy(disposable, 'disposeInternal');
|
||||
expect(disposable.disposeInternal.called).to.be(false);
|
||||
disposable.dispose();
|
||||
expect(disposable.disposeInternal.callCount).to.be(1);
|
||||
disposable.dispose();
|
||||
expect(disposable.disposeInternal.callCount).to.be(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
474
test/browser/spec/ol/dom/dom.test.js
Normal file
474
test/browser/spec/ol/dom/dom.test.js
Normal file
@@ -0,0 +1,474 @@
|
||||
import {
|
||||
createCanvasContext2D,
|
||||
outerHeight,
|
||||
outerWidth,
|
||||
replaceChildren,
|
||||
} from '../../../../../src/ol/dom.js';
|
||||
|
||||
describe('ol.dom', function () {
|
||||
describe('ol.dom.createCanvasContext2D', function () {
|
||||
// default values from
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas
|
||||
const defaultWidth = 300;
|
||||
const defaultHeight = 150;
|
||||
|
||||
it('returns a CanvasRenderingContext2D', function () {
|
||||
const ctx = createCanvasContext2D();
|
||||
expect(ctx).to.be.a(CanvasRenderingContext2D);
|
||||
expect(ctx.canvas).to.be.a(HTMLCanvasElement);
|
||||
expect(ctx.canvas.width).to.be(defaultWidth);
|
||||
expect(ctx.canvas.height).to.be(defaultHeight);
|
||||
});
|
||||
|
||||
it('has the desired width', function () {
|
||||
const ctx = createCanvasContext2D(42);
|
||||
expect(ctx).to.be.a(CanvasRenderingContext2D);
|
||||
expect(ctx.canvas).to.be.a(HTMLCanvasElement);
|
||||
expect(ctx.canvas.width).to.be(42);
|
||||
expect(ctx.canvas.height).to.be(defaultHeight);
|
||||
});
|
||||
|
||||
it('has the desired height', function () {
|
||||
const ctx = createCanvasContext2D(undefined, 42);
|
||||
expect(ctx).to.be.a(CanvasRenderingContext2D);
|
||||
expect(ctx.canvas).to.be.a(HTMLCanvasElement);
|
||||
expect(ctx.canvas.width).to.be(defaultWidth);
|
||||
expect(ctx.canvas.height).to.be(42);
|
||||
});
|
||||
|
||||
it('has the desired height and width', function () {
|
||||
const ctx = createCanvasContext2D(42, 42);
|
||||
expect(ctx).to.be.a(CanvasRenderingContext2D);
|
||||
expect(ctx.canvas).to.be.a(HTMLCanvasElement);
|
||||
expect(ctx.canvas.width).to.be(42);
|
||||
expect(ctx.canvas.height).to.be(42);
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.dom.outerWidth', function () {
|
||||
let element = null;
|
||||
beforeEach(function () {
|
||||
element = document.createElement('div');
|
||||
element.style.padding = 0;
|
||||
element.style.margin = 0;
|
||||
element.style.border = 'none';
|
||||
element.style.width = '10px';
|
||||
element.style.height = '10px';
|
||||
document.body.appendChild(element);
|
||||
});
|
||||
afterEach(function () {
|
||||
element.parentNode.removeChild(element);
|
||||
element = null;
|
||||
});
|
||||
|
||||
describe('without padding, margin or border', function () {
|
||||
it('calculates correctly', function () {
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(10);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingLeft = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with margin', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginLeft = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderRightWidth = '0';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding and margin', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
element.style.margin = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingLeft = '5px';
|
||||
element.style.marginLeft = '5px';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingLeft = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderRightWidth = '0';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with margin and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginLeft = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderRightWidth = '0';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding, margin and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
element.style.padding = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(40);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginLeft = '5px';
|
||||
element.style.paddingLeft = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderRightWidth = '0';
|
||||
const calcWidth = outerWidth(element);
|
||||
expect(calcWidth).to.be(25);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.dom.outerHeight', function () {
|
||||
let element = null;
|
||||
beforeEach(function () {
|
||||
element = document.createElement('div');
|
||||
element.style.padding = 0;
|
||||
element.style.margin = 0;
|
||||
element.style.border = 'none';
|
||||
element.style.width = '10px';
|
||||
element.style.height = '10px';
|
||||
document.body.appendChild(element);
|
||||
});
|
||||
afterEach(function () {
|
||||
element.parentNode.removeChild(element);
|
||||
element = null;
|
||||
});
|
||||
|
||||
describe('without padding, margin or border', function () {
|
||||
it('calculates correctly', function () {
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(10);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingTop = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with margin', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginTop = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderBottomWidth = '0';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(15);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding and margin', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
element.style.margin = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingTop = '5px';
|
||||
element.style.marginTop = '5px';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.padding = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.paddingTop = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderBottomWidth = '0';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with margin and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(30);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginTop = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderBottomWidth = '0';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with padding, margin and border', function () {
|
||||
it('calculates correctly (both sides)', function () {
|
||||
element.style.margin = '5px';
|
||||
element.style.padding = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(40);
|
||||
});
|
||||
|
||||
it('calculates correctly (one side)', function () {
|
||||
element.style.marginTop = '5px';
|
||||
element.style.paddingTop = '5px';
|
||||
element.style.border = '5px solid chocolate';
|
||||
element.style.borderBottomWidth = '0';
|
||||
const calcHeight = outerHeight(element);
|
||||
expect(calcHeight).to.be(25);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('replaceChildren()', function () {
|
||||
function assertChildrenMatch(parent, children) {
|
||||
const actual = parent.childNodes;
|
||||
expect(actual).to.have.length(children.length);
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
expect(actual[i]).to.be(children[i]);
|
||||
}
|
||||
}
|
||||
|
||||
it('adds new children to an empty parent', function () {
|
||||
const parent = document.createElement('div');
|
||||
const children = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
];
|
||||
|
||||
replaceChildren(parent, children);
|
||||
assertChildrenMatch(parent, children);
|
||||
});
|
||||
|
||||
it('removes children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
replaceChildren(parent, []);
|
||||
expect(parent.childNodes).to.have.length(0);
|
||||
});
|
||||
|
||||
it('swaps children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
const newChildren = [
|
||||
document.createElement('d'),
|
||||
document.createElement('e'),
|
||||
document.createElement('f'),
|
||||
];
|
||||
|
||||
replaceChildren(parent, newChildren);
|
||||
assertChildrenMatch(parent, newChildren);
|
||||
});
|
||||
|
||||
it('appends children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
const newChildren = [
|
||||
document.createElement('d'),
|
||||
document.createElement('e'),
|
||||
document.createElement('f'),
|
||||
];
|
||||
|
||||
const allChildren = existingChildren.concat(newChildren);
|
||||
|
||||
replaceChildren(parent, allChildren);
|
||||
assertChildrenMatch(parent, allChildren);
|
||||
});
|
||||
|
||||
it('prunes children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
document.createElement('d'),
|
||||
document.createElement('e'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
const desiredChildren = [existingChildren[1], existingChildren[3]];
|
||||
|
||||
replaceChildren(parent, desiredChildren);
|
||||
assertChildrenMatch(parent, desiredChildren);
|
||||
});
|
||||
|
||||
it('reorders children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
document.createElement('d'),
|
||||
document.createElement('e'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
const desiredChildren = [
|
||||
existingChildren[1],
|
||||
existingChildren[3],
|
||||
existingChildren[0],
|
||||
existingChildren[4],
|
||||
existingChildren[2],
|
||||
];
|
||||
|
||||
replaceChildren(parent, desiredChildren);
|
||||
assertChildrenMatch(parent, desiredChildren);
|
||||
});
|
||||
|
||||
it('reorders, prunes, and appends children', function () {
|
||||
const parent = document.createElement('div');
|
||||
const existingChildren = [
|
||||
document.createElement('a'),
|
||||
document.createElement('b'),
|
||||
document.createElement('c'),
|
||||
document.createElement('d'),
|
||||
document.createElement('e'),
|
||||
];
|
||||
existingChildren.forEach(function (child) {
|
||||
parent.appendChild(child);
|
||||
});
|
||||
|
||||
const desiredChildren = [
|
||||
document.createElement('f'),
|
||||
existingChildren[3],
|
||||
document.createElement('g'),
|
||||
existingChildren[0],
|
||||
existingChildren[2],
|
||||
];
|
||||
|
||||
const clone = desiredChildren.slice();
|
||||
|
||||
replaceChildren(parent, desiredChildren);
|
||||
assertChildrenMatch(parent, desiredChildren);
|
||||
|
||||
// confirm we haven't modified the input
|
||||
expect(desiredChildren).to.eql(clone);
|
||||
});
|
||||
});
|
||||
});
|
||||
94
test/browser/spec/ol/events.test.js
Normal file
94
test/browser/spec/ol/events.test.js
Normal file
@@ -0,0 +1,94 @@
|
||||
import EventTarget from '../../../../src/ol/events/Target.js';
|
||||
import {listen, listenOnce, unlistenByKey} from '../../../../src/ol/events.js';
|
||||
|
||||
describe('ol.events', function () {
|
||||
let add, target;
|
||||
|
||||
beforeEach(function () {
|
||||
target = new EventTarget();
|
||||
add = sinon.spy(target, 'addEventListener');
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
target.addEventListener.restore();
|
||||
});
|
||||
|
||||
describe('listen()', function () {
|
||||
it('calls addEventListener on the target', function () {
|
||||
listen(target, 'foo', function () {});
|
||||
expect(add.callCount).to.be(1);
|
||||
});
|
||||
it('returns a key', function () {
|
||||
const key = listen(target, 'foo', function () {});
|
||||
expect(key).to.be.a(Object);
|
||||
});
|
||||
it('does not add the same listener twice', function () {
|
||||
const listener = function () {};
|
||||
listen(target, 'foo', listener);
|
||||
listen(target, 'foo', listener);
|
||||
expect(target.listeners_['foo'].length).to.be(1);
|
||||
});
|
||||
it('only treats listeners as same when all args are equal', function () {
|
||||
const listener = function () {};
|
||||
listen(target, 'foo', listener, {});
|
||||
listen(target, 'foo', listener, {});
|
||||
listen(target, 'foo', listener, undefined);
|
||||
expect(target.listeners_['foo'].length).to.be(3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('listenOnce()', function () {
|
||||
it('creates a one-off listener', function () {
|
||||
const target = new EventTarget();
|
||||
const listener = sinon.spy();
|
||||
listenOnce(target, 'foo', listener);
|
||||
target.dispatchEvent('foo');
|
||||
expect(listener.callCount).to.be(1);
|
||||
target.dispatchEvent('foo');
|
||||
expect(listener.callCount).to.be(1);
|
||||
});
|
||||
it('Adds the same listener twice', function () {
|
||||
const listener = sinon.spy();
|
||||
listenOnce(target, 'foo', listener);
|
||||
listenOnce(target, 'foo', listener);
|
||||
target.dispatchEvent('foo');
|
||||
target.dispatchEvent('foo');
|
||||
target.dispatchEvent('foo');
|
||||
expect(listener.callCount).to.be(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('unlistenByKey()', function () {
|
||||
it('unregisters previously registered listeners', function () {
|
||||
const key = listen(target, 'foo', function () {});
|
||||
unlistenByKey(key);
|
||||
expect(target.listeners_['foo']).to.be(undefined);
|
||||
});
|
||||
it('works with multiple types', function () {
|
||||
const key = listen(target, ['foo', 'bar'], function () {});
|
||||
unlistenByKey(key);
|
||||
expect(target.listeners_['foo']).to.be(undefined);
|
||||
expect(target.listeners_['bar']).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Listener keys', function () {
|
||||
it('does not register duplicated listeners', function () {
|
||||
const target = new EventTarget();
|
||||
const listener = function () {};
|
||||
const key1 = listen(target, 'foo', listener);
|
||||
expect(target.listeners_['foo']).to.eql([listener]);
|
||||
const key2 = listen(target, 'foo', listener);
|
||||
expect(target.listeners_['foo']).to.eql([listener]);
|
||||
expect(key1.listener).to.equal(key2.listener);
|
||||
});
|
||||
it('registers multiple listeners if this object is different', function () {
|
||||
const target = new EventTarget();
|
||||
const listener = function () {};
|
||||
const key1 = listen(target, 'foo', listener, {});
|
||||
const key2 = listen(target, 'foo', listener, {});
|
||||
expect(key1.listener).to.not.equal(key2.listener);
|
||||
expect(target.listeners_['foo']).to.eql([key1.listener, key2.listener]);
|
||||
});
|
||||
});
|
||||
});
|
||||
49
test/browser/spec/ol/events/event.test.js
Normal file
49
test/browser/spec/ol/events/event.test.js
Normal file
@@ -0,0 +1,49 @@
|
||||
import Event, {
|
||||
preventDefault,
|
||||
stopPropagation,
|
||||
} from '../../../../../src/ol/events/Event.js';
|
||||
|
||||
describe('ol.events.Event', function () {
|
||||
describe('constructor', function () {
|
||||
it('takes a type as argument', function () {
|
||||
const event = new Event('foo');
|
||||
expect(event.type).to.be('foo');
|
||||
});
|
||||
it('does not set the propagationStopped flag', function () {
|
||||
const event = new Event('foo');
|
||||
expect(event.propagationStopped).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#preventDefault', function () {
|
||||
it('sets the defaultPrevented flag', function () {
|
||||
const event = new Event('foo');
|
||||
event.preventDefault();
|
||||
expect(event.defaultPrevented).to.be(true);
|
||||
});
|
||||
it('does the same as #stopPropagation', function () {
|
||||
const event = new Event('foo');
|
||||
expect(event.stopPropagation()).to.equal(event.preventDefault());
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.events.Event.preventDefault', function () {
|
||||
it('calls preventDefault on the event object', function () {
|
||||
const event = {
|
||||
preventDefault: sinon.spy(),
|
||||
};
|
||||
preventDefault(event);
|
||||
expect(event.preventDefault.called).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.events.Event.stopPropagation', function () {
|
||||
it('calls preventDefault on the event object', function () {
|
||||
const event = {
|
||||
stopPropagation: sinon.spy(),
|
||||
};
|
||||
stopPropagation(event);
|
||||
expect(event.stopPropagation.called).to.be(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
175
test/browser/spec/ol/events/eventtarget.test.js
Normal file
175
test/browser/spec/ol/events/eventtarget.test.js
Normal file
@@ -0,0 +1,175 @@
|
||||
import Disposable from '../../../../../src/ol/Disposable.js';
|
||||
import Event from '../../../../../src/ol/events/Event.js';
|
||||
import EventTarget from '../../../../../src/ol/events/Target.js';
|
||||
import {listen} from '../../../../../src/ol/events.js';
|
||||
|
||||
describe('ol.events.EventTarget', function () {
|
||||
let called, events, eventTarget, spy1, spy2, spy3;
|
||||
|
||||
beforeEach(function () {
|
||||
called = [];
|
||||
events = [];
|
||||
function spy(evt) {
|
||||
called.push(this.id);
|
||||
events.push(evt);
|
||||
}
|
||||
spy1 = spy.bind({id: 1});
|
||||
spy2 = spy.bind({id: 2});
|
||||
spy3 = spy.bind({id: 3});
|
||||
eventTarget = new EventTarget();
|
||||
});
|
||||
|
||||
describe('constructor', function () {
|
||||
it('creates an instance', function () {
|
||||
expect(eventTarget).to.be.a(EventTarget);
|
||||
expect(eventTarget).to.be.a(Disposable);
|
||||
});
|
||||
it('accepts a default target', function (done) {
|
||||
const defaultTarget = {};
|
||||
const target = new EventTarget(defaultTarget);
|
||||
target.addEventListener('my-event', function (event) {
|
||||
expect(event.target).to.eql(defaultTarget);
|
||||
done();
|
||||
});
|
||||
target.dispatchEvent('my-event');
|
||||
});
|
||||
it('does not initialize objects in advance', function () {
|
||||
expect(eventTarget.pendingRemovals_).to.be(null);
|
||||
expect(eventTarget.dispatching_).to.be(null);
|
||||
expect(eventTarget.listeners_).to.be(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#hasListener', function () {
|
||||
it('reports any listeners when called without argument', function () {
|
||||
expect(eventTarget.hasListener()).to.be(false);
|
||||
eventTarget.addEventListener('foo', function () {});
|
||||
expect(eventTarget.hasListener()).to.be(true);
|
||||
});
|
||||
it('reports listeners for the type passed as argument', function () {
|
||||
eventTarget.addEventListener('foo', function () {});
|
||||
expect(eventTarget.hasListener('foo')).to.be(true);
|
||||
expect(eventTarget.hasListener('bar')).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#addEventListener()', function () {
|
||||
it('has listeners for each registered type', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener('bar', spy2);
|
||||
expect(eventTarget.hasListener('foo')).to.be(true);
|
||||
expect(eventTarget.hasListener('bar')).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#removeEventListener()', function () {
|
||||
it('keeps the listeners registry clean', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.removeEventListener('foo', spy1);
|
||||
expect(eventTarget.hasListener('foo')).to.be(false);
|
||||
});
|
||||
it('removes added listeners from the listeners registry', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener('foo', spy2);
|
||||
eventTarget.removeEventListener('foo', spy1, false);
|
||||
expect(eventTarget.listeners_['foo']).to.have.length(1);
|
||||
});
|
||||
it('does not remove listeners when the specified listener is not found', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener('foo', spy2);
|
||||
eventTarget.removeEventListener('foo', undefined);
|
||||
eventTarget.removeEventListener('foo', spy2);
|
||||
eventTarget.removeEventListener('foo', spy2);
|
||||
expect(eventTarget.listeners_['foo']).to.eql([spy1]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#dispatchEvent()', function () {
|
||||
it('calls listeners in the correct order', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener('foo', spy2);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
expect(called).to.eql([1, 2]);
|
||||
});
|
||||
it('stops propagation when listeners return false', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener(
|
||||
'foo',
|
||||
function (evt) {
|
||||
spy2();
|
||||
return false;
|
||||
},
|
||||
false
|
||||
);
|
||||
eventTarget.addEventListener('foo', spy3);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
expect(called).to.eql([1, 2]);
|
||||
});
|
||||
it('stops propagation when listeners call stopPropagation()', function () {
|
||||
eventTarget.addEventListener('foo', function (evt) {
|
||||
spy2();
|
||||
evt.stopPropagation();
|
||||
});
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
expect(called).to.eql([2]);
|
||||
});
|
||||
it('passes a default ol.events.Event object to listeners', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
expect(events[0]).to.be.a(Event);
|
||||
expect(events[0].type).to.be('foo');
|
||||
expect(events[0].target).to.equal(eventTarget);
|
||||
});
|
||||
it('passes a custom event object with target to listeners', function () {
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
const event = {
|
||||
type: 'foo',
|
||||
};
|
||||
eventTarget.dispatchEvent(event);
|
||||
expect(events[0]).to.equal(event);
|
||||
expect(events[0].target).to.equal(eventTarget);
|
||||
});
|
||||
it('is safe to remove listeners in listeners', function () {
|
||||
eventTarget.addEventListener('foo', spy3);
|
||||
eventTarget.addEventListener('foo', function () {
|
||||
eventTarget.removeEventListener('foo', spy1);
|
||||
eventTarget.removeEventListener('foo', spy2);
|
||||
eventTarget.removeEventListener('foo', spy3);
|
||||
});
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
eventTarget.addEventListener('foo', spy2);
|
||||
expect(function () {
|
||||
eventTarget.dispatchEvent('foo');
|
||||
}).not.to.throwException();
|
||||
expect(called).to.eql([3]);
|
||||
expect(eventTarget.listeners_['foo']).to.have.length(1);
|
||||
});
|
||||
it('is safe to do weird things in listeners', function () {
|
||||
eventTarget.addEventListener('foo', spy2);
|
||||
eventTarget.addEventListener('foo', function weird(evt) {
|
||||
eventTarget.removeEventListener('foo', weird);
|
||||
eventTarget.removeEventListener('foo', spy1);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
eventTarget.removeEventListener('foo', spy2);
|
||||
eventTarget.dispatchEvent('foo');
|
||||
evt.preventDefault();
|
||||
});
|
||||
eventTarget.addEventListener('foo', spy1);
|
||||
expect(function () {
|
||||
eventTarget.dispatchEvent('foo');
|
||||
}).not.to.throwException();
|
||||
expect(called).to.eql([2, 2]);
|
||||
expect(eventTarget.listeners_['foo']).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#dispose()', function () {
|
||||
it('cleans up foreign references', function () {
|
||||
listen(eventTarget, 'foo', spy1, document);
|
||||
expect(eventTarget.hasListener('foo')).to.be(true);
|
||||
eventTarget.dispose();
|
||||
expect(eventTarget.hasListener('foo')).to.be(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
76
test/browser/spec/ol/expect.test.js
Normal file
76
test/browser/spec/ol/expect.test.js
Normal file
@@ -0,0 +1,76 @@
|
||||
describe('expect.js', function () {
|
||||
describe('roughlyEqual', function () {
|
||||
it('can tell the difference between 1 and 3', function () {
|
||||
expect(1).not.to.roughlyEqual(3, 1);
|
||||
});
|
||||
|
||||
it('really can tell the difference between 1 and 3', function () {
|
||||
expect(function () {
|
||||
expect(1).to.roughlyEqual(3, 0.5);
|
||||
}).to.throwException();
|
||||
});
|
||||
|
||||
it("thinks that 1 ain't so different from 2", function () {
|
||||
expect(1).to.roughlyEqual(2, 1);
|
||||
});
|
||||
|
||||
it('knows that, like, 1 and 2 would, like, totally dig each other', function () {
|
||||
expect(function () {
|
||||
expect(1).to.roughlyEqual(2, 1);
|
||||
}).not.to.throwException();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Test equality of XML documents - xmleql', function () {
|
||||
it('Test XML document with single root, different prefix', function () {
|
||||
const doc1 = '<bar:foo xmlns:bar="http://foo"></bar:foo>';
|
||||
const doc2 = '<foo xmlns="http://foo"></foo>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.xmleql(new DOMParser().parseFromString(doc2, 'application/xml'));
|
||||
});
|
||||
|
||||
it('Test XML document with single root, different prefix, prefix true', function () {
|
||||
const doc1 = '<bar:foo xmlns:bar="http://foo"></bar:foo>';
|
||||
const doc2 = '<foo xmlns="http://foo"></foo>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.not.xmleql(
|
||||
new DOMParser().parseFromString(doc2, 'application/xml'),
|
||||
{prefix: true}
|
||||
);
|
||||
});
|
||||
|
||||
it('Test XML document with different root', function () {
|
||||
const doc1 = '<foo></foo>';
|
||||
const doc2 = '<bar></bar>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.not.xmleql(new DOMParser().parseFromString(doc2, 'application/xml'));
|
||||
});
|
||||
|
||||
it('Test different number of attributes', function () {
|
||||
const doc1 = '<foo attr="bla"></foo>';
|
||||
const doc2 = '<foo></foo>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.not.xmleql(new DOMParser().parseFromString(doc2, 'application/xml'));
|
||||
});
|
||||
|
||||
it('Test different attribute value', function () {
|
||||
const doc1 = '<foo attr="bla"></foo>';
|
||||
const doc2 = '<foo attr="foo"></foo>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.not.xmleql(new DOMParser().parseFromString(doc2, 'application/xml'));
|
||||
});
|
||||
|
||||
it('Test different number of children', function () {
|
||||
const doc1 = '<foo><mynode></mynode></foo>';
|
||||
const doc2 = '<foo></foo>';
|
||||
expect(
|
||||
new DOMParser().parseFromString(doc1, 'application/xml')
|
||||
).to.not.xmleql(new DOMParser().parseFromString(doc2, 'application/xml'));
|
||||
});
|
||||
});
|
||||
});
|
||||
992
test/browser/spec/ol/extent.test.js
Normal file
992
test/browser/spec/ol/extent.test.js
Normal file
@@ -0,0 +1,992 @@
|
||||
import * as _ol_extent_ from '../../../../src/ol/extent.js';
|
||||
import {get, getTransform} from '../../../../src/ol/proj.js';
|
||||
import {register} from '../../../../src/ol/proj/proj4.js';
|
||||
|
||||
describe('ol.extent', function () {
|
||||
describe('buffer', function () {
|
||||
it('buffers an extent by some value', function () {
|
||||
const extent = [-10, -20, 10, 20];
|
||||
expect(_ol_extent_.buffer(extent, 15)).to.eql([-25, -35, 25, 35]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('clone', function () {
|
||||
it('creates a copy of an extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(1, 2, 3, 4);
|
||||
const clone = _ol_extent_.clone(extent);
|
||||
expect(_ol_extent_.equals(extent, clone)).to.be(true);
|
||||
|
||||
_ol_extent_.extendCoordinate(extent, [10, 20]);
|
||||
expect(_ol_extent_.equals(extent, clone)).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('closestSquaredDistanceXY', function () {
|
||||
it('returns correct result when x left of extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = -2;
|
||||
const y = 0;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
|
||||
it('returns correct result when x right of extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = 3;
|
||||
const y = 0;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
|
||||
it('returns correct result for other x values', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = 0.5;
|
||||
const y = 3;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
|
||||
it('returns correct result when y below extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = 0;
|
||||
const y = -2;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
|
||||
it('returns correct result when y above extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = 0;
|
||||
const y = 3;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
|
||||
it('returns correct result for other y values', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(0, 0, 1, 1);
|
||||
const x = 3;
|
||||
const y = 0.5;
|
||||
expect(_ol_extent_.closestSquaredDistanceXY(extent, x, y)).to.be(4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('createOrUpdateFromCoordinate', function () {
|
||||
it('works when no extent passed', function () {
|
||||
const coords = [0, 1];
|
||||
const expected = [0, 1, 0, 1];
|
||||
const got = _ol_extent_.createOrUpdateFromCoordinate(coords);
|
||||
expect(got).to.eql(expected);
|
||||
});
|
||||
|
||||
it('updates a passed extent', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(-4, -7, -3, -6);
|
||||
const coords = [0, 1];
|
||||
const expected = [0, 1, 0, 1];
|
||||
_ol_extent_.createOrUpdateFromCoordinate(coords, extent);
|
||||
expect(extent).to.eql(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('createOrUpdateFromCoordinates', function () {
|
||||
it('works when single coordinate and no extent passed', function () {
|
||||
const coords = [[0, 1]];
|
||||
const expected = [0, 1, 0, 1];
|
||||
const got = _ol_extent_.createOrUpdateFromCoordinates(coords);
|
||||
expect(got).to.eql(expected);
|
||||
});
|
||||
|
||||
it('changes the passed extent when single coordinate', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(-4, -7, -3, -6);
|
||||
const coords = [[0, 1]];
|
||||
const expected = [0, 1, 0, 1];
|
||||
_ol_extent_.createOrUpdateFromCoordinates(coords, extent);
|
||||
expect(extent).to.eql(expected);
|
||||
});
|
||||
|
||||
it('works when multiple coordinates and no extent passed', function () {
|
||||
const coords = [
|
||||
[0, 1],
|
||||
[2, 3],
|
||||
];
|
||||
const expected = [0, 1, 2, 3];
|
||||
const got = _ol_extent_.createOrUpdateFromCoordinates(coords);
|
||||
expect(got).to.eql(expected);
|
||||
});
|
||||
|
||||
it('changes the passed extent when multiple coordinates given', function () {
|
||||
const extent = _ol_extent_.createOrUpdate(-4, -7, -3, -6);
|
||||
const coords = [
|
||||
[0, 1],
|
||||
[-2, -1],
|
||||
];
|
||||
const expected = [-2, -1, 0, 1];
|
||||
_ol_extent_.createOrUpdateFromCoordinates(coords, extent);
|
||||
expect(extent).to.eql(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('createOrUpdateFromRings', function () {
|
||||
it('works when single ring and no extent passed', function () {
|
||||
const ring = [
|
||||
[0, 0],
|
||||
[0, 2],
|
||||
[2, 2],
|
||||
[2, 0],
|
||||
[0, 0],
|
||||
];
|
||||
const rings = [ring];
|
||||
const expected = [0, 0, 2, 2];
|
||||
const got = _ol_extent_.createOrUpdateFromRings(rings);
|
||||
expect(got).to.eql(expected);
|
||||
});
|
||||
|
||||
it('changes the passed extent when single ring given', function () {
|
||||
const ring = [
|
||||
[0, 0],
|
||||
[0, 2],
|
||||
[2, 2],
|
||||
[2, 0],
|
||||
[0, 0],
|
||||
];
|
||||
const rings = [ring];
|
||||
const extent = [1, 1, 4, 7];
|
||||
const expected = [0, 0, 2, 2];
|
||||
_ol_extent_.createOrUpdateFromRings(rings, extent);
|
||||
expect(extent).to.eql(expected);
|
||||
});
|
||||
|
||||
it('works when multiple rings and no extent passed', function () {
|
||||
const ring1 = [
|
||||
[0, 0],
|
||||
[0, 2],
|
||||
[2, 2],
|
||||
[2, 0],
|
||||
[0, 0],
|
||||
];
|
||||
const ring2 = [
|
||||
[1, 1],
|
||||
[1, 3],
|
||||
[3, 3],
|
||||
[3, 1],
|
||||
[1, 1],
|
||||
];
|
||||
const rings = [ring1, ring2];
|
||||
const expected = [0, 0, 3, 3];
|
||||
const got = _ol_extent_.createOrUpdateFromRings(rings);
|
||||
expect(got).to.eql(expected);
|
||||
});
|
||||
|
||||
it('changes the passed extent when multiple rings given', function () {
|
||||
const ring1 = [
|
||||
[0, 0],
|
||||
[0, 2],
|
||||
[2, 2],
|
||||
[2, 0],
|
||||
[0, 0],
|
||||
];
|
||||
const ring2 = [
|
||||
[1, 1],
|
||||
[1, 3],
|
||||
[3, 3],
|
||||
[3, 1],
|
||||
[1, 1],
|
||||
];
|
||||
const rings = [ring1, ring2];
|
||||
const extent = [1, 1, 4, 7];
|
||||
const expected = [0, 0, 3, 3];
|
||||
_ol_extent_.createOrUpdateFromRings(rings, extent);
|
||||
expect(extent).to.eql(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('forEachCorner', function () {
|
||||
let callbackFalse;
|
||||
let callbackTrue;
|
||||
beforeEach(function () {
|
||||
callbackFalse = sinon.spy(function () {
|
||||
return false;
|
||||
});
|
||||
callbackTrue = sinon.spy(function () {
|
||||
return true;
|
||||
});
|
||||
});
|
||||
|
||||
it('calls the passed callback for each corner', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
_ol_extent_.forEachCorner(extent, callbackFalse);
|
||||
expect(callbackFalse.callCount).to.be(4);
|
||||
});
|
||||
|
||||
it('calls the passed callback with each corner', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
_ol_extent_.forEachCorner(extent, callbackFalse);
|
||||
const firstCallFirstArg = callbackFalse.args[0][0];
|
||||
const secondCallFirstArg = callbackFalse.args[1][0];
|
||||
const thirdCallFirstArg = callbackFalse.args[2][0];
|
||||
const fourthCallFirstArg = callbackFalse.args[3][0];
|
||||
expect(firstCallFirstArg).to.eql([1, 2]); // bl
|
||||
expect(secondCallFirstArg).to.eql([3, 2]); // br
|
||||
expect(thirdCallFirstArg).to.eql([3, 4]); // tr
|
||||
expect(fourthCallFirstArg).to.eql([1, 4]); // tl
|
||||
});
|
||||
|
||||
it('calls a truthy callback only once', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
_ol_extent_.forEachCorner(extent, callbackTrue);
|
||||
expect(callbackTrue.callCount).to.be(1);
|
||||
});
|
||||
|
||||
it('ensures that any corner can cancel the callback execution', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
const bottomLeftSpy = sinon.spy(function (corner) {
|
||||
return corner[0] === 1 && corner[1] === 2 ? true : false;
|
||||
});
|
||||
const bottomRightSpy = sinon.spy(function (corner) {
|
||||
return corner[0] === 3 && corner[1] === 2 ? true : false;
|
||||
});
|
||||
const topRightSpy = sinon.spy(function (corner) {
|
||||
return corner[0] === 3 && corner[1] === 4 ? true : false;
|
||||
});
|
||||
const topLeftSpy = sinon.spy(function (corner) {
|
||||
return corner[0] === 1 && corner[1] === 4 ? true : false;
|
||||
});
|
||||
|
||||
_ol_extent_.forEachCorner(extent, bottomLeftSpy);
|
||||
_ol_extent_.forEachCorner(extent, bottomRightSpy);
|
||||
_ol_extent_.forEachCorner(extent, topRightSpy);
|
||||
_ol_extent_.forEachCorner(extent, topLeftSpy);
|
||||
|
||||
expect(bottomLeftSpy.callCount).to.be(1);
|
||||
expect(bottomRightSpy.callCount).to.be(2);
|
||||
expect(topRightSpy.callCount).to.be(3);
|
||||
expect(topLeftSpy.callCount).to.be(4);
|
||||
});
|
||||
|
||||
it('returns false eventually, if no invocation returned a truthy value', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
const spy = sinon.spy(); // will return undefined for each corner
|
||||
const got = _ol_extent_.forEachCorner(extent, spy);
|
||||
expect(spy.callCount).to.be(4);
|
||||
expect(got).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getArea', function () {
|
||||
it('returns zero for empty extents', function () {
|
||||
const emptyExtent = _ol_extent_.createEmpty();
|
||||
const areaEmpty = _ol_extent_.getArea(emptyExtent);
|
||||
expect(areaEmpty).to.be(0);
|
||||
|
||||
const extentDeltaXZero = [45, 67, 45, 78];
|
||||
const areaDeltaXZero = _ol_extent_.getArea(extentDeltaXZero);
|
||||
expect(areaDeltaXZero).to.be(0);
|
||||
|
||||
const extentDeltaYZero = [11, 67, 45, 67];
|
||||
const areaDeltaYZero = _ol_extent_.getArea(extentDeltaYZero);
|
||||
expect(areaDeltaYZero).to.be(0);
|
||||
});
|
||||
it('calculates correct area for other extents', function () {
|
||||
const extent = [0, 0, 10, 10];
|
||||
const area = _ol_extent_.getArea(extent);
|
||||
expect(area).to.be(100);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getIntersection()', function () {
|
||||
it('returns the intersection of two extents', function () {
|
||||
const world = [-180, -90, 180, 90];
|
||||
const north = [-180, 0, 180, 90];
|
||||
const farNorth = [-180, 45, 180, 90];
|
||||
const east = [0, -90, 180, 90];
|
||||
const farEast = [90, -90, 180, 90];
|
||||
const south = [-180, -90, 180, 0];
|
||||
const farSouth = [-180, -90, 180, -45];
|
||||
const west = [-180, -90, 0, 90];
|
||||
const farWest = [-180, -90, -90, 90];
|
||||
const none = _ol_extent_.createEmpty();
|
||||
expect(_ol_extent_.getIntersection(world, none)).to.eql(none);
|
||||
expect(_ol_extent_.getIntersection(world, north)).to.eql(north);
|
||||
expect(_ol_extent_.getIntersection(world, east)).to.eql(east);
|
||||
expect(_ol_extent_.getIntersection(world, south)).to.eql(south);
|
||||
expect(_ol_extent_.getIntersection(world, west)).to.eql(west);
|
||||
expect(_ol_extent_.getIntersection(farEast, farWest)).to.eql(none);
|
||||
expect(_ol_extent_.getIntersection(farNorth, farSouth)).to.eql(none);
|
||||
expect(_ol_extent_.getIntersection(north, west)).to.eql([-180, 0, 0, 90]);
|
||||
expect(_ol_extent_.getIntersection(east, south)).to.eql([0, -90, 180, 0]);
|
||||
});
|
||||
|
||||
it('can take an destination extent', function () {
|
||||
const world = [-180, -90, 180, 90];
|
||||
const north = [-180, 0, 180, 90];
|
||||
const none = _ol_extent_.createEmpty();
|
||||
let tmpExtent = [-180, 45, 180, 90];
|
||||
expect(_ol_extent_.getIntersection(world, north, tmpExtent)).to.eql(
|
||||
north
|
||||
);
|
||||
expect(_ol_extent_.getIntersection(world, none, tmpExtent)).to.eql(none);
|
||||
|
||||
tmpExtent = [-180, -90, 180, 90];
|
||||
expect(_ol_extent_.getIntersection(tmpExtent, north, tmpExtent)).to.eql(
|
||||
north
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('containsCoordinate', function () {
|
||||
describe('positive', function () {
|
||||
it('returns true', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
expect(_ol_extent_.containsCoordinate(extent, [1, 2])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [1, 3])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [1, 4])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [2, 2])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [2, 3])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [2, 4])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [3, 2])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [3, 3])).to.be.ok();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [3, 4])).to.be.ok();
|
||||
});
|
||||
});
|
||||
|
||||
describe('negative', function () {
|
||||
it('returns false', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
expect(_ol_extent_.containsCoordinate(extent, [0, 1])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [0, 2])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [0, 3])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [0, 4])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [0, 5])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [1, 1])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [1, 5])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [2, 1])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [2, 5])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [3, 1])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [3, 5])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [4, 1])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [4, 2])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [4, 3])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [4, 4])).to.not.be();
|
||||
expect(_ol_extent_.containsCoordinate(extent, [4, 5])).to.not.be();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('coordinateRelationship()', function () {
|
||||
const extent = [-180, -90, 180, 90];
|
||||
const INTERSECTING = 1;
|
||||
const ABOVE = 2;
|
||||
const RIGHT = 4;
|
||||
const BELOW = 8;
|
||||
const LEFT = 16;
|
||||
|
||||
it('returns intersecting for within', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [0, 0]);
|
||||
expect(rel).to.be(INTERSECTING);
|
||||
});
|
||||
|
||||
it('returns intersecting for touching top', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [0, 90]);
|
||||
expect(rel).to.be(INTERSECTING);
|
||||
});
|
||||
|
||||
it('returns intersecting for touching right', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [180, 0]);
|
||||
expect(rel).to.be(INTERSECTING);
|
||||
});
|
||||
|
||||
it('returns intersecting for touching bottom', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [0, -90]);
|
||||
expect(rel).to.be(INTERSECTING);
|
||||
});
|
||||
|
||||
it('returns intersecting for touching left', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [-180, 0]);
|
||||
expect(rel).to.be(INTERSECTING);
|
||||
});
|
||||
|
||||
it('above for north', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [0, 100]);
|
||||
expect(rel).to.be(ABOVE);
|
||||
});
|
||||
|
||||
it('above and right for northeast', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [190, 100]);
|
||||
expect(rel & ABOVE).to.be(ABOVE);
|
||||
expect(rel & RIGHT).to.be(RIGHT);
|
||||
});
|
||||
|
||||
it('right for east', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [190, 0]);
|
||||
expect(rel).to.be(RIGHT);
|
||||
});
|
||||
|
||||
it('below and right for southeast', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [190, -100]);
|
||||
expect(rel & BELOW).to.be(BELOW);
|
||||
expect(rel & RIGHT).to.be(RIGHT);
|
||||
});
|
||||
|
||||
it('below for south', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [0, -100]);
|
||||
expect(rel).to.be(BELOW);
|
||||
});
|
||||
|
||||
it('below and left for southwest', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [-190, -100]);
|
||||
expect(rel & BELOW).to.be(BELOW);
|
||||
expect(rel & LEFT).to.be(LEFT);
|
||||
});
|
||||
|
||||
it('left for west', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [-190, 0]);
|
||||
expect(rel).to.be(LEFT);
|
||||
});
|
||||
|
||||
it('above and left for northwest', function () {
|
||||
const rel = _ol_extent_.coordinateRelationship(extent, [-190, 100]);
|
||||
expect(rel & ABOVE).to.be(ABOVE);
|
||||
expect(rel & LEFT).to.be(LEFT);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getCenter', function () {
|
||||
it('returns the expected center', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
const center = _ol_extent_.getCenter(extent);
|
||||
expect(center[0]).to.eql(2);
|
||||
expect(center[1]).to.eql(3);
|
||||
});
|
||||
it('returns [NaN, NaN] for empty extents', function () {
|
||||
const extent = _ol_extent_.createEmpty();
|
||||
const center = _ol_extent_.getCenter(extent);
|
||||
expect('' + center[0]).to.be('NaN');
|
||||
expect('' + center[1]).to.be('NaN');
|
||||
});
|
||||
});
|
||||
|
||||
describe('getCorner', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
|
||||
it('gets the bottom left', function () {
|
||||
const corner = 'bottom-left';
|
||||
expect(_ol_extent_.getCorner(extent, corner)).to.eql([1, 2]);
|
||||
});
|
||||
|
||||
it('gets the bottom right', function () {
|
||||
const corner = 'bottom-right';
|
||||
expect(_ol_extent_.getCorner(extent, corner)).to.eql([3, 2]);
|
||||
});
|
||||
|
||||
it('gets the top left', function () {
|
||||
const corner = 'top-left';
|
||||
expect(_ol_extent_.getCorner(extent, corner)).to.eql([1, 4]);
|
||||
});
|
||||
|
||||
it('gets the top right', function () {
|
||||
const corner = 'top-right';
|
||||
expect(_ol_extent_.getCorner(extent, corner)).to.eql([3, 4]);
|
||||
});
|
||||
|
||||
it('throws exception for unexpected corner', function () {
|
||||
expect(function () {
|
||||
_ol_extent_.getCorner(extent, 'foobar');
|
||||
}).to.throwException();
|
||||
});
|
||||
});
|
||||
|
||||
describe('getEnlargedArea', function () {
|
||||
it('returns enlarged area of two extents', function () {
|
||||
const extent1 = [-1, -1, 0, 0];
|
||||
const extent2 = [0, 0, 1, 1];
|
||||
const enlargedArea = _ol_extent_.getEnlargedArea(extent1, extent2);
|
||||
expect(enlargedArea).to.be(4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getForViewAndSize', function () {
|
||||
it('works for a unit square', function () {
|
||||
const extent = _ol_extent_.getForViewAndSize([0, 0], 1, 0, [1, 1]);
|
||||
expect(extent[0]).to.be(-0.5);
|
||||
expect(extent[2]).to.be(0.5);
|
||||
expect(extent[1]).to.be(-0.5);
|
||||
expect(extent[3]).to.be(0.5);
|
||||
});
|
||||
|
||||
it('works for center', function () {
|
||||
const extent = _ol_extent_.getForViewAndSize([5, 10], 1, 0, [1, 1]);
|
||||
expect(extent[0]).to.be(4.5);
|
||||
expect(extent[2]).to.be(5.5);
|
||||
expect(extent[1]).to.be(9.5);
|
||||
expect(extent[3]).to.be(10.5);
|
||||
});
|
||||
|
||||
it('works for rotation', function () {
|
||||
const extent = _ol_extent_.getForViewAndSize([0, 0], 1, Math.PI / 4, [
|
||||
1,
|
||||
1,
|
||||
]);
|
||||
expect(extent[0]).to.roughlyEqual(-Math.sqrt(0.5), 1e-9);
|
||||
expect(extent[2]).to.roughlyEqual(Math.sqrt(0.5), 1e-9);
|
||||
expect(extent[1]).to.roughlyEqual(-Math.sqrt(0.5), 1e-9);
|
||||
expect(extent[3]).to.roughlyEqual(Math.sqrt(0.5), 1e-9);
|
||||
});
|
||||
|
||||
it('works for resolution', function () {
|
||||
const extent = _ol_extent_.getForViewAndSize([0, 0], 2, 0, [1, 1]);
|
||||
expect(extent[0]).to.be(-1);
|
||||
expect(extent[2]).to.be(1);
|
||||
expect(extent[1]).to.be(-1);
|
||||
expect(extent[3]).to.be(1);
|
||||
});
|
||||
|
||||
it('works for size', function () {
|
||||
const extent = _ol_extent_.getForViewAndSize([0, 0], 1, 0, [10, 5]);
|
||||
expect(extent[0]).to.be(-5);
|
||||
expect(extent[2]).to.be(5);
|
||||
expect(extent[1]).to.be(-2.5);
|
||||
expect(extent[3]).to.be(2.5);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getSize', function () {
|
||||
it('returns the expected size', function () {
|
||||
const extent = [0, 1, 2, 4];
|
||||
const size = _ol_extent_.getSize(extent);
|
||||
expect(size).to.eql([2, 3]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getIntersectionArea', function () {
|
||||
it('returns correct area when extents intersect', function () {
|
||||
const extent1 = [0, 0, 2, 2];
|
||||
const extent2 = [1, 1, 3, 3];
|
||||
const intersectionArea = _ol_extent_.getIntersectionArea(
|
||||
extent1,
|
||||
extent2
|
||||
);
|
||||
expect(intersectionArea).to.be(1);
|
||||
});
|
||||
it('returns 0 when extents do not intersect', function () {
|
||||
const extent1 = [0, 0, 1, 1];
|
||||
const extent2 = [2, 2, 3, 3];
|
||||
const intersectionArea = _ol_extent_.getIntersectionArea(
|
||||
extent1,
|
||||
extent2
|
||||
);
|
||||
expect(intersectionArea).to.be(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getMargin', function () {
|
||||
it('returns the correct margin (sum of width and height)', function () {
|
||||
const extent = [1, 2, 3, 4];
|
||||
expect(_ol_extent_.getMargin(extent)).to.be(4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('intersects', function () {
|
||||
it('returns the expected value', function () {
|
||||
const intersects = _ol_extent_.intersects;
|
||||
const extent = [50, 50, 100, 100];
|
||||
expect(intersects(extent, extent)).to.be(true);
|
||||
expect(intersects(extent, [20, 20, 80, 80])).to.be(true);
|
||||
expect(intersects(extent, [20, 50, 80, 100])).to.be(true);
|
||||
expect(intersects(extent, [20, 80, 80, 120])).to.be(true);
|
||||
expect(intersects(extent, [50, 20, 100, 80])).to.be(true);
|
||||
expect(intersects(extent, [50, 80, 100, 120])).to.be(true);
|
||||
expect(intersects(extent, [80, 20, 120, 80])).to.be(true);
|
||||
expect(intersects(extent, [80, 50, 120, 100])).to.be(true);
|
||||
expect(intersects(extent, [80, 80, 120, 120])).to.be(true);
|
||||
expect(intersects(extent, [20, 20, 120, 120])).to.be(true);
|
||||
expect(intersects(extent, [70, 70, 80, 80])).to.be(true);
|
||||
expect(intersects(extent, [10, 10, 30, 30])).to.be(false);
|
||||
expect(intersects(extent, [30, 10, 70, 30])).to.be(false);
|
||||
expect(intersects(extent, [50, 10, 100, 30])).to.be(false);
|
||||
expect(intersects(extent, [80, 10, 120, 30])).to.be(false);
|
||||
expect(intersects(extent, [120, 10, 140, 30])).to.be(false);
|
||||
expect(intersects(extent, [10, 30, 30, 70])).to.be(false);
|
||||
expect(intersects(extent, [120, 30, 140, 70])).to.be(false);
|
||||
expect(intersects(extent, [10, 50, 30, 100])).to.be(false);
|
||||
expect(intersects(extent, [120, 50, 140, 100])).to.be(false);
|
||||
expect(intersects(extent, [10, 80, 30, 120])).to.be(false);
|
||||
expect(intersects(extent, [120, 80, 140, 120])).to.be(false);
|
||||
expect(intersects(extent, [10, 120, 30, 140])).to.be(false);
|
||||
expect(intersects(extent, [30, 120, 70, 140])).to.be(false);
|
||||
expect(intersects(extent, [50, 120, 100, 140])).to.be(false);
|
||||
expect(intersects(extent, [80, 120, 120, 140])).to.be(false);
|
||||
expect(intersects(extent, [120, 120, 140, 140])).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('scaleFromCenter', function () {
|
||||
it('scales the extent from its center', function () {
|
||||
const extent = [1, 1, 3, 3];
|
||||
_ol_extent_.scaleFromCenter(extent, 2);
|
||||
expect(extent[0]).to.eql(0);
|
||||
expect(extent[2]).to.eql(4);
|
||||
expect(extent[1]).to.eql(0);
|
||||
expect(extent[3]).to.eql(4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('intersectsSegment()', function () {
|
||||
const extent = [-180, -90, 180, 90];
|
||||
const north = [0, 100];
|
||||
const northeast = [190, 100];
|
||||
const east = [190, 0];
|
||||
const southeast = [190, -100];
|
||||
const south = [0, -100];
|
||||
const southwest = [-190, -100];
|
||||
const west = [-190, 0];
|
||||
const northwest = [-190, 100];
|
||||
const center = [0, 0];
|
||||
const top = [0, 90];
|
||||
const right = [180, 0];
|
||||
const bottom = [-90, 0];
|
||||
const left = [-180, 0];
|
||||
const inside = [10, 10];
|
||||
|
||||
it('returns true if contained', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, inside);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses top', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, north);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses right', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, east);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses bottom', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, south);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses left', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, west);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns false if above', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(
|
||||
extent,
|
||||
northwest,
|
||||
north
|
||||
);
|
||||
expect(intersects).to.be(false);
|
||||
});
|
||||
|
||||
it('returns false if right', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, northeast, east);
|
||||
expect(intersects).to.be(false);
|
||||
});
|
||||
|
||||
it('returns false if below', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(
|
||||
extent,
|
||||
south,
|
||||
southwest
|
||||
);
|
||||
expect(intersects).to.be(false);
|
||||
});
|
||||
|
||||
it('returns false if left', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, west, southwest);
|
||||
expect(intersects).to.be(false);
|
||||
});
|
||||
|
||||
it('returns true if crosses top to bottom', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, north, south);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses bottom to top', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, south, north);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses left to right', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, west, east);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses right to left', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, east, west);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses northwest to east', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, northwest, east);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if crosses south to west', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, south, west);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if touches top', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, northwest, top);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if touches right', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(
|
||||
extent,
|
||||
southeast,
|
||||
right
|
||||
);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if touches bottom', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, bottom, south);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('returns true if touches left', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, left, west);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('works for zero length inside', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, center, center);
|
||||
expect(intersects).to.be(true);
|
||||
});
|
||||
|
||||
it('works for zero length outside', function () {
|
||||
const intersects = _ol_extent_.intersectsSegment(extent, north, north);
|
||||
expect(intersects).to.be(false);
|
||||
});
|
||||
|
||||
it('works for left/right intersection spanning top to bottom', function () {
|
||||
const extent = [2, 1, 3, 4];
|
||||
const start = [0, 0];
|
||||
const end = [5, 5];
|
||||
expect(_ol_extent_.intersectsSegment(extent, start, end)).to.be(true);
|
||||
expect(_ol_extent_.intersectsSegment(extent, end, start)).to.be(true);
|
||||
});
|
||||
|
||||
it('works for top/bottom intersection spanning left to right', function () {
|
||||
const extent = [1, 2, 4, 3];
|
||||
const start = [0, 0];
|
||||
const end = [5, 5];
|
||||
expect(_ol_extent_.intersectsSegment(extent, start, end)).to.be(true);
|
||||
expect(_ol_extent_.intersectsSegment(extent, end, start)).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#applyTransform()', function () {
|
||||
it('does transform', function () {
|
||||
const transformFn = getTransform('EPSG:4326', 'EPSG:3857');
|
||||
const sourceExtent = [-15, -30, 45, 60];
|
||||
const destinationExtent = _ol_extent_.applyTransform(
|
||||
sourceExtent,
|
||||
transformFn
|
||||
);
|
||||
expect(destinationExtent).not.to.be(undefined);
|
||||
expect(destinationExtent).not.to.be(null);
|
||||
// FIXME check values with third-party tool
|
||||
expect(destinationExtent[0]).to.roughlyEqual(-1669792.3618991037, 1e-9);
|
||||
expect(destinationExtent[2]).to.roughlyEqual(5009377.085697311, 1e-9);
|
||||
expect(destinationExtent[1]).to.roughlyEqual(-3503549.843504376, 1e-8);
|
||||
expect(destinationExtent[3]).to.roughlyEqual(8399737.889818361, 1e-8);
|
||||
});
|
||||
|
||||
it('takes arbitrary function', function () {
|
||||
const transformFn = function (input, output, opt_dimension) {
|
||||
const dimension = opt_dimension !== undefined ? opt_dimension : 2;
|
||||
if (output === undefined) {
|
||||
output = new Array(input.length);
|
||||
}
|
||||
const n = input.length;
|
||||
let i;
|
||||
for (i = 0; i < n; i += dimension) {
|
||||
output[i] = -input[i];
|
||||
output[i + 1] = -input[i + 1];
|
||||
}
|
||||
return output;
|
||||
};
|
||||
const sourceExtent = [-15, -30, 45, 60];
|
||||
const destinationExtent = _ol_extent_.applyTransform(
|
||||
sourceExtent,
|
||||
transformFn
|
||||
);
|
||||
expect(destinationExtent).not.to.be(undefined);
|
||||
expect(destinationExtent).not.to.be(null);
|
||||
expect(destinationExtent[0]).to.be(-45);
|
||||
expect(destinationExtent[2]).to.be(15);
|
||||
expect(destinationExtent[1]).to.be(-60);
|
||||
expect(destinationExtent[3]).to.be(30);
|
||||
});
|
||||
|
||||
it('can use the stops option', function () {
|
||||
proj4.defs(
|
||||
'EPSG:32632',
|
||||
'+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs'
|
||||
);
|
||||
register(proj4);
|
||||
const transformFn = getTransform('EPSG:4326', 'EPSG:32632');
|
||||
const sourceExtentN = [6, 0, 12, 84];
|
||||
const destinationExtentN = _ol_extent_.applyTransform(
|
||||
sourceExtentN,
|
||||
transformFn
|
||||
);
|
||||
expect(destinationExtentN).not.to.be(undefined);
|
||||
expect(destinationExtentN).not.to.be(null);
|
||||
expect(destinationExtentN[0]).to.roughlyEqual(166021.44308053964, 1e-8);
|
||||
expect(destinationExtentN[2]).to.roughlyEqual(833978.5569194605, 1e-8);
|
||||
expect(destinationExtentN[1]).to.roughlyEqual(0, 1e-8);
|
||||
expect(destinationExtentN[3]).to.roughlyEqual(9329005.182447437, 1e-8);
|
||||
const sourceExtentNS = [6, -84, 12, 84];
|
||||
const destinationExtentNS = _ol_extent_.applyTransform(
|
||||
sourceExtentNS,
|
||||
transformFn
|
||||
);
|
||||
expect(destinationExtentNS).not.to.be(undefined);
|
||||
expect(destinationExtentNS).not.to.be(null);
|
||||
expect(destinationExtentNS[0]).to.roughlyEqual(465005.34493886377, 1e-8);
|
||||
expect(destinationExtentNS[2]).to.roughlyEqual(534994.6550611362, 1e-8);
|
||||
expect(destinationExtentNS[1]).to.roughlyEqual(
|
||||
-destinationExtentN[3],
|
||||
1e-8
|
||||
);
|
||||
expect(destinationExtentNS[3]).to.roughlyEqual(
|
||||
destinationExtentN[3],
|
||||
1e-8
|
||||
);
|
||||
const destinationExtentNS2 = _ol_extent_.applyTransform(
|
||||
sourceExtentNS,
|
||||
transformFn,
|
||||
undefined,
|
||||
2
|
||||
);
|
||||
expect(destinationExtentNS2).not.to.be(undefined);
|
||||
expect(destinationExtentNS2).not.to.be(null);
|
||||
expect(destinationExtentNS2[0]).to.roughlyEqual(
|
||||
destinationExtentN[0],
|
||||
1e-8
|
||||
);
|
||||
expect(destinationExtentNS2[2]).to.roughlyEqual(
|
||||
destinationExtentN[2],
|
||||
1e-8
|
||||
);
|
||||
expect(destinationExtentNS2[1]).to.roughlyEqual(
|
||||
-destinationExtentN[3],
|
||||
1e-8
|
||||
);
|
||||
expect(destinationExtentNS2[3]).to.roughlyEqual(
|
||||
destinationExtentN[3],
|
||||
1e-8
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('wrapX()', function () {
|
||||
const projection = get('EPSG:4326');
|
||||
|
||||
it('leaves real world extent untouched', function () {
|
||||
expect(_ol_extent_.wrapX([16, 48, 18, 49], projection)).to.eql([
|
||||
16,
|
||||
48,
|
||||
18,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('moves left world extent to real world', function () {
|
||||
expect(_ol_extent_.wrapX([-344, 48, -342, 49], projection)).to.eql([
|
||||
16,
|
||||
48,
|
||||
18,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('moves right world extent to real world', function () {
|
||||
expect(_ol_extent_.wrapX([376, 48, 378, 49], projection)).to.eql([
|
||||
16,
|
||||
48,
|
||||
18,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('moves far off left extent to real world', function () {
|
||||
expect(_ol_extent_.wrapX([-1064, 48, -1062, 49], projection)).to.eql([
|
||||
16,
|
||||
48,
|
||||
18,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('moves far off right extent to real world', function () {
|
||||
expect(_ol_extent_.wrapX([1096, 48, 1098, 49], projection)).to.eql([
|
||||
16,
|
||||
48,
|
||||
18,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('leaves -180 crossing extent with real world center untouched', function () {
|
||||
expect(_ol_extent_.wrapX([-184, 48, 16, 49], projection)).to.eql([
|
||||
-184,
|
||||
48,
|
||||
16,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('moves +180 crossing extent with off-world center to the real world', function () {
|
||||
expect(_ol_extent_.wrapX([300, 48, 376, 49], projection)).to.eql([
|
||||
-60,
|
||||
48,
|
||||
16,
|
||||
49,
|
||||
]);
|
||||
});
|
||||
|
||||
it('produces the same real world extent for shifted extents with center at +/-180', function () {
|
||||
expect(_ol_extent_.wrapX([360, -90, 720, 90], projection)).to.eql([
|
||||
-360,
|
||||
-90,
|
||||
0,
|
||||
90,
|
||||
]);
|
||||
expect(_ol_extent_.wrapX([0, -90, 360, 90], projection)).to.eql([
|
||||
-360,
|
||||
-90,
|
||||
0,
|
||||
90,
|
||||
]);
|
||||
expect(_ol_extent_.wrapX([-360, -90, 0, 90], projection)).to.eql([
|
||||
-360,
|
||||
-90,
|
||||
0,
|
||||
90,
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('approximatelyEquals', function () {
|
||||
it('returns true when within tolerance', function () {
|
||||
expect(
|
||||
_ol_extent_.approximatelyEquals(
|
||||
[16, 48, 17, 49],
|
||||
[16.09, 48, 17, 49],
|
||||
0.1
|
||||
)
|
||||
).to.be(true);
|
||||
});
|
||||
it('returns false when not within tolerance', function () {
|
||||
expect(
|
||||
_ol_extent_.approximatelyEquals(
|
||||
[16, 48, 17, 49],
|
||||
[16.11, 48, 17, 49],
|
||||
0.1
|
||||
)
|
||||
).to.be(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
434
test/browser/spec/ol/feature.test.js
Normal file
434
test/browser/spec/ol/feature.test.js
Normal file
@@ -0,0 +1,434 @@
|
||||
import Feature, {createStyleFunction} from '../../../../src/ol/Feature.js';
|
||||
import Point from '../../../../src/ol/geom/Point.js';
|
||||
import Style from '../../../../src/ol/style/Style.js';
|
||||
import {isEmpty} from '../../../../src/ol/obj.js';
|
||||
|
||||
describe('ol.Feature', function () {
|
||||
describe('constructor', function () {
|
||||
it('creates a new feature', function () {
|
||||
const feature = new Feature();
|
||||
expect(feature).to.be.a(Feature);
|
||||
});
|
||||
|
||||
it('takes properties', function () {
|
||||
const feature = new Feature({
|
||||
foo: 'bar',
|
||||
});
|
||||
expect(feature.get('foo')).to.be('bar');
|
||||
});
|
||||
|
||||
it("can store the feature's commonly used id", function () {
|
||||
const feature = new Feature();
|
||||
feature.setId('foo');
|
||||
expect(feature.getId()).to.be('foo');
|
||||
});
|
||||
|
||||
it('will set the default geometry', function () {
|
||||
const feature = new Feature({
|
||||
geometry: new Point([10, 20]),
|
||||
foo: 'bar',
|
||||
});
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.a(Point);
|
||||
expect(feature.get('geometry')).to.be(geometry);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#get()', function () {
|
||||
it('returns values set at construction', function () {
|
||||
const feature = new Feature({
|
||||
a: 'first',
|
||||
b: 'second',
|
||||
});
|
||||
expect(feature.get('a')).to.be('first');
|
||||
expect(feature.get('b')).to.be('second');
|
||||
});
|
||||
|
||||
it('returns undefined for unset attributes', function () {
|
||||
const feature = new Feature();
|
||||
expect(feature.get('a')).to.be(undefined);
|
||||
});
|
||||
|
||||
it('returns values set by set', function () {
|
||||
const feature = new Feature();
|
||||
feature.set('a', 'b');
|
||||
expect(feature.get('a')).to.be('b');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getProperties()', function () {
|
||||
it('returns an object with all attributes', function () {
|
||||
const point = new Point([15, 30]);
|
||||
const feature = new Feature({
|
||||
foo: 'bar',
|
||||
ten: 10,
|
||||
geometry: point,
|
||||
});
|
||||
|
||||
const attributes = feature.getProperties();
|
||||
|
||||
const keys = Object.keys(attributes);
|
||||
expect(keys.sort()).to.eql(['foo', 'geometry', 'ten']);
|
||||
|
||||
expect(attributes.foo).to.be('bar');
|
||||
expect(attributes.geometry).to.be(point);
|
||||
expect(attributes.ten).to.be(10);
|
||||
});
|
||||
|
||||
it('is empty by default', function () {
|
||||
const feature = new Feature();
|
||||
const properties = feature.getProperties();
|
||||
expect(isEmpty(properties)).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getGeometry()', function () {
|
||||
const point = new Point([15, 30]);
|
||||
|
||||
it('returns undefined for unset geometry', function () {
|
||||
const feature = new Feature();
|
||||
expect(feature.getGeometry()).to.be(undefined);
|
||||
});
|
||||
|
||||
it('returns null for null geometry (constructor)', function () {
|
||||
const feature = new Feature(null);
|
||||
expect(feature.getGeometry()).to.be(undefined);
|
||||
});
|
||||
|
||||
it('returns null for null geometry (setGeometry())', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometry(null);
|
||||
expect(feature.getGeometry()).to.be(null);
|
||||
});
|
||||
|
||||
it('gets the geometry set at construction', function () {
|
||||
const feature = new Feature({
|
||||
geometry: point,
|
||||
});
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
});
|
||||
|
||||
it('gets any geometry set by setGeometry', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometry(point);
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
|
||||
const point2 = new Point([1, 2]);
|
||||
feature.setGeometry(point2);
|
||||
expect(feature.getGeometry()).to.be(point2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#set()', function () {
|
||||
it('sets values', function () {
|
||||
const feature = new Feature({
|
||||
a: 'first',
|
||||
b: 'second',
|
||||
});
|
||||
feature.set('a', 'new');
|
||||
expect(feature.get('a')).to.be('new');
|
||||
});
|
||||
|
||||
it('can be used to set the geometry', function () {
|
||||
const point = new Point([3, 4]);
|
||||
const feature = new Feature({
|
||||
geometry: new Point([1, 2]),
|
||||
});
|
||||
feature.set('geometry', point);
|
||||
expect(feature.get('geometry')).to.be(point);
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
});
|
||||
|
||||
it('can be used to set attributes with arbitrary names', function () {
|
||||
const feature = new Feature();
|
||||
|
||||
feature.set('toString', 'string');
|
||||
expect(feature.get('toString')).to.be('string');
|
||||
expect(typeof feature.toString).to.be('function');
|
||||
|
||||
feature.set('getGeometry', 'x');
|
||||
expect(feature.get('getGeometry')).to.be('x');
|
||||
|
||||
feature.set('geometry', new Point([1, 2]));
|
||||
expect(feature.getGeometry()).to.be.a(Point);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setGeometry()', function () {
|
||||
const point = new Point([15, 30]);
|
||||
|
||||
it('sets the default geometry', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometry(point);
|
||||
expect(feature.get('geometry')).to.be(point);
|
||||
});
|
||||
|
||||
it('replaces previous default geometry', function () {
|
||||
const feature = new Feature({
|
||||
geometry: point,
|
||||
});
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
|
||||
const point2 = new Point([1, 2]);
|
||||
feature.setGeometry(point2);
|
||||
expect(feature.getGeometry()).to.be(point2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setGeometryName()', function () {
|
||||
const point = new Point([15, 30]);
|
||||
|
||||
it('sets property where to to look at geometry', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometry(point);
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
|
||||
const point2 = new Point([1, 2]);
|
||||
feature.set('altGeometry', point2);
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
feature.setGeometryName('altGeometry');
|
||||
expect(feature.getGeometry()).to.be(point2);
|
||||
|
||||
feature.on('change', function () {
|
||||
expect().fail();
|
||||
});
|
||||
point.setCoordinates([0, 2]);
|
||||
});
|
||||
|
||||
it('changes property listener', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometry(point);
|
||||
const point2 = new Point([1, 2]);
|
||||
feature.set('altGeometry', point2);
|
||||
feature.setGeometryName('altGeometry');
|
||||
|
||||
const spy = sinon.spy();
|
||||
feature.on('change', spy);
|
||||
point2.setCoordinates([0, 2]);
|
||||
expect(spy.callCount).to.be(1);
|
||||
});
|
||||
|
||||
it('can use a different geometry name', function () {
|
||||
const feature = new Feature();
|
||||
feature.setGeometryName('foo');
|
||||
const point = new Point([10, 20]);
|
||||
feature.setGeometry(point);
|
||||
expect(feature.getGeometry()).to.be(point);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setId()', function () {
|
||||
it('sets the feature identifier', function () {
|
||||
const feature = new Feature();
|
||||
expect(feature.getId()).to.be(undefined);
|
||||
feature.setId('foo');
|
||||
expect(feature.getId()).to.be('foo');
|
||||
});
|
||||
|
||||
it('accepts a string or number', function () {
|
||||
const feature = new Feature();
|
||||
feature.setId('foo');
|
||||
expect(feature.getId()).to.be('foo');
|
||||
feature.setId(2);
|
||||
expect(feature.getId()).to.be(2);
|
||||
});
|
||||
|
||||
it('dispatches the "change" event', function (done) {
|
||||
const feature = new Feature();
|
||||
feature.on('change', function () {
|
||||
expect(feature.getId()).to.be('foo');
|
||||
done();
|
||||
});
|
||||
feature.setId('foo');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getStyleFunction()', function () {
|
||||
const styleFunction = function (feature, resolution) {
|
||||
return null;
|
||||
};
|
||||
|
||||
it('returns undefined after construction', function () {
|
||||
const feature = new Feature();
|
||||
expect(feature.getStyleFunction()).to.be(undefined);
|
||||
});
|
||||
|
||||
it('returns the function passed to setStyle', function () {
|
||||
const feature = new Feature();
|
||||
feature.setStyle(styleFunction);
|
||||
expect(feature.getStyleFunction()).to.be(styleFunction);
|
||||
});
|
||||
|
||||
it('does not get confused with user "styleFunction" property', function () {
|
||||
const feature = new Feature();
|
||||
feature.set('styleFunction', 'foo');
|
||||
expect(feature.getStyleFunction()).to.be(undefined);
|
||||
});
|
||||
|
||||
it('does not get confused with "styleFunction" option', function () {
|
||||
const feature = new Feature({
|
||||
styleFunction: 'foo',
|
||||
});
|
||||
expect(feature.getStyleFunction()).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setStyle()', function () {
|
||||
const style = new Style();
|
||||
|
||||
const styleFunction = function (feature, resolution) {
|
||||
return resolution;
|
||||
};
|
||||
|
||||
it('accepts a single style', function () {
|
||||
const feature = new Feature();
|
||||
feature.setStyle(style);
|
||||
const func = feature.getStyleFunction();
|
||||
expect(func()).to.eql([style]);
|
||||
});
|
||||
|
||||
it('accepts an array of styles', function () {
|
||||
const feature = new Feature();
|
||||
feature.setStyle([style]);
|
||||
const func = feature.getStyleFunction();
|
||||
expect(func()).to.eql([style]);
|
||||
});
|
||||
|
||||
it('accepts a style function', function () {
|
||||
const feature = new Feature();
|
||||
feature.setStyle(styleFunction);
|
||||
expect(feature.getStyleFunction()).to.be(styleFunction);
|
||||
expect(feature.getStyleFunction()(feature, 42)).to.be(42);
|
||||
});
|
||||
|
||||
it('accepts null', function () {
|
||||
const feature = new Feature();
|
||||
feature.setStyle(style);
|
||||
feature.setStyle(null);
|
||||
expect(feature.getStyle()).to.be(null);
|
||||
expect(feature.getStyleFunction()).to.be(undefined);
|
||||
});
|
||||
|
||||
it('dispatches a change event', function () {
|
||||
const feature = new Feature();
|
||||
const spy = sinon.spy();
|
||||
feature.on('change', spy);
|
||||
feature.setStyle(style);
|
||||
expect(spy.callCount).to.be(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getStyle()', function () {
|
||||
const style = new Style();
|
||||
|
||||
const styleFunction = function (feature, resolution) {
|
||||
return null;
|
||||
};
|
||||
|
||||
it('returns what is passed to setStyle', function () {
|
||||
const feature = new Feature();
|
||||
|
||||
expect(feature.getStyle()).to.be(null);
|
||||
|
||||
feature.setStyle(style);
|
||||
expect(feature.getStyle()).to.be(style);
|
||||
|
||||
feature.setStyle([style]);
|
||||
expect(feature.getStyle()).to.eql([style]);
|
||||
|
||||
feature.setStyle(styleFunction);
|
||||
expect(feature.getStyle()).to.be(styleFunction);
|
||||
});
|
||||
|
||||
it('does not get confused with "style" option to constructor', function () {
|
||||
const feature = new Feature({
|
||||
style: 'foo',
|
||||
});
|
||||
|
||||
expect(feature.getStyle()).to.be(null);
|
||||
});
|
||||
|
||||
it('does not get confused with user set "style" property', function () {
|
||||
const feature = new Feature();
|
||||
feature.set('style', 'foo');
|
||||
|
||||
expect(feature.getStyle()).to.be(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#clone', function () {
|
||||
it('correctly clones features', function () {
|
||||
const feature = new Feature();
|
||||
feature.setProperties({'fookey': 'fooval'});
|
||||
feature.setId(1);
|
||||
feature.setGeometryName('geom');
|
||||
const geometry = new Point([1, 2]);
|
||||
feature.setGeometry(geometry);
|
||||
const style = new Style({});
|
||||
feature.setStyle(style);
|
||||
feature.set('barkey', 'barval');
|
||||
|
||||
const clone = feature.clone();
|
||||
expect(clone.get('fookey')).to.be('fooval');
|
||||
expect(clone.getId()).to.be(undefined);
|
||||
expect(clone.getGeometryName()).to.be('geom');
|
||||
const geometryClone = clone.getGeometry();
|
||||
expect(geometryClone).not.to.be(geometry);
|
||||
const coordinates = geometryClone.getFlatCoordinates();
|
||||
expect(coordinates[0]).to.be(1);
|
||||
expect(coordinates[1]).to.be(2);
|
||||
expect(clone.getStyle()).to.be(style);
|
||||
expect(clone.get('barkey')).to.be('barval');
|
||||
});
|
||||
|
||||
it('correctly clones features with no geometry and no style', function () {
|
||||
const feature = new Feature();
|
||||
feature.set('fookey', 'fooval');
|
||||
|
||||
const clone = feature.clone();
|
||||
expect(clone.get('fookey')).to.be('fooval');
|
||||
expect(clone.getGeometry()).to.be(undefined);
|
||||
expect(clone.getStyle()).to.be(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#setGeometry()', function () {
|
||||
it('dispatches a change event when geometry is set to null', function () {
|
||||
const feature = new Feature({
|
||||
geometry: new Point([0, 0]),
|
||||
});
|
||||
const spy = sinon.spy();
|
||||
feature.on('change', spy);
|
||||
feature.setGeometry(null);
|
||||
expect(spy.callCount).to.be(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.Feature.createStyleFunction()', function () {
|
||||
const style = new Style();
|
||||
|
||||
it('creates a feature style function from a single style', function () {
|
||||
const styleFunction = createStyleFunction(style);
|
||||
expect(styleFunction()).to.eql([style]);
|
||||
});
|
||||
|
||||
it('creates a feature style function from an array of styles', function () {
|
||||
const styleFunction = createStyleFunction([style]);
|
||||
expect(styleFunction()).to.eql([style]);
|
||||
});
|
||||
|
||||
it('passes through a function', function () {
|
||||
const original = function (feature, resolution) {
|
||||
return [style];
|
||||
};
|
||||
const styleFunction = createStyleFunction(original);
|
||||
expect(styleFunction).to.be(original);
|
||||
});
|
||||
|
||||
it('throws on (some) unexpected input', function () {
|
||||
expect(function () {
|
||||
createStyleFunction({bogus: 'input'});
|
||||
}).to.throwException();
|
||||
});
|
||||
});
|
||||
80
test/browser/spec/ol/featureloader.test.js
Normal file
80
test/browser/spec/ol/featureloader.test.js
Normal file
@@ -0,0 +1,80 @@
|
||||
import GeoJSON from '../../../../src/ol/format/GeoJSON.js';
|
||||
import VectorSource from '../../../../src/ol/source/Vector.js';
|
||||
import {xhr} from '../../../../src/ol/featureloader.js';
|
||||
|
||||
describe('ol.featureloader', function () {
|
||||
describe('ol.featureloader.xhr', function () {
|
||||
let loader;
|
||||
let source;
|
||||
let url;
|
||||
let format;
|
||||
|
||||
beforeEach(function () {
|
||||
url = 'spec/ol/data/point.json';
|
||||
format = new GeoJSON();
|
||||
|
||||
source = new VectorSource();
|
||||
});
|
||||
|
||||
it('adds features to the source', function (done) {
|
||||
loader = xhr(url, format);
|
||||
source.on('addfeature', function (e) {
|
||||
setTimeout(function () {
|
||||
expect(source.getFeatures().length).to.be.greaterThan(0);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
loader.call(source, [], 1, 'EPSG:3857');
|
||||
});
|
||||
|
||||
describe('when called with urlFunction', function () {
|
||||
it('adds features to the source', function (done) {
|
||||
url = function (extent, resolution, projection) {
|
||||
return 'spec/ol/data/point.json';
|
||||
};
|
||||
loader = xhr(url, format);
|
||||
|
||||
source.on('addfeature', function (e) {
|
||||
setTimeout(function () {
|
||||
expect(source.getFeatures().length).to.be.greaterThan(0);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
loader.call(source, [], 1, 'EPSG:3857');
|
||||
});
|
||||
|
||||
it('sends the correct arguments to the urlFunction', function (done) {
|
||||
const extent = [];
|
||||
const resolution = 1;
|
||||
const projection = 'EPSG:3857';
|
||||
url = function (extent_, resolution_, projection_) {
|
||||
expect(extent_).to.eql(extent);
|
||||
expect(resolution_).to.eql(resolution);
|
||||
expect(projection_).to.eql(projection);
|
||||
done();
|
||||
return 'spec/ol/data/point.json';
|
||||
};
|
||||
loader = xhr(url, format);
|
||||
loader.call(source, [], 1, 'EPSG:3857');
|
||||
});
|
||||
});
|
||||
|
||||
it('it calls the success callback', function (done) {
|
||||
const errorSpy = sinon.spy();
|
||||
loader = xhr(url, format);
|
||||
loader.call(
|
||||
source,
|
||||
[],
|
||||
1,
|
||||
'EPSG:3857',
|
||||
function () {
|
||||
setTimeout(function () {
|
||||
expect(errorSpy.callCount).to.be(0);
|
||||
done();
|
||||
}, 0);
|
||||
},
|
||||
errorSpy
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
1813
test/browser/spec/ol/format/esrijson.test.js
Normal file
1813
test/browser/spec/ol/format/esrijson.test.js
Normal file
File diff suppressed because it is too large
Load Diff
5258
test/browser/spec/ol/format/esrijson/ksfields.json
Normal file
5258
test/browser/spec/ol/format/esrijson/ksfields.json
Normal file
File diff suppressed because it is too large
Load Diff
1033
test/browser/spec/ol/format/geojson.test.js
Normal file
1033
test/browser/spec/ol/format/geojson.test.js
Normal file
File diff suppressed because it is too large
Load Diff
181
test/browser/spec/ol/format/geojson/countries.geojson
Normal file
181
test/browser/spec/ol/format/geojson/countries.geojson
Normal file
File diff suppressed because one or more lines are too long
2921
test/browser/spec/ol/format/gml.test.js
Normal file
2921
test/browser/spec/ol/format/gml.test.js
Normal file
File diff suppressed because it is too large
Load Diff
33
test/browser/spec/ol/format/gml/geoserver3DFeatures.xml
Normal file
33
test/browser/spec/ol/format/gml/geoserver3DFeatures.xml
Normal file
@@ -0,0 +1,33 @@
|
||||
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberOfFeatures="8" timeStamp="2017-08-14T13:29:50.356Z" xsi:schemaLocation="http://www.opengeospatial.net/cite http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=cite%3Ageoserver_layer http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd">
|
||||
<gml:featureMembers>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.1">
|
||||
<cite:geom>
|
||||
<gml:LineString srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:posList>
|
||||
51.91122415 4.46386854 46.04679351 51.91120839 4.46382399 46.04679382
|
||||
</gml:posList>
|
||||
</gml:LineString>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.2">
|
||||
<cite:geom>
|
||||
<gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>
|
||||
51.91119276 4.46385491 46.06074531 51.91118582 4.4638264 46.06074609 51.91121772 4.46380612 46.06074168 51.91122465 4.46383463 46.06074089 51.91119276 4.46385491 46.06074531
|
||||
</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.3">
|
||||
<cite:geom>
|
||||
<gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:pos>51.91125849 4.46383715 46.04679348</gml:pos>
|
||||
</gml:Point>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
120
test/browser/spec/ol/format/gml/gml-complex.xml
Normal file
120
test/browser/spec/ol/format/gml/gml-complex.xml
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tut="http://example.org/tutorial"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:gsml="urn:cgi:xmlns:CGI:GeoSciML:2.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberOfFeatures="3"
|
||||
timeStamp="2018-08-15T11:52:11.366Z"
|
||||
xsi:schemaLocation="urn:cgi:xmlns:CGI:GeoSciML:2.0 http://www.geosciml.org/geosciml/2.0/xsd/geosciml.xsd http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
|
||||
<gml:featureMember>
|
||||
<gsml:MappedFeature gml:id="mf.25699">
|
||||
<gml:name>Some basalt</gml:name>
|
||||
<gml:name>urn:x-test:GeologicUnit:16777549126931093</gml:name>
|
||||
<gsml:observationMethod>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:observationMethod>
|
||||
<gsml:positionalAccuracy>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:positionalAccuracy>
|
||||
<gsml:specification href="urn:x-test:GeologicUnit:16777549126931093" />
|
||||
<gsml:shape>
|
||||
<gml:Polygon srsDimension="2"
|
||||
srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing srsDimension="2">
|
||||
<gml:posList>1610340.1935838535 4284512.166074015
|
||||
1610314.9870748299 4284503.122122704 1610322.4187882338
|
||||
4284519.894649132 1610316.759094497 4284523.101981014
|
||||
1610321.0122971204 4284531.491206108 1610318.0495807002
|
||||
4284532.8242770685 1610319.6410451748 4284536.6111539425
|
||||
1610319.099298857 4284537.417781517 1610321.247194622
|
||||
4284537.699439952 1610317.932103093 4284554.413021458
|
||||
1610326.2462194602 4284557.157338472 1610328.402928607
|
||||
4284555.819838275 1610343.9490912845 4284513.26614925
|
||||
1610340.1935838535 4284512.166074015</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gsml:shape>
|
||||
</gsml:MappedFeature>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<gsml:MappedFeature gml:id="mf.25764">
|
||||
<gml:name>More basalt</gml:name>
|
||||
<gml:name>urn:x-test:GeologicUnit:16777549126931093</gml:name>
|
||||
<gsml:observationMethod>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:observationMethod>
|
||||
<gsml:positionalAccuracy>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:positionalAccuracy>
|
||||
<gsml:specification href="urn:x-test:GeologicUnit:16777549126931093" />
|
||||
<gsml:shape>
|
||||
<gml:Polygon srsDimension="2"
|
||||
srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing srsDimension="2">
|
||||
<gml:posList>1610718.9221517597 4284805.42784805
|
||||
1610707.3895121815 4284814.000918856 1610690.0555121175
|
||||
4284839.544424725 1610688.6493659448 4284851.141369273
|
||||
1610698.3130323582 4284852.813339175 1610705.8316511428
|
||||
4284853.6639760295 1610706.7412747787 4284834.507828795
|
||||
1610734.9743371184 4284830.61366508 1610750.0961105193
|
||||
4284816.66263084 1610763.83073235 4284810.800250375
|
||||
1610756.6916036862 4284789.441324945 1610725.3908253086
|
||||
4284801.684887575 1610730.1263850513 4284820.332010645
|
||||
1610726.08892804 4284821.659368354 1610723.710210181
|
||||
4284814.359796638 1610718.9221517597 4284805.42784805
|
||||
</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gsml:shape>
|
||||
</gsml:MappedFeature>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<gsml:MappedFeature gml:id="mf.26106">
|
||||
<gml:name>Some mudstone</gml:name>
|
||||
<gml:name>urn:x-test:GeologicUnit:16777549126931077</gml:name>
|
||||
<gsml:observationMethod>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:observationMethod>
|
||||
<gsml:positionalAccuracy>
|
||||
<gsml:CGI_TermValue>
|
||||
<gsml:value codeSpace="urn:ietf:rfc:2141">urn:ogc:def:nil:OGC:missing</gsml:value>
|
||||
</gsml:CGI_TermValue>
|
||||
</gsml:positionalAccuracy>
|
||||
<gsml:specification href="urn:x-test:GeologicUnit:16777549126931077" />
|
||||
<gsml:shape>
|
||||
<gml:Polygon srsDimension="2"
|
||||
srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing srsDimension="2">
|
||||
<gml:posList>1610399.8069898037 4284790.189299587
|
||||
1610398.8760062372 4284763.736632759 1610381.1448500715
|
||||
4284763.369532419 1610380.8659049459 4284765.257112044
|
||||
1610366.8844742253 4284767.069534708 1610366.554168919
|
||||
4284778.402387972 1610363.857132307 4284780.276704736
|
||||
1610358.2706932572 4284769.990881423 1610363.6662297642
|
||||
4284765.9723890135 1610352.2305719855 4284744.319844696
|
||||
1610332.5497155024 4284756.625971695 1610332.5306289664
|
||||
4284760.134211061 1610339.4369314983 4284774.745249511
|
||||
1610350.0724354137 4284795.313982406 1610366.7215974482
|
||||
4284797.024567371 1610374.5176296765 4284796.257709886
|
||||
1610399.8069898037 4284790.189299587</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gsml:shape>
|
||||
</gsml:MappedFeature>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
47
test/browser/spec/ol/format/gml/more-geoms.xml
Normal file
47
test/browser/spec/ol/format/gml/more-geoms.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
|
||||
xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:medford="http://opengeo.org/#medford"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<medford:zoning gml:id="zoning.1">
|
||||
<medford:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</medford:the_geom>
|
||||
<medford:center>
|
||||
<gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:pos>1 2</gml:pos>
|
||||
</gml:Point>
|
||||
</medford:center>
|
||||
<medford:objectid>1</medford:objectid>
|
||||
<medford:cityzone>YES</medford:cityzone>
|
||||
<medford:zoning>I-L</medford:zoning>
|
||||
<medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
|
||||
<medford:finord></medford:finord>
|
||||
<medford:filenum></medford:filenum>
|
||||
<medford:acres>0.95741118624</medford:acres>
|
||||
<medford:misc></medford:misc>
|
||||
<medford:shape_leng>835.705330224</medford:shape_leng>
|
||||
<medford:perimeter>835.705330224</medford:perimeter>
|
||||
<medford:area>41704.8312728</medford:area>
|
||||
<medford:shape_le_1>835.705330224</medford:shape_le_1>
|
||||
<medford:shape_area>41704.8312728</medford:shape_area>
|
||||
<medford:hectares>0.38745056079</medford:hectares>
|
||||
</medford:zoning>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version='1.0' encoding="UTF-8" ?>
|
||||
<wfs:FeatureCollection
|
||||
xmlns:ms="http://mapserver.gis.umn.edu/mapserver"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/WFS-basic.xsd
|
||||
http://mapserver.gis.umn.edu/mapserver https://server.com/mapserv?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=feature:information,feature:bus_stop&OUTPUTFORMAT=XMLSCHEMA">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:21781">
|
||||
<gml:coordinates>539647.507960,151807.355864 540717.151197,152910.783525</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<gml:featureMember>
|
||||
<ms:bus_stop fid="bus_stop.347267989">
|
||||
<ms:osm_id>347267989</ms:osm_id>
|
||||
</ms:bus_stop>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:bus_stop fid="bus_stop.983813610">
|
||||
<ms:osm_id>983813610</ms:osm_id>
|
||||
</ms:bus_stop>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:bus_stop fid="bus_stop.347549357">
|
||||
<ms:osm_id>347549357</ms:osm_id>
|
||||
</ms:bus_stop>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:information fid="information.34751234">
|
||||
<ms:osm_id>34751234</ms:osm_id>
|
||||
</ms:information>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:information fid="information.34751235">
|
||||
<ms:osm_id>34751235</ms:osm_id>
|
||||
</ms:information>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
68
test/browser/spec/ol/format/gml/multiple-typenames-ns.xml
Normal file
68
test/browser/spec/ol/format/gml/multiple-typenames-ns.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:it.geosolutions="http://www.geo-solutions.it"
|
||||
xmlns:cite="http://www.opengeospatial.net/cite" xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:tiger="http://www.census.gov" xmlns:sde="http://geoserver.sf.net"
|
||||
xmlns:topp="http://www.openplans.org/topp" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sf="http://www.openplans.org/spearfish" xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:nurc="http://www.nurc.nato.int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
numberOfFeatures="874" timeStamp="2015-03-04T09:53:58.763Z"
|
||||
xsi:schemaLocation="http://www.openplans.org/topp http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp%3Astates http://www.openplans.org/spearfish http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=sf%3Aroads http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd">
|
||||
<gml:featureMembers>
|
||||
<topp:states gml:id="states.1">
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsDimension="2" srsName="EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon srsDimension="2">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing srsDimension="2">
|
||||
<gml:posList>37.51099000000001 -88.071564 37.476273000000006
|
||||
-88.087883 37.442852 -88.311707 37.40930899999999 -88.359177
|
||||
37.51099000000001 -88.071564</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Illinois</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>17</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>E N Cen</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>IL</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>143986.61</topp:LAND_KM>
|
||||
<topp:WATER_KM>1993.335</topp:WATER_KM>
|
||||
<topp:PERSONS>1.1430602E7</topp:PERSONS>
|
||||
<topp:FAMILIES>2924880.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
|
||||
<topp:MALE>5552233.0</topp:MALE>
|
||||
<topp:FEMALE>5878369.0</topp:FEMALE>
|
||||
<topp:WORKERS>4199206.0</topp:WORKERS>
|
||||
<topp:DRVALONE>3741715.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>652603.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>538071.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>5417967.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>1360159.0</topp:SERVICE>
|
||||
<topp:MANUAL>828906.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.486</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.514</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>1747776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
<sf:roads gml:id="roads.1">
|
||||
<sf:the_geom>
|
||||
<gml:MultiLineString srsDimension="2" srsName="EPSG:4326">
|
||||
<gml:lineStringMember>
|
||||
<gml:LineString srsDimension="2">
|
||||
<gml:posList>37.51099000000001 -88.071564 37.476273000000006
|
||||
-88.087883 37.442852 -88.311707 37.40930899999999 -88.359177
|
||||
37.51099000000001 -88.071564</gml:posList>
|
||||
</gml:LineString>
|
||||
</gml:lineStringMember>
|
||||
</gml:MultiLineString>
|
||||
</sf:the_geom>
|
||||
<sf:cat>5</sf:cat>
|
||||
<sf:label>unimproved road</sf:label>
|
||||
</sf:roads>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
44
test/browser/spec/ol/format/gml/multiple-typenames.xml
Normal file
44
test/browser/spec/ol/format/gml/multiple-typenames.xml
Normal file
@@ -0,0 +1,44 @@
|
||||
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:official="http://localhost:8080/official" xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberOfFeatures="12"
|
||||
timeStamp="2014-11-03T21:04:28.345Z">
|
||||
<gml:featureMembers>
|
||||
<official:planet_osm_line gml:id="planet_osm_line.fid-53719711_14976c6c1aa_6795">
|
||||
<official:osm_id>3822829</official:osm_id>
|
||||
</official:planet_osm_line>
|
||||
<official:planet_osm_line gml:id="planet_osm_line.fid-53719711_14976c6c1aa_6796">
|
||||
<official:osm_id>3820888</official:osm_id>
|
||||
</official:planet_osm_line>
|
||||
<official:planet_osm_line gml:id="planet_osm_line.fid-53719711_14976c6c1aa_6797">
|
||||
<official:osm_id>296916318</official:osm_id>
|
||||
</official:planet_osm_line>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_6798">
|
||||
<official:osm_id>37244</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_6799">
|
||||
<official:osm_id>1641478</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679a">
|
||||
<official:osm_id>1244004</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679b">
|
||||
<official:osm_id>22259</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679c">
|
||||
<official:osm_id>1606103</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679d">
|
||||
<official:osm_id>3217145</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679e">
|
||||
<official:osm_id>3228576</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_679f">
|
||||
<official:osm_id>936994</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
<official:planet_osm_polygon gml:id="planet_osm_polygon.fid-53719711_14976c6c1aa_67a0">
|
||||
<official:osm_id>936990</official:osm_id>
|
||||
</official:planet_osm_polygon>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
26
test/browser/spec/ol/format/gml/ogr.xml
Normal file
26
test/browser/spec/ol/format/gml/ogr.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<wfs:FeatureCollection
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xsi:schemaLocation="http://ogr.maptools.org/ test.xsd"
|
||||
xmlns:ogr="http://ogr.maptools.org/"
|
||||
xmlns:gml="http://www.opengis.net/gml">
|
||||
|
||||
|
||||
<gml:featureMember>
|
||||
<ogr:Plaatsbepalingspunt fid="Plaatsbepalingspunt.0">
|
||||
<ogr:geometryProperty>
|
||||
<gml:Point>
|
||||
<gml:pos srsDimension="2">115512.666 479836.28</gml:pos>
|
||||
</gml:Point>
|
||||
</ogr:geometryProperty>
|
||||
<ogr:gml_id>x2</ogr:gml_id>
|
||||
<ogr:namespace>NL.IMGEO</ogr:namespace>
|
||||
<ogr:lokaalID>L0001.A3C177B4105A4FFD82EB80084C8CA732</ogr:lokaalID>
|
||||
<ogr:nauwkeurigheid>60</ogr:nauwkeurigheid>
|
||||
<ogr:datumInwinning>2014-02-14</ogr:datumInwinning>
|
||||
<ogr:inwinnendeInstantie>L0001</ogr:inwinnendeInstantie>
|
||||
<ogr:inwinningsmethode>fotogrammetrisch</ogr:inwinningsmethode>
|
||||
</ogr:Plaatsbepalingspunt>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
41
test/browser/spec/ol/format/gml/only-boundedby.xml
Normal file
41
test/browser/spec/ol/format/gml/only-boundedby.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
|
||||
xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
|
||||
xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<topp:states gml:id="states.1">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
|
||||
<gml:upperCorner>42.509 -87.507</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:STATE_NAME>Illinois</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>17</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>E N Cen</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>IL</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>143986.61</topp:LAND_KM>
|
||||
<topp:WATER_KM>1993.335</topp:WATER_KM>
|
||||
<topp:PERSONS>1.143E7</topp:PERSONS>
|
||||
<topp:FAMILIES>2924880.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
|
||||
<topp:MALE>5552233.0</topp:MALE>
|
||||
<topp:FEMALE>5878369.0</topp:FEMALE>
|
||||
<topp:WORKERS>4199206.0</topp:WORKERS>
|
||||
<topp:DRVALONE>3741715.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>652603.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>538071.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>5417967.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>1360159.0</topp:SERVICE>
|
||||
<topp:MANUAL>828906.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.486</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.514</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>1747776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
74
test/browser/spec/ol/format/gml/osm-wfs-10.xml
Normal file
74
test/browser/spec/ol/format/gml/osm-wfs-10.xml
Normal file
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:osm="http://openstreemap.org"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://openstreemap.org http://demo.boundlessgeo.com:80/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=osm%3Awater_areas http://www.opengis.net/wfs http://demo.boundlessgeo.com:80/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8968891.6,5359194.88 -8851849.35,5404697.62</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<gml:featureMember>
|
||||
<osm:water_areas fid="water_areas.1">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8861874.95,5404470.6 -8861656.64,5404697.62</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<osm:osm_id>43923968</osm:osm_id>
|
||||
<osm:way>
|
||||
<gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8861874.95,5404567.88 -8861764.02,5404697.62 -8861656.64,5404593.11 -8861763.02,5404470.6 -8861874.95,5404567.88</gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</osm:way>
|
||||
<osm:natural>natural</osm:natural>
|
||||
<osm:landuse>reservoir</osm:landuse>
|
||||
</osm:water_areas>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<osm:water_areas fid="water_areas.6">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8878000.03,5387681.65 -8877690.97,5388003.42</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<osm:osm_id>43936917</osm:osm_id>
|
||||
<osm:way>
|
||||
<gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8878000.03,5387863.07 -8877848.36,5388003.42 -8877729.84,5387882.79 -8877690.97,5387798.34 -8877820.3,5387681.65 -8877881.51,5387742.44 -8878000.03,5387863.07</gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</osm:way>
|
||||
<osm:natural>natural</osm:natural>
|
||||
<osm:landuse>reservoir</osm:landuse>
|
||||
</osm:water_areas>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<osm:water_areas fid="water_areas.8">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8867744.24,5392288.05 -8867560.83,5392575.38</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<osm:osm_id>43923958</osm:osm_id>
|
||||
<osm:way>
|
||||
<gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#3857">
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-8867744.24,5392373.3 -8867676.8,5392462.18 -8867721.93,5392503.87 -8867662.89,5392575.38 -8867588.37,5392518.12 -8867634.04,5392444.68 -8867560.83,5392387.74 -8867629.53,5392288.05 -8867744.24,5392373.3</gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</osm:way>
|
||||
<osm:natural>natural</osm:natural>
|
||||
<osm:landuse>reservoir</osm:landuse>
|
||||
</osm:water_areas>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
42
test/browser/spec/ol/format/gml/repeated-name.xml
Normal file
42
test/browser/spec/ol/format/gml/repeated-name.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
|
||||
xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:medford="http://opengeo.org/#medford"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<medford:zoning gml:id="zoning.1">
|
||||
<medford:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</medford:the_geom>
|
||||
<medford:objectid>1</medford:objectid>
|
||||
<medford:cityzone>YES</medford:cityzone>
|
||||
<medford:zoning>I-L</medford:zoning>
|
||||
<medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
|
||||
<medford:finord></medford:finord>
|
||||
<medford:filenum></medford:filenum>
|
||||
<medford:acres>0.95741118624</medford:acres>
|
||||
<medford:misc></medford:misc>
|
||||
<medford:shape_leng>835.705330224</medford:shape_leng>
|
||||
<medford:perimeter>835.705330224</medford:perimeter>
|
||||
<medford:area>41704.8312728</medford:area>
|
||||
<medford:shape_le_1>835.705330224</medford:shape_le_1>
|
||||
<medford:shape_area>41704.8312728</medford:shape_area>
|
||||
<medford:hectares>0.38745056079</medford:hectares>
|
||||
</medford:zoning>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
@@ -0,0 +1,236 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gml:FeatureCollection
|
||||
xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
|
||||
xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMember>
|
||||
<topp:states gml:id="states.1">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
|
||||
<gml:upperCorner>42.509 -87.507</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>37.511 -88.071 37.476 -88.087 37.442 -88.311 37.409
|
||||
-88.359 37.421 -88.419 37.401 -88.467 37.296 -88.511 37.257
|
||||
-88.501 37.205 -88.451 37.156 -88.422 37.098 -88.451 37.072
|
||||
-88.476 37.068 -88.491 37.064 -88.517 37.072 -88.559 37.109
|
||||
-88.614 37.135 -88.688 37.141 -88.739 37.152 -88.746 37.202
|
||||
-88.863 37.218 -88.932 37.221 -88.993 37.185 -89.065 37.112
|
||||
-89.116 37.093 -89.146 37.064 -89.169 37.025 -89.174 36.998
|
||||
-89.151 36.988 -89.129 36.986 -89.193 37.028 -89.211 37.041
|
||||
-89.237 37.087 -89.264 37.091 -89.284 37.085 -89.303 37.061
|
||||
-89.309 37.027 -89.264 37.008 -89.262 36.999 -89.282 37.009
|
||||
-89.311 37.049 -89.382 37.099 -89.379 37.137 -89.423 37.165
|
||||
-89.441 37.224 -89.468 37.253 -89.465 37.256 -89.489 37.276
|
||||
-89.513 37.304 -89.513 37.329 -89.501 37.339 -89.468 37.355
|
||||
-89.435 37.411 -89.427 37.453 -89.453 37.491 -89.494 37.571
|
||||
-89.524 37.615 -89.513 37.651 -89.519 37.679 -89.513 37.694
|
||||
-89.521 37.706 -89.581 37.745 -89.666 37.783 -89.675 37.804
|
||||
-89.691 37.841 -89.728 37.905 -89.851 37.905 -89.861 37.891
|
||||
-89.866 37.875 -89.901 37.878 -89.937 37.911 -89.978 37.963
|
||||
-89.958 37.969 -90.011 37.993 -90.041 38.032 -90.119 38.053
|
||||
-90.134 38.088 -90.207 38.122 -90.254 38.166 -90.289 38.188
|
||||
-90.336 38.234 -90.364 38.323 -90.369 38.365 -90.358 38.391
|
||||
-90.339 38.427 -90.301 38.518 -90.265 38.532 -90.261 38.562
|
||||
-90.241 38.611 -90.183 38.658 -90.183 38.701 -90.202 38.723
|
||||
-90.196 38.773 -90.163 38.785 -90.135 38.801 -90.121 38.831
|
||||
-90.113 38.853 -90.132 38.914 -90.243 38.924 -90.278 38.924
|
||||
-90.319 38.962 -90.413 38.959 -90.469 38.891 -90.531 38.871
|
||||
-90.571 38.881 -90.627 38.935 -90.668 39.037 -90.706 39.058
|
||||
-90.707 39.093 -90.691 39.144 -90.716 39.195 -90.718 39.224
|
||||
-90.732 39.247 -90.738 39.296 -90.779 39.351 -90.851 39.401
|
||||
-90.947 39.444 -91.036 39.473 -91.064 39.528 -91.093 39.552
|
||||
-91.156 39.601 -91.203 39.685 -91.317 39.724 -91.367 39.761
|
||||
-91.373 39.803 -91.381 39.863 -91.449 39.885 -91.451 39.901
|
||||
-91.434 39.921 -91.431 39.946 -91.447 40.005 -91.487 40.066
|
||||
-91.504 40.134 -91.516 40.201 -91.506 40.251 -91.498 40.309
|
||||
-91.486 40.371 -91.448 40.386 -91.418 40.392 -91.385 40.402
|
||||
-91.372 40.447 -91.385 40.503 -91.374 40.528 -91.382 40.547
|
||||
-91.412 40.572 -91.411 40.603 -91.375 40.639 -91.262 40.643
|
||||
-91.214 40.656 -91.162 40.682 -91.129 40.705 -91.119 40.761
|
||||
-91.092 40.833 -91.088 40.879 -91.049 40.923 -90.983 40.951
|
||||
-90.961 41.071 -90.954 41.104 -90.957 41.144 -90.991 41.165
|
||||
-91.018 41.176 -91.056 41.231 -91.101 41.267 -91.102 41.334
|
||||
-91.073 41.401 -91.055 41.423 -91.027 41.431 -91.001 41.421
|
||||
-90.949 41.444 -90.844 41.449 -90.779 41.451 -90.708 41.462
|
||||
-90.658 41.509 -90.601 41.525 -90.541 41.527 -90.454 41.543
|
||||
-90.434 41.567 -90.423 41.586 -90.348 41.602 -90.339 41.649
|
||||
-90.341 41.722 -90.326 41.756 -90.304 41.781 -90.255 41.806
|
||||
-90.195 41.931 -90.154 41.983 -90.142 42.033 -90.151 42.061
|
||||
-90.168 42.103 -90.166 42.121 -90.176 42.122 -90.191 42.159
|
||||
-90.231 42.197 -90.323 42.211 -90.367 42.242 -90.407 42.263
|
||||
-90.417 42.341 -90.427 42.361 -90.441 42.388 -90.491 42.421
|
||||
-90.563 42.461 -90.605 42.475 -90.648 42.494 -90.651 42.509
|
||||
-90.638 42.508 -90.419 42.504 -89.923 42.503 -89.834 42.497
|
||||
-89.401 42.497 -89.359 42.491 -88.939 42.491 -88.764 42.489
|
||||
-88.706 42.491 -88.297 42.489 -88.194 42.489 -87.797 42.314
|
||||
-87.836 42.156 -87.761 42.059 -87.671 41.847 -87.612 41.723
|
||||
-87.529 41.469 -87.532 41.301 -87.532 41.173 -87.531 41.009
|
||||
-87.532 40.745 -87.532 40.494 -87.537 40.483 -87.535 40.166
|
||||
-87.535 39.887 -87.535 39.609 -87.535 39.477 -87.538 39.351
|
||||
-87.541 39.338 -87.597 39.307 -87.625 39.297 -87.611 39.281
|
||||
-87.615 39.258 -87.606 39.248 -87.584 39.208 -87.588 39.198
|
||||
-87.594 39.196 -87.607 39.168 -87.644 39.146 -87.671 39.131
|
||||
-87.659 39.113 -87.662 39.103 -87.631 39.088 -87.631 39.084
|
||||
-87.612 39.062 -87.585 38.995 -87.581 38.994 -87.591 38.977
|
||||
-87.547 38.963 -87.533 38.931 -87.531 38.904 -87.539 38.869
|
||||
-87.559 38.857 -87.551 38.795 -87.507 38.776 -87.519 38.769
|
||||
-87.508 38.736 -87.508 38.685 -87.543 38.672 -87.588 38.642
|
||||
-87.625 38.622 -87.628 38.599 -87.619 38.593 -87.641 38.573
|
||||
-87.652 38.547 -87.672 38.515 -87.651 38.501 -87.653 38.504
|
||||
-87.679 38.481 -87.692 38.466 -87.756 38.457 -87.758 38.445
|
||||
-87.738 38.417 -87.748 38.378 -87.784 38.352 -87.834 38.286
|
||||
-87.851 38.285 -87.863 38.316 -87.874 38.315 -87.883 38.301
|
||||
-87.888 38.281 -87.914 38.302 -87.913 38.304 -87.925 38.241
|
||||
-87.981 38.234 -87.986 38.201 -87.977 38.171 -87.932 38.157
|
||||
-87.931 38.136 -87.951 38.131 -87.973 38.103 -88.018 38.092
|
||||
-88.012 38.096 -87.964 38.073 -87.975 38.054 -88.034 38.045
|
||||
-88.043 38.038 -88.041 38.033 -88.021 38.008 -88.029 37.975
|
||||
-88.021 37.956 -88.042 37.934 -88.041 37.929 -88.064 37.944
|
||||
-88.078 37.923 -88.084 37.917 -88.031 37.905 -88.026 37.896
|
||||
-88.044 37.906 -88.101 37.895 -88.101 37.867 -88.075 37.843
|
||||
-88.034 37.827 -88.042 37.831 -88.089 37.817 -88.086 37.805
|
||||
-88.035 37.735 -88.072 37.701 -88.133 37.661 -88.159 37.628
|
||||
-88.157 37.583 -88.134 37.511 -88.071</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Illinois</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>17</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>E N Cen</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>IL</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>143986.61</topp:LAND_KM>
|
||||
<topp:WATER_KM>1993.335</topp:WATER_KM>
|
||||
<topp:PERSONS>1.143E7</topp:PERSONS>
|
||||
<topp:FAMILIES>2924880.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
|
||||
<topp:MALE>5552233.0</topp:MALE>
|
||||
<topp:FEMALE>5878369.0</topp:FEMALE>
|
||||
<topp:WORKERS>4199206.0</topp:WORKERS>
|
||||
<topp:DRVALONE>3741715.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>652603.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>538071.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>5417967.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>1360159.0</topp:SERVICE>
|
||||
<topp:MANUAL>828906.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.486</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.514</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>1747776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<topp:states gml:id="states.2">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.788 -77.122</gml:lowerCorner>
|
||||
<gml:upperCorner>38.993 -76.911</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.966 -77.008 38.889 -76.911 38.788 -77.045 38.813
|
||||
-77.035 38.829 -77.045 38.838 -77.041 38.862 -77.039 38.886
|
||||
-77.067 38.915 -77.078 38.932 -77.122 38.993 -77.042 38.966
|
||||
-77.008</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>11</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DC</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>159.055</topp:LAND_KM>
|
||||
<topp:WATER_KM>17.991</topp:WATER_KM>
|
||||
<topp:PERSONS>606900.0</topp:PERSONS>
|
||||
<topp:FAMILIES>122087.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
|
||||
<topp:MALE>282970.0</topp:MALE>
|
||||
<topp:FEMALE>323930.0</topp:FEMALE>
|
||||
<topp:WORKERS>229975.0</topp:WORKERS>
|
||||
<topp:DRVALONE>106694.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>36621.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>111422.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>303994.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>65498.0</topp:SERVICE>
|
||||
<topp:MANUAL>22407.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.466</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.534</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>72696.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<topp:states gml:id="states.3">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.449 -75.791</gml:lowerCorner>
|
||||
<gml:upperCorner>39.841 -75.045</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.557 -75.707 38.649 -75.711 38.831 -75.724 39.141
|
||||
-75.752 39.247 -75.761 39.295 -75.764 39.383 -75.772 39.723
|
||||
-75.791 39.724 -75.775 39.774 -75.745 39.821 -75.695 39.838
|
||||
-75.644 39.841 -75.583 39.826 -75.471 39.798 -75.421 39.789
|
||||
-75.412 39.778 -75.428 39.763 -75.461 39.741 -75.475 39.719
|
||||
-75.476 39.714 -75.489 39.612 -75.611 39.566 -75.562 39.463
|
||||
-75.591 39.366 -75.515 39.257 -75.402 39.073 -75.397 39.012
|
||||
-75.324 38.945 -75.307 38.808 -75.191 38.799 -75.083 38.449
|
||||
-75.045 38.449 -75.068 38.451 -75.093 38.455 -75.351 38.463
|
||||
-75.699 38.557 -75.707</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Delaware</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>10</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DE</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>5062.456</topp:LAND_KM>
|
||||
<topp:WATER_KM>1385.022</topp:WATER_KM>
|
||||
<topp:PERSONS>666168.0</topp:PERSONS>
|
||||
<topp:FAMILIES>175867.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
|
||||
<topp:MALE>322968.0</topp:MALE>
|
||||
<topp:FEMALE>343200.0</topp:FEMALE>
|
||||
<topp:WORKERS>247566.0</topp:WORKERS>
|
||||
<topp:DRVALONE>258087.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>42968.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>8069.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>335147.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>87973.0</topp:SERVICE>
|
||||
<topp:MANUAL>44140.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.485</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.515</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>102776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMember>
|
||||
</gml:FeatureCollection>
|
||||
1097
test/browser/spec/ol/format/gml/topp-states-gml.xml
Normal file
1097
test/browser/spec/ol/format/gml/topp-states-gml.xml
Normal file
File diff suppressed because it is too large
Load Diff
233
test/browser/spec/ol/format/gml/topp-states-wfs.xml
Normal file
233
test/browser/spec/ol/format/gml/topp-states-wfs.xml
Normal file
@@ -0,0 +1,233 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
|
||||
xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
|
||||
xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<topp:states gml:id="states.1">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
|
||||
<gml:upperCorner>42.509 -87.507</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>37.511 -88.071 37.476 -88.087 37.442 -88.311 37.409
|
||||
-88.359 37.421 -88.419 37.401 -88.467 37.296 -88.511 37.257
|
||||
-88.501 37.205 -88.451 37.156 -88.422 37.098 -88.451 37.072
|
||||
-88.476 37.068 -88.491 37.064 -88.517 37.072 -88.559 37.109
|
||||
-88.614 37.135 -88.688 37.141 -88.739 37.152 -88.746 37.202
|
||||
-88.863 37.218 -88.932 37.221 -88.993 37.185 -89.065 37.112
|
||||
-89.116 37.093 -89.146 37.064 -89.169 37.025 -89.174 36.998
|
||||
-89.151 36.988 -89.129 36.986 -89.193 37.028 -89.211 37.041
|
||||
-89.237 37.087 -89.264 37.091 -89.284 37.085 -89.303 37.061
|
||||
-89.309 37.027 -89.264 37.008 -89.262 36.999 -89.282 37.009
|
||||
-89.311 37.049 -89.382 37.099 -89.379 37.137 -89.423 37.165
|
||||
-89.441 37.224 -89.468 37.253 -89.465 37.256 -89.489 37.276
|
||||
-89.513 37.304 -89.513 37.329 -89.501 37.339 -89.468 37.355
|
||||
-89.435 37.411 -89.427 37.453 -89.453 37.491 -89.494 37.571
|
||||
-89.524 37.615 -89.513 37.651 -89.519 37.679 -89.513 37.694
|
||||
-89.521 37.706 -89.581 37.745 -89.666 37.783 -89.675 37.804
|
||||
-89.691 37.841 -89.728 37.905 -89.851 37.905 -89.861 37.891
|
||||
-89.866 37.875 -89.901 37.878 -89.937 37.911 -89.978 37.963
|
||||
-89.958 37.969 -90.011 37.993 -90.041 38.032 -90.119 38.053
|
||||
-90.134 38.088 -90.207 38.122 -90.254 38.166 -90.289 38.188
|
||||
-90.336 38.234 -90.364 38.323 -90.369 38.365 -90.358 38.391
|
||||
-90.339 38.427 -90.301 38.518 -90.265 38.532 -90.261 38.562
|
||||
-90.241 38.611 -90.183 38.658 -90.183 38.701 -90.202 38.723
|
||||
-90.196 38.773 -90.163 38.785 -90.135 38.801 -90.121 38.831
|
||||
-90.113 38.853 -90.132 38.914 -90.243 38.924 -90.278 38.924
|
||||
-90.319 38.962 -90.413 38.959 -90.469 38.891 -90.531 38.871
|
||||
-90.571 38.881 -90.627 38.935 -90.668 39.037 -90.706 39.058
|
||||
-90.707 39.093 -90.691 39.144 -90.716 39.195 -90.718 39.224
|
||||
-90.732 39.247 -90.738 39.296 -90.779 39.351 -90.851 39.401
|
||||
-90.947 39.444 -91.036 39.473 -91.064 39.528 -91.093 39.552
|
||||
-91.156 39.601 -91.203 39.685 -91.317 39.724 -91.367 39.761
|
||||
-91.373 39.803 -91.381 39.863 -91.449 39.885 -91.451 39.901
|
||||
-91.434 39.921 -91.431 39.946 -91.447 40.005 -91.487 40.066
|
||||
-91.504 40.134 -91.516 40.201 -91.506 40.251 -91.498 40.309
|
||||
-91.486 40.371 -91.448 40.386 -91.418 40.392 -91.385 40.402
|
||||
-91.372 40.447 -91.385 40.503 -91.374 40.528 -91.382 40.547
|
||||
-91.412 40.572 -91.411 40.603 -91.375 40.639 -91.262 40.643
|
||||
-91.214 40.656 -91.162 40.682 -91.129 40.705 -91.119 40.761
|
||||
-91.092 40.833 -91.088 40.879 -91.049 40.923 -90.983 40.951
|
||||
-90.961 41.071 -90.954 41.104 -90.957 41.144 -90.991 41.165
|
||||
-91.018 41.176 -91.056 41.231 -91.101 41.267 -91.102 41.334
|
||||
-91.073 41.401 -91.055 41.423 -91.027 41.431 -91.001 41.421
|
||||
-90.949 41.444 -90.844 41.449 -90.779 41.451 -90.708 41.462
|
||||
-90.658 41.509 -90.601 41.525 -90.541 41.527 -90.454 41.543
|
||||
-90.434 41.567 -90.423 41.586 -90.348 41.602 -90.339 41.649
|
||||
-90.341 41.722 -90.326 41.756 -90.304 41.781 -90.255 41.806
|
||||
-90.195 41.931 -90.154 41.983 -90.142 42.033 -90.151 42.061
|
||||
-90.168 42.103 -90.166 42.121 -90.176 42.122 -90.191 42.159
|
||||
-90.231 42.197 -90.323 42.211 -90.367 42.242 -90.407 42.263
|
||||
-90.417 42.341 -90.427 42.361 -90.441 42.388 -90.491 42.421
|
||||
-90.563 42.461 -90.605 42.475 -90.648 42.494 -90.651 42.509
|
||||
-90.638 42.508 -90.419 42.504 -89.923 42.503 -89.834 42.497
|
||||
-89.401 42.497 -89.359 42.491 -88.939 42.491 -88.764 42.489
|
||||
-88.706 42.491 -88.297 42.489 -88.194 42.489 -87.797 42.314
|
||||
-87.836 42.156 -87.761 42.059 -87.671 41.847 -87.612 41.723
|
||||
-87.529 41.469 -87.532 41.301 -87.532 41.173 -87.531 41.009
|
||||
-87.532 40.745 -87.532 40.494 -87.537 40.483 -87.535 40.166
|
||||
-87.535 39.887 -87.535 39.609 -87.535 39.477 -87.538 39.351
|
||||
-87.541 39.338 -87.597 39.307 -87.625 39.297 -87.611 39.281
|
||||
-87.615 39.258 -87.606 39.248 -87.584 39.208 -87.588 39.198
|
||||
-87.594 39.196 -87.607 39.168 -87.644 39.146 -87.671 39.131
|
||||
-87.659 39.113 -87.662 39.103 -87.631 39.088 -87.631 39.084
|
||||
-87.612 39.062 -87.585 38.995 -87.581 38.994 -87.591 38.977
|
||||
-87.547 38.963 -87.533 38.931 -87.531 38.904 -87.539 38.869
|
||||
-87.559 38.857 -87.551 38.795 -87.507 38.776 -87.519 38.769
|
||||
-87.508 38.736 -87.508 38.685 -87.543 38.672 -87.588 38.642
|
||||
-87.625 38.622 -87.628 38.599 -87.619 38.593 -87.641 38.573
|
||||
-87.652 38.547 -87.672 38.515 -87.651 38.501 -87.653 38.504
|
||||
-87.679 38.481 -87.692 38.466 -87.756 38.457 -87.758 38.445
|
||||
-87.738 38.417 -87.748 38.378 -87.784 38.352 -87.834 38.286
|
||||
-87.851 38.285 -87.863 38.316 -87.874 38.315 -87.883 38.301
|
||||
-87.888 38.281 -87.914 38.302 -87.913 38.304 -87.925 38.241
|
||||
-87.981 38.234 -87.986 38.201 -87.977 38.171 -87.932 38.157
|
||||
-87.931 38.136 -87.951 38.131 -87.973 38.103 -88.018 38.092
|
||||
-88.012 38.096 -87.964 38.073 -87.975 38.054 -88.034 38.045
|
||||
-88.043 38.038 -88.041 38.033 -88.021 38.008 -88.029 37.975
|
||||
-88.021 37.956 -88.042 37.934 -88.041 37.929 -88.064 37.944
|
||||
-88.078 37.923 -88.084 37.917 -88.031 37.905 -88.026 37.896
|
||||
-88.044 37.906 -88.101 37.895 -88.101 37.867 -88.075 37.843
|
||||
-88.034 37.827 -88.042 37.831 -88.089 37.817 -88.086 37.805
|
||||
-88.035 37.735 -88.072 37.701 -88.133 37.661 -88.159 37.628
|
||||
-88.157 37.583 -88.134 37.511 -88.071</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Illinois</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>17</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>E N Cen</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>IL</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>143986.61</topp:LAND_KM>
|
||||
<topp:WATER_KM>1993.335</topp:WATER_KM>
|
||||
<topp:PERSONS>1.143E7</topp:PERSONS>
|
||||
<topp:FAMILIES>2924880.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
|
||||
<topp:MALE>5552233.0</topp:MALE>
|
||||
<topp:FEMALE>5878369.0</topp:FEMALE>
|
||||
<topp:WORKERS>4199206.0</topp:WORKERS>
|
||||
<topp:DRVALONE>3741715.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>652603.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>538071.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>5417967.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>1360159.0</topp:SERVICE>
|
||||
<topp:MANUAL>828906.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.486</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.514</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>1747776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
<topp:states gml:id="states.2">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.788 -77.122</gml:lowerCorner>
|
||||
<gml:upperCorner>38.993 -76.911</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.966 -77.008 38.889 -76.911 38.788 -77.045 38.813
|
||||
-77.035 38.829 -77.045 38.838 -77.041 38.862 -77.039 38.886
|
||||
-77.067 38.915 -77.078 38.932 -77.122 38.993 -77.042 38.966
|
||||
-77.008</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>11</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DC</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>159.055</topp:LAND_KM>
|
||||
<topp:WATER_KM>17.991</topp:WATER_KM>
|
||||
<topp:PERSONS>606900.0</topp:PERSONS>
|
||||
<topp:FAMILIES>122087.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
|
||||
<topp:MALE>282970.0</topp:MALE>
|
||||
<topp:FEMALE>323930.0</topp:FEMALE>
|
||||
<topp:WORKERS>229975.0</topp:WORKERS>
|
||||
<topp:DRVALONE>106694.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>36621.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>111422.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>303994.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>65498.0</topp:SERVICE>
|
||||
<topp:MANUAL>22407.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.466</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.534</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>72696.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
<topp:states gml:id="states.3">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.449 -75.791</gml:lowerCorner>
|
||||
<gml:upperCorner>39.841 -75.045</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.557 -75.707 38.649 -75.711 38.831 -75.724 39.141
|
||||
-75.752 39.247 -75.761 39.295 -75.764 39.383 -75.772 39.723
|
||||
-75.791 39.724 -75.775 39.774 -75.745 39.821 -75.695 39.838
|
||||
-75.644 39.841 -75.583 39.826 -75.471 39.798 -75.421 39.789
|
||||
-75.412 39.778 -75.428 39.763 -75.461 39.741 -75.475 39.719
|
||||
-75.476 39.714 -75.489 39.612 -75.611 39.566 -75.562 39.463
|
||||
-75.591 39.366 -75.515 39.257 -75.402 39.073 -75.397 39.012
|
||||
-75.324 38.945 -75.307 38.808 -75.191 38.799 -75.083 38.449
|
||||
-75.045 38.449 -75.068 38.451 -75.093 38.455 -75.351 38.463
|
||||
-75.699 38.557 -75.707</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Delaware</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>10</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DE</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>5062.456</topp:LAND_KM>
|
||||
<topp:WATER_KM>1385.022</topp:WATER_KM>
|
||||
<topp:PERSONS>666168.0</topp:PERSONS>
|
||||
<topp:FAMILIES>175867.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
|
||||
<topp:MALE>322968.0</topp:MALE>
|
||||
<topp:FEMALE>343200.0</topp:FEMALE>
|
||||
<topp:WORKERS>247566.0</topp:WORKERS>
|
||||
<topp:DRVALONE>258087.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>42968.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>8069.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>335147.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>87973.0</topp:SERVICE>
|
||||
<topp:MANUAL>44140.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.485</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.515</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>102776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
680
test/browser/spec/ol/format/gpx.test.js
Normal file
680
test/browser/spec/ol/format/gpx.test.js
Normal file
@@ -0,0 +1,680 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import GPX from '../../../../../src/ol/format/GPX.js';
|
||||
import LineString from '../../../../../src/ol/geom/LineString.js';
|
||||
import MultiLineString from '../../../../../src/ol/geom/MultiLineString.js';
|
||||
import Point from '../../../../../src/ol/geom/Point.js';
|
||||
import Polygon from '../../../../../src/ol/geom/Polygon.js';
|
||||
import {get as getProjection, transform} from '../../../../../src/ol/proj.js';
|
||||
import {parse} from '../../../../../src/ol/xml.js';
|
||||
|
||||
describe('ol.format.GPX', function () {
|
||||
let format;
|
||||
beforeEach(function () {
|
||||
format = new GPX();
|
||||
});
|
||||
|
||||
describe('#readProjection', function () {
|
||||
it('returns the default projection from document', function () {
|
||||
const projection = format.readProjectionFromDocument();
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
|
||||
it('returns the default projection from node', function () {
|
||||
const projection = format.readProjectionFromNode();
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('rte', function () {
|
||||
it('can read an empty rte', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <rte/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(LineString);
|
||||
expect(g.getCoordinates()).to.eql([]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
});
|
||||
|
||||
it('can read and write various rte attributes', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <rte>' +
|
||||
' <name>Name</name>' +
|
||||
' <cmt>Comment</cmt>' +
|
||||
' <desc>Description</desc>' +
|
||||
' <src>Source</src>' +
|
||||
' <link href="http://example.com/">' +
|
||||
' <text>Link text</text>' +
|
||||
' <type>Link type</type>' +
|
||||
' </link>' +
|
||||
' <number>1</number>' +
|
||||
' <type>Type</type>' +
|
||||
' </rte>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
expect(f.get('name')).to.be('Name');
|
||||
expect(f.get('cmt')).to.be('Comment');
|
||||
expect(f.get('desc')).to.be('Description');
|
||||
expect(f.get('src')).to.be('Source');
|
||||
expect(f.get('link')).to.be('http://example.com/');
|
||||
expect(f.get('linkText')).to.be('Link text');
|
||||
expect(f.get('linkType')).to.be('Link type');
|
||||
expect(f.get('number')).to.be(1);
|
||||
expect(f.get('type')).to.be('Type');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a rte with multiple rtepts', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <rte>' +
|
||||
' <rtept lat="1" lon="2"/>' +
|
||||
' <rtept lat="3" lon="4"/>' +
|
||||
' </rte>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(LineString);
|
||||
expect(g.getCoordinates()).to.eql([
|
||||
[2, 1],
|
||||
[4, 3],
|
||||
]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can transform, read and write a rte', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <rte>' +
|
||||
' <rtept lat="1" lon="2"/>' +
|
||||
' <rtept lat="5" lon="6"/>' +
|
||||
' </rte>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(LineString);
|
||||
const p1 = transform([2, 1], 'EPSG:4326', 'EPSG:3857');
|
||||
const p2 = transform([6, 5], 'EPSG:4326', 'EPSG:3857');
|
||||
expect(g.getCoordinates()).to.eql([p1, p2]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
const serialized = format.writeFeaturesNode(fs, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('does not write rte attributes in rtepts', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <rte>' +
|
||||
' <name>Name</name>' +
|
||||
' <rtept lat="1" lon="2"/>' +
|
||||
' <rtept lat="3" lon="4"/>' +
|
||||
' </rte>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
});
|
||||
|
||||
describe('trk', function () {
|
||||
it('can read an empty trk', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <trk/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(MultiLineString);
|
||||
expect(g.getCoordinates()).to.eql([]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
});
|
||||
|
||||
it('can read and write various trk attributes', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <name>Name</name>' +
|
||||
' <cmt>Comment</cmt>' +
|
||||
' <desc>Description</desc>' +
|
||||
' <src>Source</src>' +
|
||||
' <link href="http://example.com/">' +
|
||||
' <text>Link text</text>' +
|
||||
' <type>Link type</type>' +
|
||||
' </link>' +
|
||||
' <number>1</number>' +
|
||||
' <type>Type</type>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
expect(f.get('name')).to.be('Name');
|
||||
expect(f.get('cmt')).to.be('Comment');
|
||||
expect(f.get('desc')).to.be('Description');
|
||||
expect(f.get('src')).to.be('Source');
|
||||
expect(f.get('link')).to.be('http://example.com/');
|
||||
expect(f.get('linkText')).to.be('Link text');
|
||||
expect(f.get('linkType')).to.be('Link type');
|
||||
expect(f.get('number')).to.be(1);
|
||||
expect(f.get('type')).to.be('Type');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a trk with an empty trkseg', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <trkseg/>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(MultiLineString);
|
||||
expect(g.getCoordinates()).to.eql([[]]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read/write a trk with a trkseg with multiple trkpts', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="5" lon="6">' +
|
||||
' <ele>7</ele>' +
|
||||
' <time>2010-01-10T09:30:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(MultiLineString);
|
||||
expect(g.getCoordinates()).to.eql([
|
||||
[
|
||||
[2, 1, 3, 1263115752],
|
||||
[6, 5, 7, 1263115812],
|
||||
],
|
||||
]);
|
||||
expect(g.getLayout()).to.be('XYZM');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can transform, read and write a trk with a trkseg', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="5" lon="6">' +
|
||||
' <ele>7</ele>' +
|
||||
' <time>2010-01-10T09:30:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(MultiLineString);
|
||||
const p1 = transform([2, 1], 'EPSG:4326', 'EPSG:3857');
|
||||
p1.push(3, 1263115752);
|
||||
const p2 = transform([6, 5], 'EPSG:4326', 'EPSG:3857');
|
||||
p2.push(7, 1263115812);
|
||||
expect(g.getCoordinates()).to.eql([[p1, p2]]);
|
||||
expect(g.getLayout()).to.be('XYZM');
|
||||
const serialized = format.writeFeaturesNode(fs, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a trk with multiple trksegs', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="5" lon="6">' +
|
||||
' <ele>7</ele>' +
|
||||
' <time>2010-01-10T09:30:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="8" lon="9">' +
|
||||
' <ele>10</ele>' +
|
||||
' <time>2010-01-10T09:31:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="11" lon="12">' +
|
||||
' <ele>13</ele>' +
|
||||
' <time>2010-01-10T09:32:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(MultiLineString);
|
||||
expect(g.getCoordinates()).to.eql([
|
||||
[
|
||||
[2, 1, 3, 1263115752],
|
||||
[6, 5, 7, 1263115812],
|
||||
],
|
||||
[
|
||||
[9, 8, 10, 1263115872],
|
||||
[12, 11, 13, 1263115932],
|
||||
],
|
||||
]);
|
||||
expect(g.getLayout()).to.be('XYZM');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('does not write trk attributes in trkpts', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <trk>' +
|
||||
' <name>Name</name>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="5" lon="6">' +
|
||||
' <ele>7</ele>' +
|
||||
' <time>2010-01-10T09:30:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt lat="8" lon="9">' +
|
||||
' <ele>10</ele>' +
|
||||
' <time>2010-01-10T09:31:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' <trkpt lat="11" lon="12">' +
|
||||
' <ele>13</ele>' +
|
||||
' <time>2010-01-10T09:32:12Z</time>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
});
|
||||
|
||||
describe('wpt', function () {
|
||||
it('can read and write a wpt', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2"/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1]);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can transform, read and write a wpt', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2"/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
const expectedPoint = transform([2, 1], 'EPSG:4326', 'EPSG:3857');
|
||||
expect(g.getCoordinates()).to.eql(expectedPoint);
|
||||
expect(g.getLayout()).to.be('XY');
|
||||
const serialized = format.writeFeaturesNode(fs, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a wpt with ele', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' </wpt>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1, 3]);
|
||||
expect(g.getLayout()).to.be('XYZ');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a wpt with time', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2">' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </wpt>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1, 1263115752]);
|
||||
expect(g.getLayout()).to.be('XYM');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write a wpt with ele and time', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2">' +
|
||||
' <ele>3</ele>' +
|
||||
' <time>2010-01-10T09:29:12Z</time>' +
|
||||
' </wpt>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1, 3, 1263115752]);
|
||||
expect(g.getLayout()).to.be('XYZM');
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
|
||||
it('can read and write various wpt attributes', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="OpenLayers">' +
|
||||
' <wpt lat="1" lon="2">' +
|
||||
' <magvar>11</magvar>' +
|
||||
' <geoidheight>4</geoidheight>' +
|
||||
' <name>Name</name>' +
|
||||
' <cmt>Comment</cmt>' +
|
||||
' <desc>Description</desc>' +
|
||||
' <src>Source</src>' +
|
||||
' <link href="http://example.com/">' +
|
||||
' <text>Link text</text>' +
|
||||
' <type>Link type</type>' +
|
||||
' </link>' +
|
||||
' <sym>Symbol</sym>' +
|
||||
' <type>Type</type>' +
|
||||
' <fix>2d</fix>' +
|
||||
' <sat>5</sat>' +
|
||||
' <hdop>6</hdop>' +
|
||||
' <vdop>7</vdop>' +
|
||||
' <pdop>8</pdop>' +
|
||||
' <ageofdgpsdata>9</ageofdgpsdata>' +
|
||||
' <dgpsid>10</dgpsid>' +
|
||||
' </wpt>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
expect(f.get('magvar')).to.be(11);
|
||||
expect(f.get('geoidheight')).to.be(4);
|
||||
expect(f.get('name')).to.be('Name');
|
||||
expect(f.get('cmt')).to.be('Comment');
|
||||
expect(f.get('desc')).to.be('Description');
|
||||
expect(f.get('src')).to.be('Source');
|
||||
expect(f.get('link')).to.be('http://example.com/');
|
||||
expect(f.get('linkText')).to.be('Link text');
|
||||
expect(f.get('linkType')).to.be('Link type');
|
||||
expect(f.get('sym')).to.be('Symbol');
|
||||
expect(f.get('type')).to.be('Type');
|
||||
expect(f.get('fix')).to.be('2d');
|
||||
expect(f.get('hdop')).to.be(6);
|
||||
expect(f.get('vdop')).to.be(7);
|
||||
expect(f.get('pdop')).to.be(8);
|
||||
expect(f.get('ageofdgpsdata')).to.be(9);
|
||||
expect(f.get('dgpsid')).to.be(10);
|
||||
const serialized = format.writeFeaturesNode(fs);
|
||||
expect(serialized).to.xmleql(parse(text));
|
||||
});
|
||||
});
|
||||
|
||||
describe('XML namespace support', function () {
|
||||
beforeEach(function () {
|
||||
format = new GPX();
|
||||
});
|
||||
|
||||
it('can read features with a version 1.0 namespace', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/0">' +
|
||||
' <wpt/>' +
|
||||
' <rte/>' +
|
||||
' <trk/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(3);
|
||||
});
|
||||
|
||||
it('can read features with a version 1.1 namespace', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <wpt/>' +
|
||||
' <rte/>' +
|
||||
' <trk/>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(3);
|
||||
});
|
||||
|
||||
it('can read features with no namespace', function () {
|
||||
const text = '<gpx>' + ' <wpt/>' + ' <rte/>' + ' <trk/>' + '</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('extensions support', function () {
|
||||
beforeEach(function () {
|
||||
format = new GPX({
|
||||
readExtensions: function (feature, extensionsNode) {
|
||||
const nodes = extensionsNode.getElementsByTagName('id');
|
||||
const id = nodes.item(0).textContent;
|
||||
feature.setId(id);
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('can process extensions from wpt', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <wpt>' +
|
||||
' <extensions>' +
|
||||
' <id>feature-id</id>' +
|
||||
' </extensions>' +
|
||||
' </wpt>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const feature = fs[0];
|
||||
expect(feature.getId()).to.be('feature-id');
|
||||
});
|
||||
|
||||
it('can process extensions from rte', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <rte>' +
|
||||
' <extensions>' +
|
||||
' <foo>bar</foo>' +
|
||||
' <id>feature-id</id>' +
|
||||
' </extensions>' +
|
||||
' </rte>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const feature = fs[0];
|
||||
expect(feature.getId()).to.be('feature-id');
|
||||
});
|
||||
|
||||
it('can process extensions from trk, not trkpt', function () {
|
||||
const text =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
|
||||
' <trk>' +
|
||||
' <extensions>' +
|
||||
' <id>feature-id</id>' +
|
||||
' </extensions>' +
|
||||
' <trkseg>' +
|
||||
' <trkpt>' +
|
||||
' <extensions>' +
|
||||
' <id>another-feature-id</id>' +
|
||||
' </extensions>' +
|
||||
' </trkpt>' +
|
||||
' </trkseg>' +
|
||||
' </trk>' +
|
||||
'</gpx>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(1);
|
||||
const feature = fs[0];
|
||||
expect(feature.getId()).to.be('feature-id');
|
||||
});
|
||||
});
|
||||
|
||||
describe('write unsupported geometries', function () {
|
||||
beforeEach(function () {
|
||||
format = new GPX();
|
||||
});
|
||||
|
||||
it('does not fail', function () {
|
||||
const polygon = new Polygon([
|
||||
[
|
||||
[0, 0],
|
||||
[2, 2],
|
||||
[4, 0],
|
||||
[0, 0],
|
||||
],
|
||||
]);
|
||||
const feature = new Feature(polygon);
|
||||
const features = [feature];
|
||||
const gpx = format.writeFeaturesNode(features);
|
||||
const expected =
|
||||
'<gpx xmlns="http://www.topografix.com/GPX/1/1" ' +
|
||||
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
|
||||
'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' +
|
||||
'http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" ' +
|
||||
'creator="OpenLayers"></gpx>';
|
||||
expect(gpx).to.xmleql(parse(expected));
|
||||
});
|
||||
});
|
||||
});
|
||||
163
test/browser/spec/ol/format/igc.test.js
Normal file
163
test/browser/spec/ol/format/igc.test.js
Normal file
@@ -0,0 +1,163 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import IGC from '../../../../../src/ol/format/IGC.js';
|
||||
import {get as getProjection, transform} from '../../../../../src/ol/proj.js';
|
||||
|
||||
describe('ol.format.IGC', function () {
|
||||
let format;
|
||||
const igc =
|
||||
'AFLY05094\n' +
|
||||
'HFDTE190411\n' +
|
||||
'HFFXA100\n' +
|
||||
'HFPLTPILOT:Tom Payne\n' +
|
||||
'HFGTYGLIDERTYPE:Axis Mercury\n' +
|
||||
'HFGIDGLIDERID:\n' +
|
||||
'HFDTM100GPSDATUM:WGS84\n' +
|
||||
'HFGPSGPS:FURUNO GH-80\n' +
|
||||
'HFRFWFIRMWAREVERSION:1.22\n' +
|
||||
'HFRHWHARDWAREVERSION:1.00\n' +
|
||||
'HFFTYFRTYPE:FLYTEC,5020\n' +
|
||||
'I013638TAS\n' +
|
||||
'B0848484556256N00651095EA0205102039000\n' +
|
||||
'B0855534556037N00651011EA0259302513000\n' +
|
||||
'B0903354554964N00648049EA0272402758000\n' +
|
||||
'B0848484556256N00651095EA0205102039000\n' +
|
||||
'GAB890A77AFE5CE63979AF6B1BED7F07D\n' +
|
||||
'G62BB282E44D63A1149EF2F5E8AF6F2F1\n' +
|
||||
'GEC14381987B15F81003EDE1E01A47843\n' +
|
||||
'G60189641B00B00800019000000000000';
|
||||
|
||||
beforeEach(function () {
|
||||
format = new IGC();
|
||||
});
|
||||
|
||||
describe('#readProjectionFromText', function () {
|
||||
it('returns the default projection', function () {
|
||||
const projection = format.readProjectionFromText(igc);
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeature', function () {
|
||||
it('does not read invalid features', function () {
|
||||
expect(format.readFeature('invalid')).to.be(null);
|
||||
});
|
||||
|
||||
it('does read a feature', function () {
|
||||
const feature = format.readFeature(igc);
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geom = feature.getGeometry();
|
||||
expect(geom.getType()).to.eql('LineString');
|
||||
expect(geom.getCoordinates()).to.eql([
|
||||
[6.851583333333333, 45.9376, 1303202928],
|
||||
[6.850183333333334, 45.93395, 1303203353],
|
||||
[6.800816666666667, 45.916066666666666, 1303203815],
|
||||
[6.851583333333333, 45.9376, 1303289328],
|
||||
]);
|
||||
});
|
||||
|
||||
it('does transform and read a feature', function () {
|
||||
const feature = format.readFeature(igc, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geom = feature.getGeometry();
|
||||
expect(geom.getType()).to.eql('LineString');
|
||||
|
||||
const expectedPoint1 = transform(
|
||||
[6.851583333333333, 45.9376],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint1.push(1303202928);
|
||||
const expectedPoint2 = transform(
|
||||
[6.850183333333334, 45.93395],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint2.push(1303203353);
|
||||
const expectedPoint3 = transform(
|
||||
[6.800816666666667, 45.916066666666666],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint3.push(1303203815);
|
||||
const expectedPoint4 = transform(
|
||||
[6.851583333333333, 45.9376],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint4.push(1303289328);
|
||||
|
||||
expect(geom.getCoordinates()).to.eql([
|
||||
expectedPoint1,
|
||||
expectedPoint2,
|
||||
expectedPoint3,
|
||||
expectedPoint4,
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeatures', function () {
|
||||
it('does not read invalid features', function () {
|
||||
expect(format.readFeatures('invalid')).to.be.empty();
|
||||
});
|
||||
|
||||
it('does read features', function () {
|
||||
const features = format.readFeatures(igc);
|
||||
expect(features.length).to.eql(1);
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geom = feature.getGeometry();
|
||||
expect(geom.getType()).to.eql('LineString');
|
||||
expect(geom.getCoordinates()).to.eql([
|
||||
[6.851583333333333, 45.9376, 1303202928],
|
||||
[6.850183333333334, 45.93395, 1303203353],
|
||||
[6.800816666666667, 45.916066666666666, 1303203815],
|
||||
[6.851583333333333, 45.9376, 1303289328],
|
||||
]);
|
||||
});
|
||||
|
||||
it('does transform and read features', function () {
|
||||
const features = format.readFeatures(igc, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(features.length).to.eql(1);
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geom = feature.getGeometry();
|
||||
expect(geom.getType()).to.eql('LineString');
|
||||
|
||||
const expectedPoint1 = transform(
|
||||
[6.851583333333333, 45.9376],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint1.push(1303202928);
|
||||
const expectedPoint2 = transform(
|
||||
[6.850183333333334, 45.93395],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint2.push(1303203353);
|
||||
const expectedPoint3 = transform(
|
||||
[6.800816666666667, 45.916066666666666],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint3.push(1303203815);
|
||||
const expectedPoint4 = transform(
|
||||
[6.851583333333333, 45.9376],
|
||||
'EPSG:4326',
|
||||
'EPSG:3857'
|
||||
);
|
||||
expectedPoint4.push(1303289328);
|
||||
|
||||
expect(geom.getCoordinates()).to.eql([
|
||||
expectedPoint1,
|
||||
expectedPoint2,
|
||||
expectedPoint3,
|
||||
expectedPoint4,
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
||||
623
test/browser/spec/ol/format/iiif.test.js
Normal file
623
test/browser/spec/ol/format/iiif.test.js
Normal file
@@ -0,0 +1,623 @@
|
||||
import IIIFInfo from '../../../../../src/ol/format/IIIFInfo.js';
|
||||
import {Versions} from '../../../../../src/ol/format/IIIFInfo.js';
|
||||
|
||||
describe('ol.format.IIIFInfo', function () {
|
||||
const iiifInfo = new IIIFInfo();
|
||||
|
||||
describe('setImageInfo', function () {
|
||||
it('can handle image info JSON as object or as string serialization', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION3);
|
||||
|
||||
iiifInfo.setImageInfo(
|
||||
'{"@context": "http://iiif.io/api/image/2/context.json","@id":"http://iiif.test/id"}'
|
||||
);
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getImageApiVersion', function () {
|
||||
it('provides the correct Image API version', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@id': 'http://iiif.test/id',
|
||||
});
|
||||
expect(function () {
|
||||
iiifInfo.getImageApiVersion();
|
||||
}).to.throwException();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
identifier: 'http://iiif.test/id',
|
||||
profile: 'this is no valid profile',
|
||||
});
|
||||
expect(function () {
|
||||
iiifInfo.getImageApiVersion();
|
||||
}).to.throwException();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'this is no valid context',
|
||||
'@id': 'http://iiif.test/id',
|
||||
});
|
||||
expect(function () {
|
||||
iiifInfo.getImageApiVersion();
|
||||
}).to.throwException();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
identifier: 'http://iiif.test/id',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/1/context.json',
|
||||
identifier: 'http://iiif.test/id',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION2);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
id: 'http://iiif.test/id',
|
||||
});
|
||||
expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getComplianceLevelFromProfile', function () {
|
||||
it('detects the correct compliance level', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'level0',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'http://iiif.io/api/image/level3.json',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'level1',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'http://iiif.io/api/image/2/level2.json',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level2');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: ['http://iiif.io/api/image/2/level1.json'],
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level1');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'level4',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'http://iiif.io/api/image/3/level3.json',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'http://iiif.io/api/image/2/level1.json',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'level2',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level2');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'http://iiif.io/api/image/3/level1.json',
|
||||
});
|
||||
expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level1');
|
||||
});
|
||||
});
|
||||
|
||||
describe('getComplianceLevelSupportedFeatures', function () {
|
||||
it('provides the correct features for given versions and compliance levels', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
});
|
||||
let level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.be.empty();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level1',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(4);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByPct');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level2',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(7);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('regionByPct');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByPct');
|
||||
expect(level.supports).to.contain('sizeByConfinedWh');
|
||||
expect(level.supports).to.contain('sizeByWh');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'http://iiif.io/api/image/2/level0.json',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.be.empty();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'http://iiif.io/api/image/2/level1.json',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(4);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByPct');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
profile: 'http://iiif.io/api/image/2/level2.json',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(8);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('regionByPct');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByPct');
|
||||
expect(level.supports).to.contain('sizeByConfinedWh');
|
||||
expect(level.supports).to.contain('sizeByDistortedWh');
|
||||
expect(level.supports).to.contain('sizeByWh');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'level0',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.be.empty();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'level1',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(5);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('regionSquare');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByWh');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
profile: 'level2',
|
||||
});
|
||||
level = iiifInfo.getComplianceLevelSupportedFeatures();
|
||||
expect(level.supports).to.have.length(8);
|
||||
expect(level.supports).to.contain('regionByPx');
|
||||
expect(level.supports).to.contain('regionByPct');
|
||||
expect(level.supports).to.contain('regionSquare');
|
||||
expect(level.supports).to.contain('sizeByW');
|
||||
expect(level.supports).to.contain('sizeByH');
|
||||
expect(level.supports).to.contain('sizeByWh');
|
||||
expect(level.supports).to.contain('sizeByConfinedWh');
|
||||
expect(level.supports).to.contain('sizeByPct');
|
||||
});
|
||||
});
|
||||
|
||||
describe('getTileSourceOptions', function () {
|
||||
it('produces options from minimal information responses', function () {
|
||||
expect(function () {
|
||||
iiifInfo.setImageInfo({
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
});
|
||||
iiifInfo.getTileSourceOptions();
|
||||
}).to.throwException();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
identifier: 'id',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions();
|
||||
|
||||
expect(options).to.be.an('object');
|
||||
expect(options).to.have.property('version', Versions.VERSION1);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
identifier: 'identifier-version-1.0',
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
|
||||
expect(options).to.not.be(undefined);
|
||||
expect(options).to.not.be(null);
|
||||
expect(options).to.have.property('version', Versions.VERSION1);
|
||||
expect(options).to.have.property('size');
|
||||
expect(options.size).to.be.an('array');
|
||||
expect(options.size.length).to.be(2);
|
||||
expect(options.size[0]).to.be(2000);
|
||||
expect(options.size[1]).to.be(1500);
|
||||
expect(options.quality).to.be('native');
|
||||
expect(options.url).to.be(undefined);
|
||||
expect(options.sizes).to.be(undefined);
|
||||
expect(options.tileSize).to.be(undefined);
|
||||
expect(options.format).to.be('jpg');
|
||||
expect(options.supports).to.be.empty();
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/version2/id',
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
|
||||
expect(options).to.be.an('object');
|
||||
expect(options).to.have.property('version', Versions.VERSION2);
|
||||
expect(options).to.have.property('url', 'http://iiif.test/version2/id');
|
||||
expect(options).to.have.property('format', 'jpg');
|
||||
});
|
||||
|
||||
it('uses preferred options if applicable', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/version2/id',
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
profile: ['http://iiif.io/api/image/2/level2.json'],
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions({
|
||||
quality: 'bitonal',
|
||||
format: 'png',
|
||||
});
|
||||
expect(options).to.have.property('quality', 'bitonal');
|
||||
expect(options).to.have.property('format', 'png');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'@id': 'http://iiif.test/version3/id',
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
profile: 'level2',
|
||||
extraQualities: ['gray', 'bitonal'],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions({
|
||||
quality: 'bitonal',
|
||||
format: 'png',
|
||||
});
|
||||
expect(options).to.have.property('quality', 'bitonal');
|
||||
expect(options).to.have.property('format', 'png');
|
||||
});
|
||||
|
||||
it('ignores preferred options that are not supported', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/version2/id',
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
profile: ['http://iiif.io/api/image/2/level1.json'],
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions({
|
||||
quality: 'bitonal',
|
||||
format: 'png',
|
||||
});
|
||||
expect(options).to.have.property('quality', 'default');
|
||||
expect(options).to.have.property('format', 'jpg');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'@id': 'http://iiif.test/version3/id',
|
||||
width: 2000,
|
||||
height: 1500,
|
||||
profile: 'level1',
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions({
|
||||
quality: 'bitonal',
|
||||
format: 'png',
|
||||
});
|
||||
expect(options).to.have.property('quality', 'default');
|
||||
expect(options).to.have.property('format', 'jpg');
|
||||
});
|
||||
|
||||
it('combines supported features indicated by compliance level and explicitly stated in image info', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile: [
|
||||
'http://iiif.io/api/image/2/level1.json',
|
||||
{
|
||||
supports: ['regionByPct', 'sizeByWh'],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
let options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.supports).to.contain('regionByPct');
|
||||
expect(options.supports).to.contain('sizeByWh');
|
||||
expect(options.supports).to.contain('regionByPx');
|
||||
expect(options.supports).to.contain('sizeByW');
|
||||
expect(options.supports).to.contain('sizeByH');
|
||||
expect(options.supports).to.contain('sizeByPct');
|
||||
expect(options.supports).to.have.length(6);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
id: 'http://iiif.test/id',
|
||||
profile: 'level1',
|
||||
extraFeatures: ['regionByPct', 'sizeByPct'],
|
||||
});
|
||||
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.supports).to.contain('regionByPct');
|
||||
expect(options.supports).to.contain('sizeByPct');
|
||||
expect(options.supports).to.contain('regionByPx');
|
||||
expect(options.supports).to.contain('regionSquare');
|
||||
expect(options.supports).to.contain('sizeByW');
|
||||
expect(options.supports).to.contain('sizeByH');
|
||||
expect(options.supports).to.contain('sizeByWh');
|
||||
expect(options.supports).to.have.length(7);
|
||||
});
|
||||
|
||||
it('uses the first available scale factors and tile sizes', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.be(undefined);
|
||||
expect(options.tileSize).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
scale_factors: [1, 2, 4],
|
||||
tile_width: 512,
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.have.length(3);
|
||||
expect(options.resolutions).to.contain(1);
|
||||
expect(options.resolutions).to.contain(2);
|
||||
expect(options.resolutions).to.contain(4);
|
||||
expect(options.tileSize).to.have.length(2);
|
||||
expect(options.tileSize[0]).to.be(512);
|
||||
expect(options.tileSize[1]).to.be(512);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context':
|
||||
'http://library.stanford.edu/iiif/image-api/1.1/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile:
|
||||
'http://library.stanford.edu/iiif/image-api/compliance.html#level0',
|
||||
scale_factors: [1, 2, 4],
|
||||
tile_width: 512,
|
||||
tile_height: 1024,
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.have.length(3);
|
||||
expect(options.resolutions).to.contain(1);
|
||||
expect(options.resolutions).to.contain(2);
|
||||
expect(options.resolutions).to.contain(4);
|
||||
expect(options.tileSize).to.have.length(2);
|
||||
expect(options.tileSize[0]).to.be(512);
|
||||
expect(options.tileSize[1]).to.be(1024);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile: 'http://iiif.io/api/image/2/level0.json',
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.be(undefined);
|
||||
expect(options.tileSize).to.be(undefined);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile: 'http://iiif.io/api/image/2/level0.json',
|
||||
tiles: [
|
||||
{
|
||||
scaleFactors: [1, 2, 4],
|
||||
width: 512,
|
||||
},
|
||||
{
|
||||
scaleFactors: [1, 2, 4, 8, 16],
|
||||
width: 256,
|
||||
},
|
||||
],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.have.length(3);
|
||||
expect(options.resolutions).to.contain(1);
|
||||
expect(options.resolutions).to.contain(2);
|
||||
expect(options.resolutions).to.contain(4);
|
||||
expect(options.tileSize).to.have.length(2);
|
||||
expect(options.tileSize[0]).to.be(512);
|
||||
expect(options.tileSize[1]).to.be(512);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile: 'http://iiif.io/api/image/2/level0.json',
|
||||
tiles: [
|
||||
{
|
||||
scaleFactors: [1, 2, 4],
|
||||
width: 512,
|
||||
height: 1024,
|
||||
},
|
||||
],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.have.length(3);
|
||||
expect(options.resolutions).to.contain(1);
|
||||
expect(options.resolutions).to.contain(2);
|
||||
expect(options.resolutions).to.contain(4);
|
||||
expect(options.tileSize).to.have.length(2);
|
||||
expect(options.tileSize[0]).to.be(512);
|
||||
expect(options.tileSize[1]).to.be(1024);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
profile: 'level0',
|
||||
tiles: [
|
||||
{
|
||||
scaleFactors: [1, 2, 4, 8],
|
||||
width: 512,
|
||||
height: 256,
|
||||
},
|
||||
],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.resolutions).to.have.length(4);
|
||||
expect(options.resolutions).to.contain(1);
|
||||
expect(options.resolutions).to.contain(2);
|
||||
expect(options.resolutions).to.contain(4);
|
||||
expect(options.resolutions).to.contain(8);
|
||||
expect(options.tileSize).to.have.length(2);
|
||||
expect(options.tileSize[0]).to.be(512);
|
||||
expect(options.tileSize[1]).to.be(256);
|
||||
});
|
||||
});
|
||||
|
||||
it('provides each given size in sizes as OpenLayers Size', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/2/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
'sizes': [
|
||||
{
|
||||
width: 2000,
|
||||
height: 1000,
|
||||
},
|
||||
{
|
||||
width: 1000,
|
||||
height: 500,
|
||||
},
|
||||
{
|
||||
width: 500,
|
||||
height: 250,
|
||||
},
|
||||
],
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.sizes).to.have.length(3);
|
||||
expect(options.sizes[0]).to.have.length(2);
|
||||
expect(options.sizes[0][0]).to.be(2000);
|
||||
expect(options.sizes[0][1]).to.be(1000);
|
||||
expect(options.sizes[1]).to.have.length(2);
|
||||
expect(options.sizes[1][0]).to.be(1000);
|
||||
expect(options.sizes[1][1]).to.be(500);
|
||||
expect(options.sizes[2]).to.have.length(2);
|
||||
expect(options.sizes[2][0]).to.be(500);
|
||||
expect(options.sizes[2][1]).to.be(250);
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'@id': 'http://iiif.test/id',
|
||||
'sizes': [
|
||||
{
|
||||
width: 1500,
|
||||
height: 800,
|
||||
},
|
||||
],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.sizes).to.have.length(1);
|
||||
expect(options.sizes[0]).to.have.length(2);
|
||||
expect(options.sizes[0][0]).to.be(1500);
|
||||
expect(options.sizes[0][1]).to.be(800);
|
||||
});
|
||||
|
||||
it('respects the preferred image formats', function () {
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'id': 'http://iiif.test/id',
|
||||
'profile': 'level0',
|
||||
'preferredFormats': ['png', 'gif'],
|
||||
});
|
||||
let options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.format).to.be('jpg');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'id': 'http://iiif.test/id',
|
||||
'profile': 'level1',
|
||||
'preferredFormats': ['png', 'gif'],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.format).to.be('jpg');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'id': 'http://iiif.test/id',
|
||||
'profile': 'level1',
|
||||
'extraFormats': ['webp', 'gif'],
|
||||
'preferredFormats': ['webp', 'png', 'gif'],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.format).to.be('gif');
|
||||
|
||||
iiifInfo.setImageInfo({
|
||||
'@context': 'http://iiif.io/api/image/3/context.json',
|
||||
'id': 'http://iiif.test/id',
|
||||
'profile': 'level2',
|
||||
'preferredFormats': ['png', 'gif'],
|
||||
});
|
||||
options = iiifInfo.getTileSourceOptions();
|
||||
expect(options.format).to.be('png');
|
||||
});
|
||||
});
|
||||
4412
test/browser/spec/ol/format/kml.test.js
Normal file
4412
test/browser/spec/ol/format/kml.test.js
Normal file
File diff suppressed because it is too large
Load Diff
17
test/browser/spec/ol/format/kml/networklinks.kml
Normal file
17
test/browser/spec/ol/format/kml/networklinks.kml
Normal file
@@ -0,0 +1,17 @@
|
||||
<kml xmlns="http://www.opengis.net/kml/2.2">
|
||||
<Document>
|
||||
<NetworkLink>
|
||||
<name>bar</name>
|
||||
<Link>
|
||||
<href>/bar/bar.kml</href>
|
||||
</Link>
|
||||
</NetworkLink>
|
||||
</Document>
|
||||
<Folder>
|
||||
<NetworkLink>
|
||||
<Link>
|
||||
<href>http://foo.com/foo.kml</href>
|
||||
</Link>
|
||||
</NetworkLink>
|
||||
</Folder>
|
||||
</kml>
|
||||
4661
test/browser/spec/ol/format/kml/states.kml
Normal file
4661
test/browser/spec/ol/format/kml/states.kml
Normal file
File diff suppressed because one or more lines are too long
37
test/browser/spec/ol/format/kml/style.kml
Normal file
37
test/browser/spec/ol/format/kml/style.kml
Normal file
@@ -0,0 +1,37 @@
|
||||
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/kml/2.2 https://developers.google.com/kml/schema/kml22gx.xsd">
|
||||
<Document>
|
||||
<name>Drawing</name>
|
||||
<Placemark id="linepolygon_1436780794279">
|
||||
<Style>
|
||||
<LineStyle>
|
||||
<color>ff0000ff</color>
|
||||
<width>3</width>
|
||||
</LineStyle>
|
||||
<PolyStyle>
|
||||
<color>660000ff</color>
|
||||
</PolyStyle>
|
||||
</Style>
|
||||
<LineString>
|
||||
<coordinates>7.282103855735575,47.252335388740185 7.286372432423239,47.23794977574282 7.353199702540651,47.23711986131712 7.287223923345992,47.26352553438413</coordinates>
|
||||
</LineString>
|
||||
</Placemark>
|
||||
<Placemark id="linepolygon_1436780799384">
|
||||
<Style>
|
||||
<LineStyle>
|
||||
<color>ff0000ff</color>
|
||||
<width>3</width>
|
||||
</LineStyle>
|
||||
<PolyStyle>
|
||||
<color>660000ff</color>
|
||||
</PolyStyle>
|
||||
</Style>
|
||||
<Polygon>
|
||||
<outerBoundaryIs>
|
||||
<LinearRing>
|
||||
<coordinates>7.227134983319887,47.25587491183515 7.23801833800725,47.242582453518516 7.260803078150167,47.2619584739595 7.239912047946697,47.265971706882716 7.227134983319887,47.25587491183515</coordinates>
|
||||
</LinearRing>
|
||||
</outerBoundaryIs>
|
||||
</Polygon>
|
||||
</Placemark>
|
||||
</Document>
|
||||
</kml>
|
||||
267
test/browser/spec/ol/format/mvt.test.js
Normal file
267
test/browser/spec/ol/format/mvt.test.js
Normal file
@@ -0,0 +1,267 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import MVT from '../../../../../src/ol/format/MVT.js';
|
||||
import MultiPolygon from '../../../../../src/ol/geom/MultiPolygon.js';
|
||||
import Point from '../../../../../src/ol/geom/Point.js';
|
||||
import Polygon from '../../../../../src/ol/geom/Polygon.js';
|
||||
import RenderFeature from '../../../../../src/ol/render/Feature.js';
|
||||
|
||||
where('ArrayBuffer.isView').describe('ol.format.MVT', function () {
|
||||
let data;
|
||||
beforeEach(function (done) {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', 'spec/ol/data/14-8938-5680.vector.pbf');
|
||||
xhr.responseType = 'arraybuffer';
|
||||
xhr.onload = function () {
|
||||
data = xhr.response;
|
||||
done();
|
||||
};
|
||||
xhr.send();
|
||||
});
|
||||
|
||||
describe('#readFeatures', function () {
|
||||
const options = {
|
||||
featureProjection: 'EPSG:3857',
|
||||
extent: [
|
||||
1824704.739223726,
|
||||
6141868.096770482,
|
||||
1827150.7241288517,
|
||||
6144314.081675608,
|
||||
],
|
||||
};
|
||||
|
||||
it('uses ol.render.Feature as feature class by default', function () {
|
||||
const format = new MVT({layers: ['water']});
|
||||
const features = format.readFeatures(data, options);
|
||||
expect(features[0]).to.be.a(RenderFeature);
|
||||
});
|
||||
|
||||
it('parses only specified layers', function () {
|
||||
const format = new MVT({layers: ['water']});
|
||||
const features = format.readFeatures(data, options);
|
||||
expect(features.length).to.be(10);
|
||||
});
|
||||
|
||||
it('parses geometries correctly', function () {
|
||||
const format = new MVT({
|
||||
featureClass: Feature,
|
||||
layers: ['poi_label'],
|
||||
});
|
||||
let geometry;
|
||||
|
||||
geometry = format.readFeatures(data)[0].getGeometry();
|
||||
expect(geometry.getType()).to.be('Point');
|
||||
expect(geometry.getCoordinates()).to.eql([-1210, 2681]);
|
||||
|
||||
format.setLayers(['water']);
|
||||
geometry = format.readFeatures(data)[0].getGeometry();
|
||||
expect(geometry.getType()).to.be('Polygon');
|
||||
expect(geometry.getCoordinates()[0].length).to.be(10);
|
||||
expect(geometry.getCoordinates()[0][0]).to.eql([1007, 2302]);
|
||||
|
||||
format.setLayers(['barrier_line']);
|
||||
geometry = format.readFeatures(data)[0].getGeometry();
|
||||
expect(geometry.getType()).to.be('MultiLineString');
|
||||
expect(geometry.getCoordinates()[1].length).to.be(6);
|
||||
expect(geometry.getCoordinates()[1][0]).to.eql([4160, 3489]);
|
||||
});
|
||||
|
||||
it('avoids unnecessary reprojections of the ol.render.Feature', function () {
|
||||
const format = new MVT({
|
||||
layers: ['poi_label'],
|
||||
});
|
||||
const geometry = format.readFeatures(data)[0].getGeometry();
|
||||
expect(geometry.getType()).to.be('Point');
|
||||
expect(geometry.getFlatCoordinates()).to.eql([-1210, 2681]);
|
||||
});
|
||||
|
||||
it('parses id property', function () {
|
||||
// ol.Feature
|
||||
let format = new MVT({
|
||||
featureClass: Feature,
|
||||
layers: ['building'],
|
||||
});
|
||||
let features = format.readFeatures(data, options);
|
||||
expect(features[0].getId()).to.be(2);
|
||||
// ol.render.Feature
|
||||
format = new MVT({
|
||||
layers: ['building'],
|
||||
});
|
||||
features = format.readFeatures(data, options);
|
||||
expect(features[0].getId()).to.be(2);
|
||||
});
|
||||
|
||||
it('accepts custom idProperty', function () {
|
||||
const format = new MVT({
|
||||
featureClass: Feature,
|
||||
layers: ['poi_label'],
|
||||
idProperty: 'osm_id',
|
||||
});
|
||||
const features = format.readFeatures(data, options);
|
||||
|
||||
const first = features[0];
|
||||
expect(first.getId()).to.be(1000000057590683);
|
||||
expect(first.get('osm_id')).to.be(undefined);
|
||||
});
|
||||
|
||||
it('accepts custom idProperty (render features)', function () {
|
||||
const format = new MVT({
|
||||
layers: ['poi_label'],
|
||||
idProperty: 'osm_id',
|
||||
});
|
||||
|
||||
const features = format.readFeatures(data, options);
|
||||
|
||||
const first = features[0];
|
||||
expect(first.getId()).to.be(1000000057590683);
|
||||
expect(first.get('osm_id')).to.be(undefined);
|
||||
});
|
||||
|
||||
it('works if you provide a bogus idProperty', function () {
|
||||
const format = new MVT({
|
||||
layers: ['poi_label'],
|
||||
idProperty: 'bogus',
|
||||
});
|
||||
|
||||
const features = format.readFeatures(data, options);
|
||||
|
||||
const first = features[0];
|
||||
expect(first.getId()).to.be(undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.format.MVT', function () {
|
||||
const options = {
|
||||
featureProjection: 'EPSG:3857',
|
||||
extent: [
|
||||
1824704.739223726,
|
||||
6141868.096770482,
|
||||
1827150.7241288517,
|
||||
6144314.081675608,
|
||||
],
|
||||
};
|
||||
|
||||
describe('#createFeature_', function () {
|
||||
it('accepts a geometryName', function () {
|
||||
const format = new MVT({
|
||||
featureClass: Feature,
|
||||
geometryName: 'myGeom',
|
||||
});
|
||||
const rawFeature = {
|
||||
id: 1,
|
||||
properties: {
|
||||
geometry: 'foo',
|
||||
},
|
||||
type: 1,
|
||||
layer: {
|
||||
name: 'layer1',
|
||||
},
|
||||
};
|
||||
format.readRawGeometry_ = function (
|
||||
{},
|
||||
rawFeature,
|
||||
flatCoordinates,
|
||||
ends
|
||||
) {
|
||||
flatCoordinates.push(0, 0);
|
||||
ends.push(2);
|
||||
};
|
||||
const feature = format.createFeature_({}, rawFeature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.a(Point);
|
||||
expect(feature.get('myGeom')).to.equal(geometry);
|
||||
expect(feature.get('geometry')).to.be('foo');
|
||||
});
|
||||
|
||||
it('detects a Polygon', function () {
|
||||
const format = new MVT({
|
||||
featureClass: Feature,
|
||||
});
|
||||
const rawFeature = {
|
||||
type: 3,
|
||||
properties: {},
|
||||
layer: {
|
||||
name: 'layer1',
|
||||
},
|
||||
};
|
||||
format.readRawGeometry_ = function (
|
||||
{},
|
||||
rawFeature,
|
||||
flatCoordinates,
|
||||
ends
|
||||
) {
|
||||
flatCoordinates.push(0, 0, 3, 0, 3, 3, 0, 3, 0, 0);
|
||||
flatCoordinates.push(1, 1, 1, 2, 2, 2, 2, 1, 1, 1);
|
||||
ends.push(10, 20);
|
||||
};
|
||||
const feature = format.createFeature_({}, rawFeature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.a(Polygon);
|
||||
});
|
||||
|
||||
it('detects a MultiPolygon', function () {
|
||||
const format = new MVT({
|
||||
featureClass: Feature,
|
||||
});
|
||||
const rawFeature = {
|
||||
type: 3,
|
||||
properties: {},
|
||||
layer: {
|
||||
name: 'layer1',
|
||||
},
|
||||
};
|
||||
format.readRawGeometry_ = function (
|
||||
{},
|
||||
rawFeature,
|
||||
flatCoordinates,
|
||||
ends
|
||||
) {
|
||||
flatCoordinates.push(0, 0, 1, 0, 1, 1, 0, 1, 0, 0);
|
||||
flatCoordinates.push(1, 1, 2, 1, 2, 2, 1, 2, 1, 1);
|
||||
ends.push(10, 20);
|
||||
};
|
||||
const feature = format.createFeature_({}, rawFeature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.a(MultiPolygon);
|
||||
});
|
||||
|
||||
it('creates ol.render.Feature instances', function () {
|
||||
const format = new MVT();
|
||||
const rawFeature = {
|
||||
type: 3,
|
||||
properties: {
|
||||
foo: 'bar',
|
||||
},
|
||||
layer: {
|
||||
name: 'layer1',
|
||||
},
|
||||
};
|
||||
let createdFlatCoordinates;
|
||||
let createdEnds;
|
||||
format.readRawGeometry_ = function (
|
||||
{},
|
||||
rawFeature,
|
||||
flatCoordinates,
|
||||
ends
|
||||
) {
|
||||
flatCoordinates.push(0, 0, 1, 0, 1, 1, 1, 0, 0, 0);
|
||||
flatCoordinates.push(1, 1, 2, 1, 2, 2, 2, 1, 1, 1);
|
||||
createdFlatCoordinates = flatCoordinates;
|
||||
ends.push(10, 20);
|
||||
createdEnds = ends;
|
||||
};
|
||||
format.dataProjection.setExtent([0, 0, 4096, 4096]);
|
||||
format.dataProjection.setWorldExtent(options.extent);
|
||||
const feature = format.createFeature_(
|
||||
{},
|
||||
rawFeature,
|
||||
format.adaptOptions(options)
|
||||
);
|
||||
expect(feature).to.be.a(RenderFeature);
|
||||
expect(feature.getType()).to.be('Polygon');
|
||||
expect(feature.getFlatCoordinates()).to.equal(createdFlatCoordinates);
|
||||
expect(feature.getEnds()).to.equal(createdEnds);
|
||||
expect(feature.get('foo')).to.be('bar');
|
||||
});
|
||||
});
|
||||
});
|
||||
140
test/browser/spec/ol/format/osmxml.test.js
Normal file
140
test/browser/spec/ol/format/osmxml.test.js
Normal file
@@ -0,0 +1,140 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import LineString from '../../../../../src/ol/geom/LineString.js';
|
||||
import OSMXML from '../../../../../src/ol/format/OSMXML.js';
|
||||
import Point from '../../../../../src/ol/geom/Point.js';
|
||||
import {get as getProjection, transform} from '../../../../../src/ol/proj.js';
|
||||
|
||||
describe('ol.format.OSMXML', function () {
|
||||
let format;
|
||||
beforeEach(function () {
|
||||
format = new OSMXML();
|
||||
});
|
||||
|
||||
describe('#readProjection', function () {
|
||||
it('returns the default projection from document', function () {
|
||||
const projection = format.readProjectionFromDocument();
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
|
||||
it('returns the default projection from node', function () {
|
||||
const projection = format.readProjectionFromNode();
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeatures', function () {
|
||||
it('can read an empty document', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<osm version="0.6" generator="my hand">' +
|
||||
'</osm>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(0);
|
||||
});
|
||||
|
||||
it('can read nodes', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<osm version="0.6" generator="my hand">' +
|
||||
' <node id="1" lat="1" lon="2">' +
|
||||
' <tag k="name" v="1"/>' +
|
||||
' </node>' +
|
||||
' <node id="2" lat="3" lon="4">' +
|
||||
' <tag k="name" v="2"/>' +
|
||||
' </node>' +
|
||||
'</osm>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(2);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1]);
|
||||
});
|
||||
|
||||
it('can read nodes and ways', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<osm version="0.6" generator="my hand">' +
|
||||
' <node id="1" lat="1" lon="2">' +
|
||||
' <tag k="name" v="1"/>' +
|
||||
' </node>' +
|
||||
' <node id="2" lat="3" lon="4">' +
|
||||
' <tag k="name" v="2"/>' +
|
||||
' </node>' +
|
||||
' <way id="3">' +
|
||||
' <tag k="name" v="3"/>' +
|
||||
' <nd ref="1" />' +
|
||||
' <nd ref="2" />' +
|
||||
' </way>' +
|
||||
'</osm>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(3);
|
||||
const point = fs[0];
|
||||
expect(point).to.be.an(Feature);
|
||||
let g = point.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql([2, 1]);
|
||||
const line = fs[2];
|
||||
expect(line).to.be.an(Feature);
|
||||
g = line.getGeometry();
|
||||
expect(g).to.be.an(LineString);
|
||||
expect(g.getCoordinates()).to.eql([
|
||||
[2, 1],
|
||||
[4, 3],
|
||||
]);
|
||||
});
|
||||
|
||||
it('can read ways before nodes', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<osm version="0.6" generator="my hand">' +
|
||||
' <way id="3">' +
|
||||
' <tag k="name" v="3"/>' +
|
||||
' <nd ref="1" />' +
|
||||
' <nd ref="2" />' +
|
||||
' </way>' +
|
||||
' <node id="1" lat="1" lon="2">' +
|
||||
' <tag k="name" v="1"/>' +
|
||||
' </node>' +
|
||||
' <node id="2" lat="3" lon="4">' +
|
||||
' <tag k="name" v="2"/>' +
|
||||
' </node>' +
|
||||
'</osm>';
|
||||
const fs = format.readFeatures(text);
|
||||
expect(fs).to.have.length(3);
|
||||
const line = fs[2];
|
||||
expect(line).to.be.an(Feature);
|
||||
const g = line.getGeometry();
|
||||
expect(g).to.be.an(LineString);
|
||||
expect(g.getCoordinates()).to.eql([
|
||||
[2, 1],
|
||||
[4, 3],
|
||||
]);
|
||||
});
|
||||
|
||||
it('can transform and read nodes', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<osm version="0.6" generator="my hand">' +
|
||||
' <node id="1" lat="1" lon="2">' +
|
||||
' <tag k="name" v="1"/>' +
|
||||
' </node>' +
|
||||
' <node id="2" lat="3" lon="4">' +
|
||||
' <tag k="name" v="2"/>' +
|
||||
' </node>' +
|
||||
'</osm>';
|
||||
const fs = format.readFeatures(text, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(fs).to.have.length(2);
|
||||
const f = fs[0];
|
||||
expect(f).to.be.an(Feature);
|
||||
const g = f.getGeometry();
|
||||
expect(g).to.be.an(Point);
|
||||
expect(g.getCoordinates()).to.eql(
|
||||
transform([2, 1], 'EPSG:4326', 'EPSG:3857')
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
156
test/browser/spec/ol/format/ows.test.js
Normal file
156
test/browser/spec/ol/format/ows.test.js
Normal file
@@ -0,0 +1,156 @@
|
||||
import OWS from '../../../../../src/ol/format/OWS.js';
|
||||
import {parse} from '../../../../../src/ol/xml.js';
|
||||
|
||||
describe('ol.format.OWS 1.1', function () {
|
||||
const parser = new OWS();
|
||||
|
||||
it('should read ServiceProvider tag properly', function () {
|
||||
const doc = parse(
|
||||
'<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
|
||||
'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
|
||||
'<ows:ServiceProvider>' +
|
||||
'<ows:ProviderName>MiraMon</ows:ProviderName>' +
|
||||
'<ows:ProviderSite ' +
|
||||
'xlink:href="http://www.creaf.uab.es/miramon"/>' +
|
||||
'<ows:ServiceContact>' +
|
||||
'<ows:IndividualName>Joan Maso Pau' +
|
||||
'</ows:IndividualName>' +
|
||||
'<ows:PositionName>Senior Software Engineer' +
|
||||
'</ows:PositionName>' +
|
||||
'<ows:ContactInfo>' +
|
||||
'<ows:Phone>' +
|
||||
'<ows:Voice>+34 93 581 1312</ows:Voice>' +
|
||||
'<ows:Facsimile>+34 93 581 4151' +
|
||||
'</ows:Facsimile>' +
|
||||
'</ows:Phone>' +
|
||||
'<ows:Address>' +
|
||||
'<ows:DeliveryPoint>Fac Ciencies UAB' +
|
||||
'</ows:DeliveryPoint>' +
|
||||
'<ows:City>Bellaterra</ows:City>' +
|
||||
'<ows:AdministrativeArea>Barcelona' +
|
||||
'</ows:AdministrativeArea>' +
|
||||
'<ows:PostalCode>08193</ows:PostalCode>' +
|
||||
'<ows:Country>Spain</ows:Country>' +
|
||||
'<ows:ElectronicMailAddress>joan.maso@uab.es' +
|
||||
'</ows:ElectronicMailAddress>' +
|
||||
'</ows:Address>' +
|
||||
'</ows:ContactInfo>' +
|
||||
'</ows:ServiceContact>' +
|
||||
'</ows:ServiceProvider>' +
|
||||
'</ows:GetCapabilities>'
|
||||
);
|
||||
|
||||
const obj = parser.read(doc);
|
||||
expect(obj).to.be.ok();
|
||||
const serviceProvider = obj.ServiceProvider;
|
||||
expect(serviceProvider).to.be.ok();
|
||||
expect(serviceProvider.ProviderName).to.eql('MiraMon');
|
||||
const url = 'http://www.creaf.uab.es/miramon';
|
||||
expect(serviceProvider.ProviderSite).to.eql(url);
|
||||
const name = 'Joan Maso Pau';
|
||||
expect(serviceProvider.ServiceContact.IndividualName).to.eql(name);
|
||||
const position = 'Senior Software Engineer';
|
||||
expect(serviceProvider.ServiceContact.PositionName).to.eql(position);
|
||||
});
|
||||
|
||||
it('should read ServiceIdentification tag properly', function () {
|
||||
const doc = parse(
|
||||
'<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
|
||||
'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
|
||||
'<ows:ServiceIdentification>' +
|
||||
'<ows:Title>Web Map Tile Service</ows:Title>' +
|
||||
'<ows:Abstract>Service that contrains the map access interface ' +
|
||||
'to some TileMatrixSets</ows:Abstract>' +
|
||||
'<ows:Keywords>' +
|
||||
'<ows:Keyword>tile</ows:Keyword>' +
|
||||
'<ows:Keyword>tile matrix set</ows:Keyword>' +
|
||||
'<ows:Keyword>map</ows:Keyword>' +
|
||||
'</ows:Keywords>' +
|
||||
'<ows:ServiceType>OGC WMTS</ows:ServiceType>' +
|
||||
'<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>' +
|
||||
'<ows:Fees>none</ows:Fees>' +
|
||||
'<ows:AccessConstraints>none</ows:AccessConstraints>' +
|
||||
'</ows:ServiceIdentification>' +
|
||||
'</ows:GetCapabilities>'
|
||||
);
|
||||
const obj = parser.readFromNode(doc.firstChild);
|
||||
expect(obj).to.be.ok();
|
||||
|
||||
const serviceIdentification = obj.ServiceIdentification;
|
||||
expect(serviceIdentification).to.be.ok();
|
||||
expect(serviceIdentification.Abstract).to.eql(
|
||||
'Service that contrains the map access interface to some TileMatrixSets'
|
||||
);
|
||||
expect(serviceIdentification.AccessConstraints).to.eql('none');
|
||||
expect(serviceIdentification.Fees).to.eql('none');
|
||||
expect(serviceIdentification.Title).to.eql('Web Map Tile Service');
|
||||
expect(serviceIdentification.ServiceTypeVersion).to.eql('1.0.0');
|
||||
expect(serviceIdentification.ServiceType).to.eql('OGC WMTS');
|
||||
});
|
||||
|
||||
it('should read OperationsMetadata tag properly', function () {
|
||||
const doc = parse(
|
||||
'<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
|
||||
'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
|
||||
'<ows:OperationsMetadata>' +
|
||||
'<ows:Operation name="GetCapabilities">' +
|
||||
'<ows:DCP>' +
|
||||
'<ows:HTTP>' +
|
||||
'<ows:Get xlink:href=' +
|
||||
'"http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?">' +
|
||||
'<ows:Constraint name="GetEncoding">' +
|
||||
'<ows:AllowedValues>' +
|
||||
'<ows:Value>KVP</ows:Value>' +
|
||||
'<ows:Value>SOAP</ows:Value>' +
|
||||
'</ows:AllowedValues>' +
|
||||
'</ows:Constraint>' +
|
||||
'</ows:Get>' +
|
||||
'</ows:HTTP>' +
|
||||
'</ows:DCP>' +
|
||||
'</ows:Operation>' +
|
||||
'<ows:Operation name="GetTile">' +
|
||||
'<ows:DCP>' +
|
||||
'<ows:HTTP>' +
|
||||
'<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
|
||||
'bin/MiraMon5_0.cgi?"/>' +
|
||||
'<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
|
||||
'bin/MiraMon6_0.cgi?"/>' +
|
||||
'<ows:Post xlink:href="http://www.miramon.uab.es/cgi-' +
|
||||
'bin/MiraMon7_0.cgi?"/>' +
|
||||
'</ows:HTTP>' +
|
||||
'</ows:DCP>' +
|
||||
'</ows:Operation>' +
|
||||
'<ows:Operation name="GetFeatureInfo">' +
|
||||
'<ows:DCP>' +
|
||||
'<ows:HTTP>' +
|
||||
'<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
|
||||
'bin/MiraMon5_0.cgi?"/>' +
|
||||
'</ows:HTTP>' +
|
||||
'</ows:DCP>' +
|
||||
'</ows:Operation>' +
|
||||
'</ows:OperationsMetadata>' +
|
||||
'</ows:GetCapabilities>'
|
||||
);
|
||||
const obj = parser.readFromNode(doc.firstChild);
|
||||
expect(obj).to.be.ok();
|
||||
|
||||
const operationsMetadata = obj.OperationsMetadata;
|
||||
expect(operationsMetadata).to.be.ok();
|
||||
const getCap = operationsMetadata.GetCapabilities;
|
||||
let dcp = getCap.DCP;
|
||||
let url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
|
||||
expect(dcp.HTTP.Get[0].href).to.eql(url);
|
||||
expect(dcp.HTTP.Get[0].Constraint[0].name).to.eql('GetEncoding');
|
||||
expect(dcp.HTTP.Get[0].Constraint[0].AllowedValues.Value[0]).to.eql('KVP');
|
||||
|
||||
url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
|
||||
dcp = operationsMetadata.GetFeatureInfo.DCP;
|
||||
expect(dcp.HTTP.Get[0].href).to.eql(url);
|
||||
expect(dcp.HTTP.Get[0].Constraint).to.be(undefined);
|
||||
|
||||
url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
|
||||
dcp = operationsMetadata.GetTile.DCP;
|
||||
expect(dcp.HTTP.Get[0].href).to.eql(url);
|
||||
expect(dcp.HTTP.Get[0].Constraint).to.be(undefined);
|
||||
});
|
||||
});
|
||||
387
test/browser/spec/ol/format/polyline.test.js
Normal file
387
test/browser/spec/ol/format/polyline.test.js
Normal file
@@ -0,0 +1,387 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import LineString from '../../../../../src/ol/geom/LineString.js';
|
||||
import Polyline, * as polyline from '../../../../../src/ol/format/Polyline.js';
|
||||
import {get as getProjection, transform} from '../../../../../src/ol/proj.js';
|
||||
|
||||
describe('ol.format.Polyline', function () {
|
||||
let format;
|
||||
let points;
|
||||
let flatPoints, encodedFlatPoints, flippedFlatPoints;
|
||||
let floats, smallFloats, encodedFloats;
|
||||
let signedIntegers, encodedSignedIntegers;
|
||||
let unsignedIntegers, encodedUnsignedIntegers;
|
||||
let points3857;
|
||||
|
||||
function resetTestingData() {
|
||||
format = new Polyline();
|
||||
points = [
|
||||
[-120.2, 38.5],
|
||||
[-120.95, 40.7],
|
||||
[-126.453, 43.252],
|
||||
];
|
||||
flatPoints = [-120.2, 38.5, -120.95, 40.7, -126.453, 43.252];
|
||||
flippedFlatPoints = [38.5, -120.2, 40.7, -120.95, 43.252, -126.453];
|
||||
encodedFlatPoints = '_p~iF~ps|U_ulLnnqC_mqNvxq`@';
|
||||
points3857 = [
|
||||
transform([-120.2, 38.5], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([-120.95, 40.7], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([-126.453, 43.252], 'EPSG:4326', 'EPSG:3857'),
|
||||
];
|
||||
|
||||
floats = [0.0, 0.15, -0.01, -0.16, 0.16, 0.01];
|
||||
smallFloats = [0.0, 0.00015, -0.00001, -0.00016, 0.00016, 0.00001];
|
||||
encodedFloats = '?]@^_@A';
|
||||
|
||||
signedIntegers = [0, 15, -1, -16, 16, 1];
|
||||
encodedSignedIntegers = '?]@^_@A';
|
||||
|
||||
unsignedIntegers = [0, 30, 1, 31, 32, 2, 174];
|
||||
encodedUnsignedIntegers = '?]@^_@AmD';
|
||||
}
|
||||
|
||||
// Reset testing data
|
||||
beforeEach(resetTestingData);
|
||||
|
||||
describe('#readProjectionFromText', function () {
|
||||
it('returns the default projection', function () {
|
||||
const projection = format.readProjectionFromText(encodedFlatPoints);
|
||||
expect(projection).to.eql(getProjection('EPSG:4326'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeDeltas', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeDeltas = polyline.encodeDeltas;
|
||||
|
||||
expect(encodeDeltas(flippedFlatPoints, 2)).to.eql(encodedFlatPoints);
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeDeltas', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeDeltas = polyline.decodeDeltas;
|
||||
|
||||
expect(decodeDeltas(encodedFlatPoints, 2)).to.eql(flippedFlatPoints);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeFloats', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeFloats = polyline.encodeFloats;
|
||||
|
||||
expect(encodeFloats(smallFloats)).to.eql(encodedFloats);
|
||||
|
||||
resetTestingData();
|
||||
expect(encodeFloats(smallFloats, 1e5)).to.eql(encodedFloats);
|
||||
|
||||
expect(encodeFloats(floats, 1e2)).to.eql(encodedFloats);
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeFloats', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeFloats = polyline.decodeFloats;
|
||||
|
||||
expect(decodeFloats(encodedFloats)).to.eql(smallFloats);
|
||||
expect(decodeFloats(encodedFloats, 1e5)).to.eql(smallFloats);
|
||||
expect(decodeFloats(encodedFloats, 1e2)).to.eql(floats);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeSignedIntegers', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeSignedIntegers = polyline.encodeSignedIntegers;
|
||||
|
||||
expect(encodeSignedIntegers(signedIntegers)).to.eql(
|
||||
encodedSignedIntegers
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeSignedIntegers', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeSignedIntegers = polyline.decodeSignedIntegers;
|
||||
|
||||
expect(decodeSignedIntegers(encodedSignedIntegers)).to.eql(
|
||||
signedIntegers
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeUnsignedIntegers', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeUnsignedIntegers = polyline.encodeUnsignedIntegers;
|
||||
|
||||
expect(encodeUnsignedIntegers(unsignedIntegers)).to.eql(
|
||||
encodedUnsignedIntegers
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeUnsignedIntegers', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeUnsignedIntegers = polyline.decodeUnsignedIntegers;
|
||||
|
||||
expect(decodeUnsignedIntegers(encodedUnsignedIntegers)).to.eql(
|
||||
unsignedIntegers
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeFloat', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeFloats = polyline.encodeFloats;
|
||||
|
||||
expect(encodeFloats([0.0])).to.eql('?');
|
||||
expect(encodeFloats([-0.00001])).to.eql('@');
|
||||
expect(encodeFloats([0.00001])).to.eql('A');
|
||||
expect(encodeFloats([-0.00002])).to.eql('B');
|
||||
expect(encodeFloats([0.00002])).to.eql('C');
|
||||
expect(encodeFloats([0.00015])).to.eql(']');
|
||||
expect(encodeFloats([-0.00016])).to.eql('^');
|
||||
|
||||
expect(encodeFloats([-0.1], 10)).to.eql('@');
|
||||
expect(encodeFloats([0.1], 10)).to.eql('A');
|
||||
|
||||
expect(encodeFloats([(16 * 32) / 1e5])).to.eql('__@');
|
||||
expect(encodeFloats([(16 * 32 * 32) / 1e5])).to.eql('___@');
|
||||
|
||||
// from the "Encoded Polyline Algorithm Format" page at Google
|
||||
expect(encodeFloats([-179.9832104])).to.eql('`~oia@');
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeFloat', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeFloats = polyline.decodeFloats;
|
||||
|
||||
expect(decodeFloats('?')).to.eql([0.0]);
|
||||
expect(decodeFloats('@')).to.eql([-0.00001]);
|
||||
expect(decodeFloats('A')).to.eql([0.00001]);
|
||||
expect(decodeFloats('B')).to.eql([-0.00002]);
|
||||
expect(decodeFloats('C')).to.eql([0.00002]);
|
||||
expect(decodeFloats(']')).to.eql([0.00015]);
|
||||
expect(decodeFloats('^')).to.eql([-0.00016]);
|
||||
|
||||
expect(decodeFloats('@', 10)).to.eql([-0.1]);
|
||||
expect(decodeFloats('A', 10)).to.eql([0.1]);
|
||||
|
||||
expect(decodeFloats('__@')).to.eql([(16 * 32) / 1e5]);
|
||||
expect(decodeFloats('___@')).to.eql([(16 * 32 * 32) / 1e5]);
|
||||
|
||||
// from the "Encoded Polyline Algorithm Format" page at Google
|
||||
expect(decodeFloats('`~oia@')).to.eql([-179.98321]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeSignedInteger', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeSignedIntegers = polyline.encodeSignedIntegers;
|
||||
|
||||
expect(encodeSignedIntegers([0])).to.eql('?');
|
||||
expect(encodeSignedIntegers([-1])).to.eql('@');
|
||||
expect(encodeSignedIntegers([1])).to.eql('A');
|
||||
expect(encodeSignedIntegers([-2])).to.eql('B');
|
||||
expect(encodeSignedIntegers([2])).to.eql('C');
|
||||
expect(encodeSignedIntegers([15])).to.eql(']');
|
||||
expect(encodeSignedIntegers([-16])).to.eql('^');
|
||||
|
||||
expect(encodeSignedIntegers([16])).to.eql('_@');
|
||||
expect(encodeSignedIntegers([16 * 32])).to.eql('__@');
|
||||
expect(encodeSignedIntegers([16 * 32 * 32])).to.eql('___@');
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeSignedInteger', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeSignedIntegers = polyline.decodeSignedIntegers;
|
||||
|
||||
expect(decodeSignedIntegers('?')).to.eql([0]);
|
||||
expect(decodeSignedIntegers('@')).to.eql([-1]);
|
||||
expect(decodeSignedIntegers('A')).to.eql([1]);
|
||||
expect(decodeSignedIntegers('B')).to.eql([-2]);
|
||||
expect(decodeSignedIntegers('C')).to.eql([2]);
|
||||
expect(decodeSignedIntegers(']')).to.eql([15]);
|
||||
expect(decodeSignedIntegers('^')).to.eql([-16]);
|
||||
|
||||
expect(decodeSignedIntegers('_@')).to.eql([16]);
|
||||
expect(decodeSignedIntegers('__@')).to.eql([16 * 32]);
|
||||
expect(decodeSignedIntegers('___@')).to.eql([16 * 32 * 32]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('encodeUnsignedInteger', function () {
|
||||
it('returns expected value', function () {
|
||||
const encodeUnsignedInteger = polyline.encodeUnsignedInteger;
|
||||
|
||||
expect(encodeUnsignedInteger(0)).to.eql('?');
|
||||
expect(encodeUnsignedInteger(1)).to.eql('@');
|
||||
expect(encodeUnsignedInteger(2)).to.eql('A');
|
||||
expect(encodeUnsignedInteger(30)).to.eql(']');
|
||||
expect(encodeUnsignedInteger(31)).to.eql('^');
|
||||
expect(encodeUnsignedInteger(32)).to.eql('_@');
|
||||
|
||||
expect(encodeUnsignedInteger(32 * 32)).to.eql('__@');
|
||||
expect(encodeUnsignedInteger(5 * 32 * 32)).to.eql('__D');
|
||||
expect(encodeUnsignedInteger(32 * 32 * 32)).to.eql('___@');
|
||||
|
||||
// from the "Encoded Polyline Algorithm Format" page at Google
|
||||
expect(encodeUnsignedInteger(174)).to.eql('mD');
|
||||
});
|
||||
});
|
||||
|
||||
describe('decodeUnsignedInteger', function () {
|
||||
it('returns expected value', function () {
|
||||
const decodeUnsignedIntegers = polyline.decodeUnsignedIntegers;
|
||||
|
||||
expect(decodeUnsignedIntegers('?')).to.eql([0]);
|
||||
expect(decodeUnsignedIntegers('@')).to.eql([1]);
|
||||
expect(decodeUnsignedIntegers('A')).to.eql([2]);
|
||||
expect(decodeUnsignedIntegers(']')).to.eql([30]);
|
||||
expect(decodeUnsignedIntegers('^')).to.eql([31]);
|
||||
expect(decodeUnsignedIntegers('_@')).to.eql([32]);
|
||||
|
||||
expect(decodeUnsignedIntegers('__@')).to.eql([32 * 32]);
|
||||
expect(decodeUnsignedIntegers('__D')).to.eql([5 * 32 * 32]);
|
||||
expect(decodeUnsignedIntegers('___@')).to.eql([32 * 32 * 32]);
|
||||
|
||||
// from the "Encoded Polyline Algorithm Format" page at Google
|
||||
expect(decodeUnsignedIntegers('mD')).to.eql([174]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeature', function () {
|
||||
it('returns the expected feature', function () {
|
||||
const feature = format.readFeature(encodedFlatPoints);
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected feature', function () {
|
||||
const feature = format.readFeature(encodedFlatPoints, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getCoordinates()).to.eql(points3857);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeatures', function () {
|
||||
it('returns the expected feature', function () {
|
||||
const features = format.readFeatures(encodedFlatPoints);
|
||||
expect(features).to.be.an(Array);
|
||||
expect(features).to.have.length(1);
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected features', function () {
|
||||
const features = format.readFeatures(encodedFlatPoints, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(features).to.be.an(Array);
|
||||
expect(features).to.have.length(1);
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.an(Feature);
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getCoordinates()).to.eql(points3857);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readGeometry', function () {
|
||||
it('returns the expected geometry', function () {
|
||||
const geometry = format.readGeometry(encodedFlatPoints);
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
|
||||
});
|
||||
|
||||
it('parses XYZ linestring', function () {
|
||||
const xyz = polyline.encodeDeltas(
|
||||
[38.5, -120.2, 100, 40.7, -120.95, 200, 43.252, -126.453, 20],
|
||||
3
|
||||
);
|
||||
const format = new Polyline({
|
||||
geometryLayout: 'XYZ',
|
||||
});
|
||||
|
||||
const geometry = format.readGeometry(xyz);
|
||||
expect(geometry.getLayout()).to.eql('XYZ');
|
||||
expect(geometry.getCoordinates()).to.eql([
|
||||
[-120.2, 38.5, 100],
|
||||
[-120.95, 40.7, 200],
|
||||
[-126.453, 43.252, 20],
|
||||
]);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected geometry', function () {
|
||||
const geometry = format.readGeometry(encodedFlatPoints, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(geometry).to.be.an(LineString);
|
||||
expect(geometry.getCoordinates()).to.eql(points3857);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readProjection', function () {
|
||||
it('returns the expected projection', function () {
|
||||
const projection = format.readProjection(encodedFlatPoints);
|
||||
expect(projection).to.be(getProjection('EPSG:4326'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('#writeFeature', function () {
|
||||
it('returns the expected text', function () {
|
||||
const feature = new Feature(new LineString(points));
|
||||
expect(format.writeFeature(feature)).to.be(encodedFlatPoints);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected text', function () {
|
||||
const feature = new Feature(new LineString(points3857));
|
||||
expect(
|
||||
format.writeFeature(feature, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
})
|
||||
).to.be(encodedFlatPoints);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#writeFeature', function () {
|
||||
it('returns the expected text', function () {
|
||||
const features = [new Feature(new LineString(points))];
|
||||
expect(format.writeFeatures(features)).to.be(encodedFlatPoints);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected text', function () {
|
||||
const features = [new Feature(new LineString(points3857))];
|
||||
expect(
|
||||
format.writeFeatures(features, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
})
|
||||
).to.be(encodedFlatPoints);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#writeGeometry', function () {
|
||||
it('returns the expected text', function () {
|
||||
const geometry = new LineString(points);
|
||||
expect(format.writeGeometry(geometry)).to.be(encodedFlatPoints);
|
||||
});
|
||||
|
||||
it('transforms and returns the expected text', function () {
|
||||
const geometry = new LineString(points3857);
|
||||
expect(
|
||||
format.writeGeometry(geometry, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
})
|
||||
).to.be(encodedFlatPoints);
|
||||
});
|
||||
});
|
||||
});
|
||||
256
test/browser/spec/ol/format/topojson.test.js
Normal file
256
test/browser/spec/ol/format/topojson.test.js
Normal file
@@ -0,0 +1,256 @@
|
||||
import Feature from '../../../../../src/ol/Feature.js';
|
||||
import FeatureFormat from '../../../../../src/ol/format/Feature.js';
|
||||
import MultiPolygon from '../../../../../src/ol/geom/MultiPolygon.js';
|
||||
import Polygon from '../../../../../src/ol/geom/Polygon.js';
|
||||
import TopoJSON from '../../../../../src/ol/format/TopoJSON.js';
|
||||
import {transform} from '../../../../../src/ol/proj.js';
|
||||
|
||||
const aruba = {
|
||||
type: 'Topology',
|
||||
transform: {
|
||||
scale: [0.036003600360036005, 0.017361589674592462],
|
||||
translate: [-180, -89.99892578124998],
|
||||
},
|
||||
objects: {
|
||||
aruba: {
|
||||
type: 'Polygon',
|
||||
properties: {
|
||||
prop0: 'value0',
|
||||
},
|
||||
arcs: [[0]],
|
||||
id: 533,
|
||||
},
|
||||
},
|
||||
arcs: [
|
||||
[
|
||||
[3058, 5901],
|
||||
[0, -2],
|
||||
[-2, 1],
|
||||
[-1, 3],
|
||||
[-2, 3],
|
||||
[0, 3],
|
||||
[1, 1],
|
||||
[1, -3],
|
||||
[2, -5],
|
||||
[1, -1],
|
||||
],
|
||||
],
|
||||
};
|
||||
|
||||
const zeroId = {
|
||||
type: 'Topology',
|
||||
objects: {
|
||||
foobar: {
|
||||
type: 'Point',
|
||||
id: 0,
|
||||
coordinates: [0, 42],
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const nullGeometry = {
|
||||
type: 'Topology',
|
||||
objects: {
|
||||
foobar: {
|
||||
type: null,
|
||||
properties: {
|
||||
prop0: 'value0',
|
||||
},
|
||||
id: 533,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
describe('ol.format.TopoJSON', function () {
|
||||
let format;
|
||||
before(function () {
|
||||
format = new TopoJSON();
|
||||
});
|
||||
|
||||
describe('constructor', function () {
|
||||
it('creates a new format', function () {
|
||||
expect(format).to.be.a(FeatureFormat);
|
||||
expect(format).to.be.a(TopoJSON);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeaturesFromTopology_()', function () {
|
||||
it('creates an array of features from a topology', function () {
|
||||
const features = format.readFeaturesFromObject(aruba);
|
||||
expect(features).to.have.length(1);
|
||||
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.a(Feature);
|
||||
|
||||
const geometry = feature.getGeometry();
|
||||
expect(geometry).to.be.a(Polygon);
|
||||
|
||||
// Parses identifier
|
||||
expect(feature.getId()).to.be(533);
|
||||
// Parses properties
|
||||
expect(feature.get('prop0')).to.be('value0');
|
||||
|
||||
expect(geometry.getExtent()).to.eql([
|
||||
-70.08100810081008,
|
||||
12.417091709170947,
|
||||
-69.9009900990099,
|
||||
12.608069195591469,
|
||||
]);
|
||||
});
|
||||
|
||||
it('can read a feature with id equal to 0', function () {
|
||||
const features = format.readFeaturesFromObject(zeroId);
|
||||
expect(features).to.have.length(1);
|
||||
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.a(Feature);
|
||||
expect(feature.getId()).to.be(0);
|
||||
});
|
||||
|
||||
it('can read a feature with null geometry', function () {
|
||||
const features = format.readFeaturesFromObject(nullGeometry);
|
||||
expect(features).to.have.length(1);
|
||||
|
||||
const feature = features[0];
|
||||
expect(feature).to.be.a(Feature);
|
||||
expect(feature.getGeometry()).to.be(null);
|
||||
expect(feature.getId()).to.be(533);
|
||||
expect(feature.get('prop0')).to.be('value0');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFeatures()', function () {
|
||||
it('parses simple.json', function (done) {
|
||||
afterLoadText('spec/ol/format/topojson/simple.json', function (text) {
|
||||
const features = format.readFeatures(text);
|
||||
expect(features.length).to.be(3);
|
||||
|
||||
const point = features[0].getGeometry();
|
||||
expect(point.getType()).to.be('Point');
|
||||
expect(point.getFlatCoordinates()).to.eql([102, 0.5]);
|
||||
|
||||
const line = features[1].getGeometry();
|
||||
expect(line.getType()).to.be('LineString');
|
||||
expect(line.getFlatCoordinates()).to.eql([
|
||||
102,
|
||||
0,
|
||||
103,
|
||||
1,
|
||||
104,
|
||||
0,
|
||||
105,
|
||||
1,
|
||||
]);
|
||||
|
||||
const polygon = features[2].getGeometry();
|
||||
expect(polygon.getType()).to.be('Polygon');
|
||||
expect(polygon.getFlatCoordinates()).to.eql([
|
||||
100,
|
||||
0,
|
||||
100,
|
||||
1,
|
||||
101,
|
||||
1,
|
||||
101,
|
||||
0,
|
||||
100,
|
||||
0,
|
||||
]);
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('parses simple.json and transforms', function (done) {
|
||||
afterLoadText('spec/ol/format/topojson/simple.json', function (text) {
|
||||
const features = format.readFeatures(text, {
|
||||
featureProjection: 'EPSG:3857',
|
||||
});
|
||||
expect(features.length).to.be(3);
|
||||
|
||||
const point = features[0].getGeometry();
|
||||
expect(point.getType()).to.be('Point');
|
||||
expect(features[0].getGeometry().getCoordinates()).to.eql(
|
||||
transform([102.0, 0.5], 'EPSG:4326', 'EPSG:3857')
|
||||
);
|
||||
|
||||
const line = features[1].getGeometry();
|
||||
expect(line.getType()).to.be('LineString');
|
||||
expect(line.getCoordinates()).to.eql([
|
||||
transform([102.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([103.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([104.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([105.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
]);
|
||||
|
||||
const polygon = features[2].getGeometry();
|
||||
expect(polygon.getType()).to.be('Polygon');
|
||||
expect(polygon.getCoordinates()).to.eql([
|
||||
[
|
||||
transform([100.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([100.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([101.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([101.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
transform([100.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
|
||||
],
|
||||
]);
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('parses world-110m.json', function (done) {
|
||||
afterLoadText('spec/ol/format/topojson/world-110m.json', function (text) {
|
||||
const features = format.readFeatures(text);
|
||||
expect(features.length).to.be(178);
|
||||
|
||||
const first = features[0];
|
||||
expect(first).to.be.a(Feature);
|
||||
const firstGeom = first.getGeometry();
|
||||
expect(firstGeom).to.be.a(MultiPolygon);
|
||||
expect(firstGeom.getExtent()).to.eql([
|
||||
-180,
|
||||
-85.60903777459777,
|
||||
180,
|
||||
83.64513000000002,
|
||||
]);
|
||||
|
||||
const last = features[177];
|
||||
expect(last).to.be.a(Feature);
|
||||
const lastGeom = last.getGeometry();
|
||||
expect(lastGeom).to.be.a(Polygon);
|
||||
expect(lastGeom.getExtent()).to.eql([
|
||||
25.26325263252633,
|
||||
-22.271802279310577,
|
||||
32.848528485284874,
|
||||
-15.50833810039586,
|
||||
]);
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it("sets the topology's child names as feature property", function (done) {
|
||||
afterLoadText('spec/ol/format/topojson/world-110m.json', function (text) {
|
||||
const format = new TopoJSON({
|
||||
layerName: 'layer',
|
||||
});
|
||||
const features = format.readFeatures(text);
|
||||
expect(features[0].get('layer')).to.be('land');
|
||||
expect(features[177].get('layer')).to.be('countries');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it("only parses features from specified topology's children", function (done) {
|
||||
afterLoadText('spec/ol/format/topojson/world-110m.json', function (text) {
|
||||
const format = new TopoJSON({
|
||||
layers: ['land'],
|
||||
});
|
||||
const features = format.readFeatures(text);
|
||||
expect(features.length).to.be(1);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
39
test/browser/spec/ol/format/topojson/simple.json
Normal file
39
test/browser/spec/ol/format/topojson/simple.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"type": "Topology",
|
||||
"objects": {
|
||||
"example": {
|
||||
"type": "GeometryCollection",
|
||||
"geometries": [
|
||||
{
|
||||
"type": "Point",
|
||||
"properties": {
|
||||
"prop0": "value0"
|
||||
},
|
||||
"coordinates": [102, 0.5]
|
||||
},
|
||||
{
|
||||
"type": "LineString",
|
||||
"properties": {
|
||||
"prop0": "value0",
|
||||
"prop1": 0
|
||||
},
|
||||
"arcs": [0]
|
||||
},
|
||||
{
|
||||
"type": "Polygon",
|
||||
"properties": {
|
||||
"prop0": "value0",
|
||||
"prop1": {
|
||||
"this": "that"
|
||||
}
|
||||
},
|
||||
"arcs": [[-2]]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"arcs": [
|
||||
[[102, 0], [103, 1], [104, 0], [105, 1]],
|
||||
[[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]
|
||||
]
|
||||
}
|
||||
1
test/browser/spec/ol/format/topojson/world-110m.json
Normal file
1
test/browser/spec/ol/format/topojson/world-110m.json
Normal file
File diff suppressed because one or more lines are too long
1905
test/browser/spec/ol/format/wfs.test.js
Normal file
1905
test/browser/spec/ol/format/wfs.test.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
<?xml version='1.0' encoding="ISO-8859-1" ?>
|
||||
<wfs:FeatureCollection
|
||||
xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://intranet.rijkswaterstaat.nl/services/geoservices/nwb_wegen?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=feature:AAA64&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" numberOfFeatures="0">
|
||||
</wfs:FeatureCollection>
|
||||
4
test/browser/spec/ol/format/wfs/GetFeatureMultiple.xml
Normal file
4
test/browser/spec/ol/format/wfs/GetFeatureMultiple.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<wfs:Query typeName="topp:states" xmlns:topp="http://www.openplans.org/topp"/>
|
||||
<wfs:Query typeName="topp:cities" xmlns:topp="http://www.openplans.org/topp"/>
|
||||
</wfs:GetFeature>
|
||||
1
test/browser/spec/ol/format/wfs/Native.xml
Normal file
1
test/browser/spec/ol/format/wfs/Native.xml
Normal file
@@ -0,0 +1 @@
|
||||
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Native vendorId="ORACLE" safeToIgnore="true">ALTER SESSION ENABLE PARALLEL DML</wfs:Native><wfs:Native vendorId="ORACLE" safeToIgnore="false">Another native line goes here</wfs:Native></wfs:Transaction>
|
||||
9
test/browser/spec/ol/format/wfs/NumberOfFeatures.xml
Normal file
9
test/browser/spec/ol/format/wfs/NumberOfFeatures.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version='1.0' encoding="ISO-8859-1" ?>
|
||||
<wfs:FeatureCollection
|
||||
xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://intranet.rijkswaterstaat.nl/services/geoservices/nwb_wegen?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=feature:AAA64&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" numberOfFeatures="625">
|
||||
</wfs:FeatureCollection>
|
||||
45
test/browser/spec/ol/format/wfs/TransactionMulti.xml
Normal file
45
test/browser/spec/ol/format/wfs/TransactionMulti.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
|
||||
<wfs:Insert>
|
||||
<feature:states xmlns:feature="http://www.openplans.org/topp">
|
||||
<feature:the_geom>
|
||||
<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:pointMember>
|
||||
<gml:Point>
|
||||
<gml:pos srsDimension="2">1 2</gml:pos>
|
||||
</gml:Point>
|
||||
</gml:pointMember>
|
||||
</gml:MultiPoint>
|
||||
</feature:the_geom>
|
||||
<feature:foo>bar</feature:foo>
|
||||
</feature:states>
|
||||
</wfs:Insert>
|
||||
<wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<wfs:Property>
|
||||
<wfs:Name>the_geom</wfs:Name>
|
||||
<wfs:Value>
|
||||
<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:pointMember>
|
||||
<gml:Point>
|
||||
<gml:pos srsDimension="2">1 2</gml:pos>
|
||||
</gml:Point>
|
||||
</gml:pointMember>
|
||||
</gml:MultiPoint>
|
||||
</wfs:Value>
|
||||
</wfs:Property>
|
||||
<wfs:Property>
|
||||
<wfs:Name>foo</wfs:Name>
|
||||
<wfs:Value>bar</wfs:Value>
|
||||
</wfs:Property>
|
||||
<wfs:Property>
|
||||
<wfs:Name>nul</wfs:Name>
|
||||
</wfs:Property>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:FeatureId fid="fid.42"/>
|
||||
</ogc:Filter>
|
||||
</wfs:Update>
|
||||
<wfs:Delete xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:FeatureId fid="fid.37"/>
|
||||
</ogc:Filter>
|
||||
</wfs:Delete>
|
||||
</wfs:Transaction>
|
||||
@@ -0,0 +1,37 @@
|
||||
<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd">
|
||||
<Insert>
|
||||
<states xmlns="http://www.openplans.org/topp">
|
||||
<the_geom>
|
||||
<LineString xmlns="http://www.opengis.net/gml">
|
||||
<coordinates decimal="." cs="," ts=" ">1.1,2 3,4.2</coordinates>
|
||||
</LineString>
|
||||
</the_geom>
|
||||
<foo>bar</foo>
|
||||
</states>
|
||||
</Insert>
|
||||
<Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<Property>
|
||||
<Name>the_geom</Name>
|
||||
<Value>
|
||||
<LineString xmlns="http://www.opengis.net/gml">
|
||||
<coordinates decimal="." cs="," ts=" ">1.1,2 3,4.2</coordinates>
|
||||
</LineString>
|
||||
</Value>
|
||||
</Property>
|
||||
<Property>
|
||||
<Name>foo</Name>
|
||||
<Value>bar</Value>
|
||||
</Property>
|
||||
<Property>
|
||||
<Name>nul</Name>
|
||||
</Property>
|
||||
<Filter xmlns="http://www.opengis.net/ogc">
|
||||
<FeatureId fid="fid.42"/>
|
||||
</Filter>
|
||||
</Update>
|
||||
<Delete xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<Filter xmlns="http://www.opengis.net/ogc">
|
||||
<FeatureId fid="fid.37"/>
|
||||
</Filter>
|
||||
</Delete>
|
||||
</Transaction>
|
||||
@@ -0,0 +1,32 @@
|
||||
<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd">
|
||||
<Insert>
|
||||
<states xmlns="http://www.openplans.org/topp">
|
||||
<the_geom>
|
||||
<LineString xmlns="http://www.opengis.net/gml">
|
||||
<coordinates decimal="." cs="," ts=" ">1.1,2,4 3,4.2,5</coordinates>
|
||||
</LineString>
|
||||
</the_geom>
|
||||
<foo>bar</foo>
|
||||
</states>
|
||||
</Insert>
|
||||
<Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<Property>
|
||||
<Name>the_geom</Name>
|
||||
<Value>
|
||||
<LineString xmlns="http://www.opengis.net/gml">
|
||||
<coordinates decimal="." cs="," ts=" ">1.1,2,6 3,4.2,7</coordinates>
|
||||
</LineString>
|
||||
</Value>
|
||||
</Property>
|
||||
<Property>
|
||||
<Name>foo</Name>
|
||||
<Value>bar</Value>
|
||||
</Property>
|
||||
<Property>
|
||||
<Name>nul</Name>
|
||||
</Property>
|
||||
<Filter xmlns="http://www.opengis.net/ogc">
|
||||
<FeatureId fid="fid.42"/>
|
||||
</Filter>
|
||||
</Update>
|
||||
</Transaction>
|
||||
40
test/browser/spec/ol/format/wfs/TransactionMulti_3D.xml
Normal file
40
test/browser/spec/ol/format/wfs/TransactionMulti_3D.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
|
||||
<wfs:Insert>
|
||||
<feature:states xmlns:feature="http://www.openplans.org/topp">
|
||||
<feature:the_geom>
|
||||
<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:pointMember>
|
||||
<gml:Point>
|
||||
<gml:pos srsDimension="3">1 2 3</gml:pos>
|
||||
</gml:Point>
|
||||
</gml:pointMember>
|
||||
</gml:MultiPoint>
|
||||
</feature:the_geom>
|
||||
<feature:foo>bar</feature:foo>
|
||||
</feature:states>
|
||||
</wfs:Insert>
|
||||
<wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
|
||||
<wfs:Property>
|
||||
<wfs:Name>the_geom</wfs:Name>
|
||||
<wfs:Value>
|
||||
<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:pointMember>
|
||||
<gml:Point>
|
||||
<gml:pos srsDimension="3">1 2 3</gml:pos>
|
||||
</gml:Point>
|
||||
</gml:pointMember>
|
||||
</gml:MultiPoint>
|
||||
</wfs:Value>
|
||||
</wfs:Property>
|
||||
<wfs:Property>
|
||||
<wfs:Name>foo</wfs:Name>
|
||||
<wfs:Value>bar</wfs:Value>
|
||||
</wfs:Property>
|
||||
<wfs:Property>
|
||||
<wfs:Name>nul</wfs:Name>
|
||||
</wfs:Property>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:FeatureId fid="fid.42"/>
|
||||
</ogc:Filter>
|
||||
</wfs:Update>
|
||||
</wfs:Transaction>
|
||||
16
test/browser/spec/ol/format/wfs/TransactionResponse.xml
Normal file
16
test/browser/spec/ol/format/wfs/TransactionResponse.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<wfs:TransactionResponse version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<wfs:TransactionSummary>
|
||||
<wfs:totalInserted>0</wfs:totalInserted>
|
||||
<wfs:totalUpdated>1</wfs:totalUpdated>
|
||||
<wfs:totalDeleted>0</wfs:totalDeleted>
|
||||
</wfs:TransactionSummary>
|
||||
<wfs:TransactionResults/>
|
||||
<wfs:InsertResults>
|
||||
<wfs:Feature>
|
||||
<ogc:FeatureId fid="parcelle.40"/>
|
||||
</wfs:Feature>
|
||||
<wfs:Feature>
|
||||
<ogc:FeatureId fid="parcelle.41"/>
|
||||
</wfs:Feature>
|
||||
</wfs:InsertResults>
|
||||
</wfs:TransactionResponse>
|
||||
1
test/browser/spec/ol/format/wfs/TransactionSrs.xml
Normal file
1
test/browser/spec/ol/format/wfs/TransactionSrs.xml
Normal file
@@ -0,0 +1 @@
|
||||
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Insert><feature:FAULTS xmlns:feature="http://foo"><feature:the_geom><gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:900913"><gml:curveMember><gml:LineString srsName="EPSG:900913"><gml:posList srsDimension="2">-5178372.1885436 1992365.7775042 -4434792.7774889 1601008.1927386 -4043435.1927233 2148908.8114105</gml:posList></gml:LineString></gml:curveMember></gml:MultiCurve></feature:the_geom><feature:TYPE>xyz</feature:TYPE></feature:FAULTS></wfs:Insert></wfs:Transaction>
|
||||
23
test/browser/spec/ol/format/wfs/TransactionUpdate.xml
Normal file
23
test/browser/spec/ol/format/wfs/TransactionUpdate.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<Update typeName="foo:FAULTS" xmlns:foo="http://foo">
|
||||
<Property>
|
||||
<Name>the_geom</Name>
|
||||
<Value><MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:900913">
|
||||
<lineStringMember>
|
||||
<LineString srsName="EPSG:900913">
|
||||
<posList srsDimension="2">-12279454 6741885 -12064207
|
||||
6732101 -11941908 6595126
|
||||
-12240318 6507071 -12416429
|
||||
6604910</posList>
|
||||
</LineString>
|
||||
</lineStringMember>
|
||||
</MultiLineString></Value>
|
||||
</Property>
|
||||
<Filter xmlns="http://www.opengis.net/ogc">
|
||||
<FeatureId fid="FAULTS.4455"/>
|
||||
</Filter>
|
||||
</Update>
|
||||
</Transaction>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<Insert>
|
||||
<foo:FAULTS xmlns:foo="http://foo">
|
||||
<foo:the_geom>
|
||||
<MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:900913">
|
||||
<lineStringMember>
|
||||
<LineString srsName="EPSG:900913">
|
||||
<posList srsDimension="2">-12279454 6741885 -12064207
|
||||
6732101 -11941908 6595126
|
||||
-12240318 6507071 -12416429
|
||||
6604910</posList>
|
||||
</LineString>
|
||||
</lineStringMember>
|
||||
</MultiLineString>
|
||||
</foo:the_geom>
|
||||
<foo:geom2>
|
||||
<MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:900913">
|
||||
<lineStringMember>
|
||||
<LineString srsName="EPSG:900913">
|
||||
<posList srsDimension="2">-12000000 6700000 -12000001 6700001 -12000002 6700002</posList>
|
||||
</LineString>
|
||||
</lineStringMember>
|
||||
</MultiLineString>
|
||||
</foo:geom2>
|
||||
</foo:FAULTS>
|
||||
</Insert>
|
||||
</Transaction>
|
||||
47
test/browser/spec/ol/format/wfs/boundedBy.xml
Normal file
47
test/browser/spec/ol/format/wfs/boundedBy.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<wfs:FeatureCollection
|
||||
xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://ontwikkel.intranet.rijkswaterstaat.nl/services/geoservices/ov_zonering?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=AAA212&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:28992">
|
||||
<gml:lowerCorner>3197.880000 306457.313000</gml:lowerCorner>
|
||||
<gml:upperCorner>280339.156000 613850.438000</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<gml:featureMember>
|
||||
|
||||
<rws:AAA212 gml:id="AAA212.791">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:28992">
|
||||
<gml:lowerCorner>196507.469000 502347.938000</gml:lowerCorner>
|
||||
<gml:upperCorner>202430.844000 510383.719000</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<rws:geometry>
|
||||
|
||||
<gml:MultiSurface srsName="EPSG:28992">
|
||||
<gml:surfaceMembers>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">200448.047000 510383.719000 198475.031000 509253.875000 198477.422000 507339.688000 196507.469000 505841.969000 196507.625000 504980.281000 196621.359000 505029.969000 196825.328000 505114.000000 197310.031000 505183.469000 197636.609000 505148.750000 197837.594000 505061.563000 197941.031000 504953.688000 198003.094000 504817.719000 198023.781000 504721.688000 198016.391000 504597.531000 197907.234000 504363.219000 197716.734000 504013.969000 197700.156000 503567.563000 197775.531000 503373.969000 197930.688000 503153.781000 198034.234000 503045.594000 198170.078000 502932.125000 198504.047000 502725.250000 198858.719000 502550.875000 199138.000000 502460.719000 199336.000000 502347.938000 199044.125000 504910.969000 199549.359000 507065.781000 200280.594000 506878.938000 202430.844000 507474.625000 202430.844000 508850.906000 200448.047000 510383.719000 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMembers>
|
||||
</gml:MultiSurface>
|
||||
</rws:geometry>
|
||||
<rws:OBJECTID>791</rws:OBJECTID>
|
||||
<rws:HECTARES>1800.89</rws:HECTARES>
|
||||
<rws:ZONENR>4620</rws:ZONENR>
|
||||
|
||||
<rws:NULZONES> </rws:NULZONES>
|
||||
<rws:AREA>0</rws:AREA>
|
||||
<rws:PERIMETER>24305.1</rws:PERIMETER>
|
||||
</rws:AAA212>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
197
test/browser/spec/ol/format/wfs/mapserver.xml
Normal file
197
test/browser/spec/ol/format/wfs/mapserver.xml
Normal file
@@ -0,0 +1,197 @@
|
||||
<?xml version='1.0' encoding="UTF-8" ?>
|
||||
<wfs:FeatureCollection
|
||||
xmlns:ms="http://mapserver.gis.umn.edu/mapserver"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://localhost/cgi-bin/mtbows?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=ms:Historische_Messtischblaetter_WFS&OUTPUTFORMAT=text/xml;%20subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>10.499999 50.599998</gml:lowerCorner>
|
||||
<gml:upperCorner>11.500001 51.000004</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055885">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1205816.630831 6585772.755548</gml:lowerCorner>
|
||||
<gml:upperCorner>1224367.576331 6603402.922801</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1205816.939380 6585772.755548 1205816.630831 6603402.592694 1224367.261890 6603402.922801 1224367.576331 6585773.084486 1205816.939380 6585772.755548 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055885</ms:mtbid>
|
||||
<ms:blattnr>51_31</ms:blattnr>
|
||||
<ms:time>1936</ms:time>
|
||||
<ms:titel>Arnstadt</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335959709</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5131.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5131</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055703">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1224366.733352 6603402.922797</gml:lowerCorner>
|
||||
<gml:upperCorner>1242917.681900 6621070.996395</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1224367.049596 6603402.922797 1224366.733352 6621070.658850 1242917.359733 6621070.996395 1242917.681900 6603403.259147 1224367.049596 6603402.922797 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055703</ms:mtbid>
|
||||
<ms:blattnr>50_32</ms:blattnr>
|
||||
<ms:time>1878</ms:time>
|
||||
<ms:titel>Erfurt</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335958907</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5032_1878.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5032_1878</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055704">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1224366.733352 6603402.922797</gml:lowerCorner>
|
||||
<gml:upperCorner>1242917.681900 6621070.996395</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1224367.049596 6603402.922797 1224366.733352 6621070.658850 1242917.359733 6621070.996395 1242917.681900 6603403.259147 1224367.049596 6603402.922797 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055704</ms:mtbid>
|
||||
<ms:blattnr>50_32</ms:blattnr>
|
||||
<ms:time>1905</ms:time>
|
||||
<ms:titel>Erfurt</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335958915</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5032_1905.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5032_1905</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055696">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1168715.286189 6603401.951223</gml:lowerCorner>
|
||||
<gml:upperCorner>1187266.213287 6621070.002563</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1168715.584649 6603401.951223 1168715.286189 6621069.683820 1187265.908897 6621070.002563 1187266.213287 6603402.268837 1168715.584649 6603401.951223 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055696</ms:mtbid>
|
||||
<ms:blattnr>50_29</ms:blattnr>
|
||||
<ms:time>1918</ms:time>
|
||||
<ms:titel>Fröttstädt</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335969488</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5029_1918.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5029_1918</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055699">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1187265.802750 6603402.268835</gml:lowerCorner>
|
||||
<gml:upperCorner>1205816.736977 6621070.327575</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1187266.107140 6603402.268835 1187265.802750 6621070.002561 1205816.426659 6621070.327575 1205816.736977 6603402.592696 1187266.107140 6603402.268835 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055699</ms:mtbid>
|
||||
<ms:blattnr>50_30</ms:blattnr>
|
||||
<ms:time>1936</ms:time>
|
||||
<ms:titel>Gotha</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335958877</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5030_1929.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5030_1929</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71056242">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1205817.246161 6550626.582163</gml:lowerCorner>
|
||||
<gml:upperCorner>1224368.199845 6568181.598557</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1205817.551211 6550626.582163 1205817.246161 6568181.270783 1224367.888970 6568181.598557 1224368.199845 6550626.908779 1205817.551211 6550626.582163 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71056242</ms:mtbid>
|
||||
<ms:blattnr>53_31</ms:blattnr>
|
||||
<ms:time>1905</ms:time>
|
||||
<ms:titel>Ilmenau</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335961355</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5331_1905.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5331_1905</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055889">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="EPSG:900913">
|
||||
<gml:lowerCorner>1242917.575754 6585773.419639</gml:lowerCorner>
|
||||
<gml:upperCorner>1261468.535543 6603403.601734</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:900913">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList srsDimension="2">1242917.896084 6585773.419639 1242917.575754 6603403.259145 1261468.209327 6603403.601734 1261468.535543 6585773.761014 1242917.896084 6585773.419639 </gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:mtbid>71055889</ms:mtbid>
|
||||
<ms:blattnr>51_33</ms:blattnr>
|
||||
<ms:time>1888</ms:time>
|
||||
<ms:titel>Kranichfeld</ms:titel>
|
||||
<ms:permalink>http://digital.slub-dresden.de/id335959733</ms:permalink>
|
||||
<ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5133_1873.jpg</ms:original>
|
||||
<ms:dateiname>df_dk_0010001_5133_1873</ms:dateiname>
|
||||
</ms:Historische_Messtischblaetter_WFS>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
89
test/browser/spec/ol/format/wfs/polygonv2.xml
Normal file
89
test/browser/spec/ol/format/wfs/polygonv2.xml
Normal file
@@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=polygon&OUTPUTFORMAT=XMLSCHEMA">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:4326">
|
||||
<gml:coordinates>-0.768746,47.003018 3.002191,47.925567</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<gml:featureMember>
|
||||
<ms:polygon fid="1">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:4326">
|
||||
<gml:coordinates>-0.768746,47.003018 0.532597,47.925567</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:MultiPolygon srsName="EPSG:4326">
|
||||
<gml:polygonMember>
|
||||
<gml:Polygon>
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates>-0.318987,47.003018 -0.768746,47.358268 -0.574463,47.684285 -0.347374,47.854602 -0.006740,47.925567 0.135191,47.726864 0.149384,47.599127 0.419052,47.670092 0.532597,47.428810 0.305508,47.443003 0.475824,47.144948 0.064225,47.201721 -0.318987,47.003018 </gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
<gml:innerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates>-0.035126,47.485582 -0.035126,47.485582 -0.049319,47.641706 -0.233829,47.655899 -0.375760,47.457196 -0.276408,47.286879 -0.035126,47.485582 </gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:innerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</gml:polygonMember>
|
||||
</gml:MultiPolygon>
|
||||
</ms:msGeometry>
|
||||
<ms:ogc_fid>1</ms:ogc_fid>
|
||||
<ms:name>My Polygon with hole</ms:name>
|
||||
<ms:id>0</ms:id>
|
||||
</ms:polygon>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:polygon fid="2">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:4326">
|
||||
<gml:coordinates>1.511919,47.088176 3.002191,47.882988</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:Polygon srsName="EPSG:4326">
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates>1.625463,47.357844 1.511919,47.741057 1.880938,47.882988 2.420275,47.797830 2.789295,47.485582 3.002191,47.457196 2.874453,47.088176 2.178993,47.343651 1.625463,47.357844 </gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</ms:msGeometry>
|
||||
<ms:ogc_fid>2</ms:ogc_fid>
|
||||
<ms:name>My simple Polygon</ms:name>
|
||||
<ms:id>0</ms:id>
|
||||
</ms:polygon>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ms:polygon fid="3">
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:4326">
|
||||
<gml:coordinates>0.000000,45.000000 2.000000,47.000000</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<ms:msGeometry>
|
||||
<gml:MultiPolygon srsName="EPSG:4326">
|
||||
<gml:polygonMember>
|
||||
<gml:Polygon>
|
||||
<gml:outerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates>0.000000,45.000000 2.000000,45.000000 2.000000,47.000000 0.000000,47.000000 0.000000,45.000000 </gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:outerBoundaryIs>
|
||||
<gml:innerBoundaryIs>
|
||||
<gml:LinearRing>
|
||||
<gml:coordinates>0.500000,45.500000 1.500000,45.500000 1.500000,46.500000 0.500000,46.500000 0.500000,45.500000 </gml:coordinates>
|
||||
</gml:LinearRing>
|
||||
</gml:innerBoundaryIs>
|
||||
</gml:Polygon>
|
||||
</gml:polygonMember>
|
||||
</gml:MultiPolygon>
|
||||
</ms:msGeometry>
|
||||
<ms:ogc_fid>3</ms:ogc_fid>
|
||||
<ms:name>my polygon with hole</ms:name>
|
||||
<ms:id>3</ms:id>
|
||||
</ms:polygon>
|
||||
</gml:featureMember>
|
||||
</wfs:FeatureCollection>
|
||||
233
test/browser/spec/ol/format/wfs/topp-states-wfs.xml
Normal file
233
test/browser/spec/ol/format/wfs/topp-states-wfs.xml
Normal file
@@ -0,0 +1,233 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
|
||||
xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
|
||||
xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<topp:states gml:id="states.1">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
|
||||
<gml:upperCorner>42.509 -87.507</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>37.511 -88.071 37.476 -88.087 37.442 -88.311 37.409
|
||||
-88.359 37.421 -88.419 37.401 -88.467 37.296 -88.511 37.257
|
||||
-88.501 37.205 -88.451 37.156 -88.422 37.098 -88.451 37.072
|
||||
-88.476 37.068 -88.491 37.064 -88.517 37.072 -88.559 37.109
|
||||
-88.614 37.135 -88.688 37.141 -88.739 37.152 -88.746 37.202
|
||||
-88.863 37.218 -88.932 37.221 -88.993 37.185 -89.065 37.112
|
||||
-89.116 37.093 -89.146 37.064 -89.169 37.025 -89.174 36.998
|
||||
-89.151 36.988 -89.129 36.986 -89.193 37.028 -89.211 37.041
|
||||
-89.237 37.087 -89.264 37.091 -89.284 37.085 -89.303 37.061
|
||||
-89.309 37.027 -89.264 37.008 -89.262 36.999 -89.282 37.009
|
||||
-89.311 37.049 -89.382 37.099 -89.379 37.137 -89.423 37.165
|
||||
-89.441 37.224 -89.468 37.253 -89.465 37.256 -89.489 37.276
|
||||
-89.513 37.304 -89.513 37.329 -89.501 37.339 -89.468 37.355
|
||||
-89.435 37.411 -89.427 37.453 -89.453 37.491 -89.494 37.571
|
||||
-89.524 37.615 -89.513 37.651 -89.519 37.679 -89.513 37.694
|
||||
-89.521 37.706 -89.581 37.745 -89.666 37.783 -89.675 37.804
|
||||
-89.691 37.841 -89.728 37.905 -89.851 37.905 -89.861 37.891
|
||||
-89.866 37.875 -89.901 37.878 -89.937 37.911 -89.978 37.963
|
||||
-89.958 37.969 -90.011 37.993 -90.041 38.032 -90.119 38.053
|
||||
-90.134 38.088 -90.207 38.122 -90.254 38.166 -90.289 38.188
|
||||
-90.336 38.234 -90.364 38.323 -90.369 38.365 -90.358 38.391
|
||||
-90.339 38.427 -90.301 38.518 -90.265 38.532 -90.261 38.562
|
||||
-90.241 38.611 -90.183 38.658 -90.183 38.701 -90.202 38.723
|
||||
-90.196 38.773 -90.163 38.785 -90.135 38.801 -90.121 38.831
|
||||
-90.113 38.853 -90.132 38.914 -90.243 38.924 -90.278 38.924
|
||||
-90.319 38.962 -90.413 38.959 -90.469 38.891 -90.531 38.871
|
||||
-90.571 38.881 -90.627 38.935 -90.668 39.037 -90.706 39.058
|
||||
-90.707 39.093 -90.691 39.144 -90.716 39.195 -90.718 39.224
|
||||
-90.732 39.247 -90.738 39.296 -90.779 39.351 -90.851 39.401
|
||||
-90.947 39.444 -91.036 39.473 -91.064 39.528 -91.093 39.552
|
||||
-91.156 39.601 -91.203 39.685 -91.317 39.724 -91.367 39.761
|
||||
-91.373 39.803 -91.381 39.863 -91.449 39.885 -91.451 39.901
|
||||
-91.434 39.921 -91.431 39.946 -91.447 40.005 -91.487 40.066
|
||||
-91.504 40.134 -91.516 40.201 -91.506 40.251 -91.498 40.309
|
||||
-91.486 40.371 -91.448 40.386 -91.418 40.392 -91.385 40.402
|
||||
-91.372 40.447 -91.385 40.503 -91.374 40.528 -91.382 40.547
|
||||
-91.412 40.572 -91.411 40.603 -91.375 40.639 -91.262 40.643
|
||||
-91.214 40.656 -91.162 40.682 -91.129 40.705 -91.119 40.761
|
||||
-91.092 40.833 -91.088 40.879 -91.049 40.923 -90.983 40.951
|
||||
-90.961 41.071 -90.954 41.104 -90.957 41.144 -90.991 41.165
|
||||
-91.018 41.176 -91.056 41.231 -91.101 41.267 -91.102 41.334
|
||||
-91.073 41.401 -91.055 41.423 -91.027 41.431 -91.001 41.421
|
||||
-90.949 41.444 -90.844 41.449 -90.779 41.451 -90.708 41.462
|
||||
-90.658 41.509 -90.601 41.525 -90.541 41.527 -90.454 41.543
|
||||
-90.434 41.567 -90.423 41.586 -90.348 41.602 -90.339 41.649
|
||||
-90.341 41.722 -90.326 41.756 -90.304 41.781 -90.255 41.806
|
||||
-90.195 41.931 -90.154 41.983 -90.142 42.033 -90.151 42.061
|
||||
-90.168 42.103 -90.166 42.121 -90.176 42.122 -90.191 42.159
|
||||
-90.231 42.197 -90.323 42.211 -90.367 42.242 -90.407 42.263
|
||||
-90.417 42.341 -90.427 42.361 -90.441 42.388 -90.491 42.421
|
||||
-90.563 42.461 -90.605 42.475 -90.648 42.494 -90.651 42.509
|
||||
-90.638 42.508 -90.419 42.504 -89.923 42.503 -89.834 42.497
|
||||
-89.401 42.497 -89.359 42.491 -88.939 42.491 -88.764 42.489
|
||||
-88.706 42.491 -88.297 42.489 -88.194 42.489 -87.797 42.314
|
||||
-87.836 42.156 -87.761 42.059 -87.671 41.847 -87.612 41.723
|
||||
-87.529 41.469 -87.532 41.301 -87.532 41.173 -87.531 41.009
|
||||
-87.532 40.745 -87.532 40.494 -87.537 40.483 -87.535 40.166
|
||||
-87.535 39.887 -87.535 39.609 -87.535 39.477 -87.538 39.351
|
||||
-87.541 39.338 -87.597 39.307 -87.625 39.297 -87.611 39.281
|
||||
-87.615 39.258 -87.606 39.248 -87.584 39.208 -87.588 39.198
|
||||
-87.594 39.196 -87.607 39.168 -87.644 39.146 -87.671 39.131
|
||||
-87.659 39.113 -87.662 39.103 -87.631 39.088 -87.631 39.084
|
||||
-87.612 39.062 -87.585 38.995 -87.581 38.994 -87.591 38.977
|
||||
-87.547 38.963 -87.533 38.931 -87.531 38.904 -87.539 38.869
|
||||
-87.559 38.857 -87.551 38.795 -87.507 38.776 -87.519 38.769
|
||||
-87.508 38.736 -87.508 38.685 -87.543 38.672 -87.588 38.642
|
||||
-87.625 38.622 -87.628 38.599 -87.619 38.593 -87.641 38.573
|
||||
-87.652 38.547 -87.672 38.515 -87.651 38.501 -87.653 38.504
|
||||
-87.679 38.481 -87.692 38.466 -87.756 38.457 -87.758 38.445
|
||||
-87.738 38.417 -87.748 38.378 -87.784 38.352 -87.834 38.286
|
||||
-87.851 38.285 -87.863 38.316 -87.874 38.315 -87.883 38.301
|
||||
-87.888 38.281 -87.914 38.302 -87.913 38.304 -87.925 38.241
|
||||
-87.981 38.234 -87.986 38.201 -87.977 38.171 -87.932 38.157
|
||||
-87.931 38.136 -87.951 38.131 -87.973 38.103 -88.018 38.092
|
||||
-88.012 38.096 -87.964 38.073 -87.975 38.054 -88.034 38.045
|
||||
-88.043 38.038 -88.041 38.033 -88.021 38.008 -88.029 37.975
|
||||
-88.021 37.956 -88.042 37.934 -88.041 37.929 -88.064 37.944
|
||||
-88.078 37.923 -88.084 37.917 -88.031 37.905 -88.026 37.896
|
||||
-88.044 37.906 -88.101 37.895 -88.101 37.867 -88.075 37.843
|
||||
-88.034 37.827 -88.042 37.831 -88.089 37.817 -88.086 37.805
|
||||
-88.035 37.735 -88.072 37.701 -88.133 37.661 -88.159 37.628
|
||||
-88.157 37.583 -88.134 37.511 -88.071</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Illinois</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>17</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>E N Cen</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>IL</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>143986.61</topp:LAND_KM>
|
||||
<topp:WATER_KM>1993.335</topp:WATER_KM>
|
||||
<topp:PERSONS>1.143E7</topp:PERSONS>
|
||||
<topp:FAMILIES>2924880.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
|
||||
<topp:MALE>5552233.0</topp:MALE>
|
||||
<topp:FEMALE>5878369.0</topp:FEMALE>
|
||||
<topp:WORKERS>4199206.0</topp:WORKERS>
|
||||
<topp:DRVALONE>3741715.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>652603.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>538071.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>5417967.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>1360159.0</topp:SERVICE>
|
||||
<topp:MANUAL>828906.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.486</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.514</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>1747776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
<topp:states gml:id="states.2">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.788 -77.122</gml:lowerCorner>
|
||||
<gml:upperCorner>38.993 -76.911</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.966 -77.008 38.889 -76.911 38.788 -77.045 38.813
|
||||
-77.035 38.829 -77.045 38.838 -77.041 38.862 -77.039 38.886
|
||||
-77.067 38.915 -77.078 38.932 -77.122 38.993 -77.042 38.966
|
||||
-77.008</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>11</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DC</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>159.055</topp:LAND_KM>
|
||||
<topp:WATER_KM>17.991</topp:WATER_KM>
|
||||
<topp:PERSONS>606900.0</topp:PERSONS>
|
||||
<topp:FAMILIES>122087.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
|
||||
<topp:MALE>282970.0</topp:MALE>
|
||||
<topp:FEMALE>323930.0</topp:FEMALE>
|
||||
<topp:WORKERS>229975.0</topp:WORKERS>
|
||||
<topp:DRVALONE>106694.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>36621.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>111422.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>303994.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>65498.0</topp:SERVICE>
|
||||
<topp:MANUAL>22407.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.466</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.534</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>72696.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
<topp:states gml:id="states.3">
|
||||
<gml:boundedBy>
|
||||
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:lowerCorner>38.449 -75.791</gml:lowerCorner>
|
||||
<gml:upperCorner>39.841 -75.045</gml:upperCorner>
|
||||
</gml:Envelope>
|
||||
</gml:boundedBy>
|
||||
<topp:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>38.557 -75.707 38.649 -75.711 38.831 -75.724 39.141
|
||||
-75.752 39.247 -75.761 39.295 -75.764 39.383 -75.772 39.723
|
||||
-75.791 39.724 -75.775 39.774 -75.745 39.821 -75.695 39.838
|
||||
-75.644 39.841 -75.583 39.826 -75.471 39.798 -75.421 39.789
|
||||
-75.412 39.778 -75.428 39.763 -75.461 39.741 -75.475 39.719
|
||||
-75.476 39.714 -75.489 39.612 -75.611 39.566 -75.562 39.463
|
||||
-75.591 39.366 -75.515 39.257 -75.402 39.073 -75.397 39.012
|
||||
-75.324 38.945 -75.307 38.808 -75.191 38.799 -75.083 38.449
|
||||
-75.045 38.449 -75.068 38.451 -75.093 38.455 -75.351 38.463
|
||||
-75.699 38.557 -75.707</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</topp:the_geom>
|
||||
<topp:STATE_NAME>Delaware</topp:STATE_NAME>
|
||||
<topp:STATE_FIPS>10</topp:STATE_FIPS>
|
||||
<topp:SUB_REGION>S Atl</topp:SUB_REGION>
|
||||
<topp:STATE_ABBR>DE</topp:STATE_ABBR>
|
||||
<topp:LAND_KM>5062.456</topp:LAND_KM>
|
||||
<topp:WATER_KM>1385.022</topp:WATER_KM>
|
||||
<topp:PERSONS>666168.0</topp:PERSONS>
|
||||
<topp:FAMILIES>175867.0</topp:FAMILIES>
|
||||
<topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
|
||||
<topp:MALE>322968.0</topp:MALE>
|
||||
<topp:FEMALE>343200.0</topp:FEMALE>
|
||||
<topp:WORKERS>247566.0</topp:WORKERS>
|
||||
<topp:DRVALONE>258087.0</topp:DRVALONE>
|
||||
<topp:CARPOOL>42968.0</topp:CARPOOL>
|
||||
<topp:PUBTRANS>8069.0</topp:PUBTRANS>
|
||||
<topp:EMPLOYED>335147.0</topp:EMPLOYED>
|
||||
<topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
|
||||
<topp:SERVICE>87973.0</topp:SERVICE>
|
||||
<topp:MANUAL>44140.0</topp:MANUAL>
|
||||
<topp:P_MALE>0.485</topp:P_MALE>
|
||||
<topp:P_FEMALE>0.515</topp:P_FEMALE>
|
||||
<topp:SAMP_POP>102776.0</topp:SAMP_POP>
|
||||
</topp:states>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
1450
test/browser/spec/ol/format/wkb.test.js
Normal file
1450
test/browser/spec/ol/format/wkb.test.js
Normal file
File diff suppressed because it is too large
Load Diff
1146
test/browser/spec/ol/format/wkt.test.js
Normal file
1146
test/browser/spec/ol/format/wkt.test.js
Normal file
File diff suppressed because it is too large
Load Diff
1
test/browser/spec/ol/format/wkt/illinois.wkt
Normal file
1
test/browser/spec/ol/format/wkt/illinois.wkt
Normal file
File diff suppressed because one or more lines are too long
45
test/browser/spec/ol/format/wms/getfeatureinfo.xml
Normal file
45
test/browser/spec/ol/format/wms/getfeatureinfo.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<msGMLOutput xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<ADCP_2001_layer>
|
||||
<gml:name>ADCP de coque 2001</gml:name>
|
||||
<ADCP_2001_feature>
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:3857">
|
||||
<gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<FID>1071</FID>
|
||||
<NO_CAMPAGNE>1020050</NO_CAMPAGNE>
|
||||
<NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
|
||||
<NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
|
||||
<FICHIER>ITSASII_BB150_0_osite.nc</FICHIER>
|
||||
<NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=71053_1&cle2=ADCP01</NAUTILUS_DATA>
|
||||
</ADCP_2001_feature>
|
||||
<ADCP_2001_feature>
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:3857">
|
||||
<gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<FID>22431</FID>
|
||||
<NO_CAMPAGNE>1020050</NO_CAMPAGNE>
|
||||
<NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
|
||||
<NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
|
||||
<FICHIER>ITSASII_BB150_figures.tar</FICHIER>
|
||||
<NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=108842_2&cle2=ADCP01</NAUTILUS_DATA>
|
||||
</ADCP_2001_feature>
|
||||
<ADCP_2001_feature>
|
||||
<gml:boundedBy>
|
||||
<gml:Box srsName="EPSG:3857">
|
||||
<gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
<FID>22432</FID>
|
||||
<NO_CAMPAGNE>1020050</NO_CAMPAGNE>
|
||||
<NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
|
||||
<NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
|
||||
<FICHIER>ITSASII_BB150_0_fhv12.nc</FICHIER>
|
||||
<NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=108842_3&cle2=ADCP01</NAUTILUS_DATA>
|
||||
</ADCP_2001_feature>
|
||||
</ADCP_2001_layer>
|
||||
</msGMLOutput>
|
||||
284
test/browser/spec/ol/format/wms/ogcsample.xml
Normal file
284
test/browser/spec/ol/format/wms/ogcsample.xml
Normal file
@@ -0,0 +1,284 @@
|
||||
<?xml version='1.0' encoding="UTF-8"?>
|
||||
<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd">
|
||||
<Service>
|
||||
<Name>WMS</Name>
|
||||
<Title>Acme Corp. Map Server</Title>
|
||||
<Abstract>Map Server maintained by Acme Corporation. Contact: webmaster@wmt.acme.com. High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
|
||||
|
||||
<KeywordList>
|
||||
<Keyword>bird</Keyword>
|
||||
<Keyword>roadrunner</Keyword>
|
||||
<Keyword>ambush</Keyword>
|
||||
</KeywordList>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
|
||||
xlink:href="http://hostname/" />
|
||||
|
||||
|
||||
<ContactInformation>
|
||||
<ContactPersonPrimary>
|
||||
<ContactPerson>Jeff Smith</ContactPerson>
|
||||
<ContactOrganization>NASA</ContactOrganization>
|
||||
</ContactPersonPrimary>
|
||||
<ContactPosition>Computer Scientist</ContactPosition>
|
||||
|
||||
<ContactAddress>
|
||||
<AddressType>postal</AddressType>
|
||||
<Address>NASA Goddard Space Flight Center</Address>
|
||||
<City>Greenbelt</City>
|
||||
<StateOrProvince>MD</StateOrProvince>
|
||||
<PostCode>20771</PostCode>
|
||||
|
||||
<Country>USA</Country>
|
||||
</ContactAddress>
|
||||
<ContactVoiceTelephone>+1 301 555-1212</ContactVoiceTelephone>
|
||||
<ContactElectronicMailAddress>user@host.com</ContactElectronicMailAddress>
|
||||
</ContactInformation>
|
||||
|
||||
<Fees>none</Fees>
|
||||
|
||||
<AccessConstraints>none</AccessConstraints>
|
||||
<LayerLimit>16</LayerLimit>
|
||||
<MaxWidth>2048</MaxWidth>
|
||||
<MaxHeight>2048</MaxHeight>
|
||||
</Service>
|
||||
<Capability>
|
||||
<Request>
|
||||
<GetCapabilities>
|
||||
|
||||
<Format>text/xml</Format>
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
<Post>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
|
||||
</Post>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetCapabilities>
|
||||
<GetMap>
|
||||
<Format>image/gif</Format>
|
||||
<Format>image/png</Format>
|
||||
<Format>image/jpeg</Format>
|
||||
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetMap>
|
||||
|
||||
<GetFeatureInfo>
|
||||
<Format>text/xml</Format>
|
||||
<Format>text/plain</Format>
|
||||
<Format>text/html</Format>
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetFeatureInfo>
|
||||
</Request>
|
||||
<Exception>
|
||||
<Format>XML</Format>
|
||||
|
||||
<Format>INIMAGE</Format>
|
||||
<Format>BLANK</Format>
|
||||
</Exception>
|
||||
<Layer>
|
||||
<Title>Acme Corp. Map Server</Title>
|
||||
<CRS>CRS:84</CRS>
|
||||
|
||||
<AuthorityURL name="DIF_ID">
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
|
||||
xlink:href="http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html" />
|
||||
</AuthorityURL>
|
||||
<BoundingBox CRS="CRS:84"
|
||||
minx="-1" miny="-1" maxx="1" maxy="1" resx="0.0" resy="0.0"/>
|
||||
<Layer>
|
||||
|
||||
<Name>ROADS_RIVERS</Name>
|
||||
<Title>Roads and Rivers</Title>
|
||||
|
||||
<CRS>EPSG:26986</CRS>
|
||||
<EX_GeographicBoundingBox>
|
||||
<westBoundLongitude>-71.63</westBoundLongitude>
|
||||
<eastBoundLongitude>-70.78</eastBoundLongitude>
|
||||
<southBoundLatitude>41.75</southBoundLatitude>
|
||||
<northBoundLatitude>42.90</northBoundLatitude>
|
||||
|
||||
</EX_GeographicBoundingBox>
|
||||
<BoundingBox CRS="CRS:84"
|
||||
minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90" resx="0.01" resy="0.01"/>
|
||||
<BoundingBox CRS="EPSG:26986"
|
||||
minx="189000" miny="834000" maxx="285000" maxy="962000" resx="1" resy="1" />
|
||||
<Attribution>
|
||||
<Title>State College University</Title>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/" />
|
||||
|
||||
<LogoURL width="100" height="100">
|
||||
<Format>image/gif</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/icons/logo.gif" />
|
||||
</LogoURL>
|
||||
</Attribution>
|
||||
<Identifier authority="DIF_ID">123456</Identifier>
|
||||
<FeatureListURL>
|
||||
|
||||
<Format>XML</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/data/roads_rivers.gml" />
|
||||
</FeatureListURL>
|
||||
<Style>
|
||||
<Name>USGS</Name>
|
||||
<Title>USGS Topo Map Style</Title>
|
||||
<Abstract>Features are shown in a style like that used in USGS topographic maps.</Abstract>
|
||||
|
||||
<LegendURL width="72" height="72">
|
||||
<Format>image/gif</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/legends/usgs.gif" />
|
||||
</LegendURL>
|
||||
<StyleSheetURL>
|
||||
<Format>text/xsl</Format>
|
||||
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/stylesheets/usgs.xsl" />
|
||||
</StyleSheetURL>
|
||||
</Style>
|
||||
<MinScaleDenominator>1000</MinScaleDenominator>
|
||||
<MaxScaleDenominator>250000</MaxScaleDenominator>
|
||||
<Layer queryable="1">
|
||||
<Name>ROADS_1M</Name>
|
||||
<Title>Roads at 1:1M scale</Title>
|
||||
<Abstract>Roads at a scale of 1 to 1 million.</Abstract>
|
||||
|
||||
<KeywordList>
|
||||
<Keyword>road</Keyword>
|
||||
<Keyword>transportation</Keyword>
|
||||
<Keyword>atlas</Keyword>
|
||||
</KeywordList>
|
||||
<Identifier authority="DIF_ID">123456</Identifier>
|
||||
<MetadataURL type="FGDC:1998">
|
||||
|
||||
<Format>text/plain</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/metadata/roads.txt" />
|
||||
</MetadataURL>
|
||||
<MetadataURL type="ISO19115:2003">
|
||||
<Format>text/xml</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/metadata/roads.xml" />
|
||||
</MetadataURL>
|
||||
|
||||
<Style>
|
||||
<Name>ATLAS</Name>
|
||||
<Title>Road atlas style</Title>
|
||||
<Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
|
||||
<LegendURL width="72" height="72">
|
||||
<Format>image/gif</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/legends/atlas.gif" />
|
||||
|
||||
</LegendURL>
|
||||
</Style>
|
||||
</Layer>
|
||||
<Layer queryable="1">
|
||||
<Name>RIVERS_1M</Name>
|
||||
<Title>Rivers at 1:1M scale</Title>
|
||||
<Abstract>Rivers at a scale of 1 to 1 million.</Abstract>
|
||||
|
||||
<KeywordList>
|
||||
<Keyword>river</Keyword>
|
||||
<Keyword>canal</Keyword>
|
||||
<Keyword>waterway</Keyword>
|
||||
</KeywordList>
|
||||
</Layer>
|
||||
</Layer>
|
||||
|
||||
<Layer queryable="1">
|
||||
<Title>Weather Forecast Data</Title>
|
||||
<CRS>CRS:84</CRS>
|
||||
|
||||
<EX_GeographicBoundingBox>
|
||||
<westBoundLongitude>-180</westBoundLongitude>
|
||||
<eastBoundLongitude>180</eastBoundLongitude>
|
||||
|
||||
<southBoundLatitude>-90</southBoundLatitude>
|
||||
<northBoundLatitude>90</northBoundLatitude>
|
||||
</EX_GeographicBoundingBox>
|
||||
<Dimension name="time" units="ISO8601" default="2000-08-22">1999-01-01/2000-08-22/P1D</Dimension>
|
||||
<Layer>
|
||||
|
||||
<Name>Clouds</Name>
|
||||
<Title>Forecast cloud cover</Title>
|
||||
</Layer>
|
||||
<Layer>
|
||||
<Name>Temperature</Name>
|
||||
<Title>Forecast temperature</Title>
|
||||
</Layer>
|
||||
|
||||
<Layer>
|
||||
<Name>Pressure</Name>
|
||||
<Title>Forecast barometric pressure</Title>
|
||||
<Dimension name="elevation" units="EPSG:5030" />
|
||||
<Dimension name="time" units="ISO8601" default="2000-08-22">
|
||||
1999-01-01/2000-08-22/P1D</Dimension>
|
||||
|
||||
<Dimension name="elevation" units="CRS:88" default="0" nearestValue="1">0,1000,3000,5000,10000</Dimension>
|
||||
</Layer>
|
||||
</Layer>
|
||||
<Layer opaque="1" noSubsets="1" fixedWidth="512" fixedHeight="256">
|
||||
<Name>ozone_image</Name>
|
||||
<Title>Global ozone distribution (1992)</Title>
|
||||
|
||||
<EX_GeographicBoundingBox>
|
||||
<westBoundLongitude>-180</westBoundLongitude>
|
||||
<eastBoundLongitude>180</eastBoundLongitude>
|
||||
<southBoundLatitude>-90</southBoundLatitude>
|
||||
<northBoundLatitude>90</northBoundLatitude>
|
||||
</EX_GeographicBoundingBox>
|
||||
<Dimension name="time" units="ISO8601" default="1992">1992</Dimension>
|
||||
|
||||
</Layer>
|
||||
<Layer cascaded="1">
|
||||
<Name>population</Name>
|
||||
<Title>World population, annual</Title>
|
||||
<EX_GeographicBoundingBox>
|
||||
<westBoundLongitude>-180</westBoundLongitude>
|
||||
|
||||
<eastBoundLongitude>180</eastBoundLongitude>
|
||||
<southBoundLatitude>-90</southBoundLatitude>
|
||||
<northBoundLatitude>90</northBoundLatitude>
|
||||
</EX_GeographicBoundingBox>
|
||||
<Dimension name="time" units="ISO8601" default="2000">1990/2000/P1Y</Dimension>
|
||||
</Layer>
|
||||
</Layer>
|
||||
|
||||
</Capability>
|
||||
</WMS_Capabilities>
|
||||
146
test/browser/spec/ol/format/wms/singlelayer.xml
Normal file
146
test/browser/spec/ol/format/wms/singlelayer.xml
Normal file
@@ -0,0 +1,146 @@
|
||||
<?xml version='1.0' encoding="UTF-8"?>
|
||||
<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd">
|
||||
<Service>
|
||||
<Name>WMS</Name>
|
||||
<Title>Acme Corp. Map Server</Title>
|
||||
<Abstract>Map Server maintained by Acme Corporation. Contact: webmaster@wmt.acme.com. High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
|
||||
|
||||
<KeywordList>
|
||||
<Keyword>bird</Keyword>
|
||||
<Keyword>roadrunner</Keyword>
|
||||
<Keyword>ambush</Keyword>
|
||||
</KeywordList>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
|
||||
xlink:href="http://hostname/" />
|
||||
|
||||
|
||||
<ContactInformation>
|
||||
<ContactPersonPrimary>
|
||||
<ContactPerson>Jeff Smith</ContactPerson>
|
||||
<ContactOrganization>NASA</ContactOrganization>
|
||||
</ContactPersonPrimary>
|
||||
<ContactPosition>Computer Scientist</ContactPosition>
|
||||
|
||||
<ContactAddress>
|
||||
<AddressType>postal</AddressType>
|
||||
<Address>NASA Goddard Space Flight Center</Address>
|
||||
<City>Greenbelt</City>
|
||||
<StateOrProvince>MD</StateOrProvince>
|
||||
<PostCode>20771</PostCode>
|
||||
|
||||
<Country>USA</Country>
|
||||
</ContactAddress>
|
||||
<ContactVoiceTelephone>+1 301 555-1212</ContactVoiceTelephone>
|
||||
<ContactElectronicMailAddress>user@host.com</ContactElectronicMailAddress>
|
||||
</ContactInformation>
|
||||
|
||||
<Fees>none</Fees>
|
||||
|
||||
<AccessConstraints>none</AccessConstraints>
|
||||
<LayerLimit>16</LayerLimit>
|
||||
<MaxWidth>2048</MaxWidth>
|
||||
<MaxHeight>2048</MaxHeight>
|
||||
</Service>
|
||||
<Capability>
|
||||
<Request>
|
||||
<GetCapabilities>
|
||||
|
||||
<Format>text/xml</Format>
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
<Post>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
|
||||
</Post>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetCapabilities>
|
||||
<GetMap>
|
||||
<Format>image/gif</Format>
|
||||
<Format>image/png</Format>
|
||||
<Format>image/jpeg</Format>
|
||||
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetMap>
|
||||
|
||||
<GetFeatureInfo>
|
||||
<Format>text/xml</Format>
|
||||
<Format>text/plain</Format>
|
||||
<Format>text/html</Format>
|
||||
<DCPType>
|
||||
<HTTP>
|
||||
<Get>
|
||||
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://hostname/path?" />
|
||||
</Get>
|
||||
</HTTP>
|
||||
</DCPType>
|
||||
</GetFeatureInfo>
|
||||
</Request>
|
||||
<Exception>
|
||||
<Format>XML</Format>
|
||||
|
||||
<Format>INIMAGE</Format>
|
||||
<Format>BLANK</Format>
|
||||
</Exception>
|
||||
<Layer queryable="1">
|
||||
<Name>ROADS_1M</Name>
|
||||
<Title>Roads at 1:1M scale</Title>
|
||||
<Abstract>Roads at a scale of 1 to 1 million.</Abstract>
|
||||
|
||||
<KeywordList>
|
||||
<Keyword>road</Keyword>
|
||||
<Keyword>transportation</Keyword>
|
||||
<Keyword>atlas</Keyword>
|
||||
</KeywordList>
|
||||
<Identifier authority="DIF_ID">123456</Identifier>
|
||||
<MetadataURL type="FGDC:1998">
|
||||
|
||||
<Format>text/plain</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/metadata/roads.txt" />
|
||||
</MetadataURL>
|
||||
<MetadataURL type="ISO19115:2003">
|
||||
<Format>text/xml</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/metadata/roads.xml" />
|
||||
</MetadataURL>
|
||||
|
||||
<Style>
|
||||
<Name>ATLAS</Name>
|
||||
<Title>Road atlas style</Title>
|
||||
<Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
|
||||
<LegendURL width="72" height="72">
|
||||
<Format>image/gif</Format>
|
||||
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xlink:type="simple"
|
||||
xlink:href="http://www.university.edu/legends/atlas.gif" />
|
||||
|
||||
</LegendURL>
|
||||
</Style>
|
||||
</Layer>
|
||||
|
||||
</Capability>
|
||||
</WMS_Capabilities>
|
||||
199
test/browser/spec/ol/format/wmscapabilities.test.js
Normal file
199
test/browser/spec/ol/format/wmscapabilities.test.js
Normal file
@@ -0,0 +1,199 @@
|
||||
import WMSCapabilities from '../../../../../src/ol/format/WMSCapabilities.js';
|
||||
|
||||
describe('ol.format.WMSCapabilities', function () {
|
||||
describe('when parsing ogcsample.xml', function () {
|
||||
const parser = new WMSCapabilities();
|
||||
let capabilities;
|
||||
before(function (done) {
|
||||
afterLoadText('spec/ol/format/wms/ogcsample.xml', function (xml) {
|
||||
try {
|
||||
capabilities = parser.read(xml);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('can read version', function () {
|
||||
expect(capabilities.version).to.eql('1.3.0');
|
||||
});
|
||||
|
||||
it('can read Service section', function () {
|
||||
// FIXME not all fields are tested
|
||||
const service = capabilities.Service;
|
||||
const contact = service.ContactInformation;
|
||||
|
||||
expect(service.Name).to.eql('WMS');
|
||||
expect(service.Title).to.eql('Acme Corp. Map Server');
|
||||
expect(service.KeywordList).to.eql(['bird', 'roadrunner', 'ambush']);
|
||||
expect(service.OnlineResource).to.eql('http://hostname/');
|
||||
expect(service.Fees).to.eql('none');
|
||||
expect(service.AccessConstraints).to.eql('none');
|
||||
expect(service.LayerLimit).to.eql(16);
|
||||
expect(service.MaxWidth).to.eql(2048);
|
||||
expect(service.MaxHeight).to.eql(2048);
|
||||
|
||||
expect(contact.ContactPosition).to.eql('Computer Scientist');
|
||||
expect(contact.ContactPersonPrimary).to.eql({
|
||||
ContactPerson: 'Jeff Smith',
|
||||
ContactOrganization: 'NASA',
|
||||
});
|
||||
});
|
||||
|
||||
it('can read Capability.Exception', function () {
|
||||
const exception = capabilities.Capability.Exception;
|
||||
|
||||
expect(exception).to.eql(['XML', 'INIMAGE', 'BLANK']);
|
||||
});
|
||||
|
||||
it('can read Capability.Request.GetCapabilities', function () {
|
||||
const getCapabilities = capabilities.Capability.Request.GetCapabilities;
|
||||
|
||||
expect(getCapabilities.Format).to.eql(['text/xml']);
|
||||
expect(getCapabilities.DCPType.length).to.eql(1);
|
||||
const http = getCapabilities.DCPType[0].HTTP;
|
||||
expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
|
||||
expect(http.Post.OnlineResource).to.eql('http://hostname/path?');
|
||||
});
|
||||
|
||||
it('can read Capability.Request.GetFeatureInfo', function () {
|
||||
const getFeatureInfo = capabilities.Capability.Request.GetFeatureInfo;
|
||||
|
||||
expect(getFeatureInfo.Format).to.eql([
|
||||
'text/xml',
|
||||
'text/plain',
|
||||
'text/html',
|
||||
]);
|
||||
expect(getFeatureInfo.DCPType.length).to.eql(1);
|
||||
const http = getFeatureInfo.DCPType[0].HTTP;
|
||||
expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
|
||||
});
|
||||
|
||||
it('can read Capability.Request.GetMap', function () {
|
||||
const getMap = capabilities.Capability.Request.GetMap;
|
||||
|
||||
expect(getMap.Format).to.eql(['image/gif', 'image/png', 'image/jpeg']);
|
||||
expect(getMap.DCPType.length).to.eql(1);
|
||||
const http = getMap.DCPType[0].HTTP;
|
||||
expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
|
||||
});
|
||||
|
||||
it('can read Capability.Layer', function () {
|
||||
const layer = capabilities.Capability.Layer;
|
||||
|
||||
expect(layer.Title).to.eql('Acme Corp. Map Server');
|
||||
expect(layer.Name).to.be(undefined);
|
||||
expect(layer.CRS).to.eql(['CRS:84']);
|
||||
expect(layer.AuthorityURL).to.eql([
|
||||
{
|
||||
name: 'DIF_ID',
|
||||
OnlineResource: 'http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html',
|
||||
},
|
||||
]);
|
||||
expect(layer.BoundingBox).to.eql([
|
||||
{
|
||||
crs: 'CRS:84',
|
||||
extent: [-1, -1, 1, 1],
|
||||
res: [0, 0],
|
||||
},
|
||||
]);
|
||||
|
||||
expect(layer.Layer.length).to.eql(4);
|
||||
expect(layer.Layer[0].Name).to.eql('ROADS_RIVERS');
|
||||
expect(layer.Layer[0].Title).to.eql('Roads and Rivers');
|
||||
expect(layer.Layer[0].CRS).to.eql(['EPSG:26986', 'CRS:84']);
|
||||
expect(layer.Layer[0].Identifier).to.eql(['123456']);
|
||||
expect(layer.Layer[0].BoundingBox).to.eql([
|
||||
{
|
||||
crs: 'CRS:84',
|
||||
extent: [-71.63, 41.75, -70.78, 42.9],
|
||||
res: [0.01, 0.01],
|
||||
},
|
||||
{
|
||||
crs: 'EPSG:26986',
|
||||
extent: [189000, 834000, 285000, 962000],
|
||||
res: [1, 1],
|
||||
},
|
||||
]);
|
||||
expect(layer.Layer[0].EX_GeographicBoundingBox).to.eql([
|
||||
-71.63,
|
||||
41.75,
|
||||
-70.78,
|
||||
42.9,
|
||||
]);
|
||||
expect(layer.Layer[0].Style).to.eql([
|
||||
{
|
||||
Name: 'USGS',
|
||||
Title: 'USGS Topo Map Style',
|
||||
Abstract:
|
||||
'Features are shown in a style like that used in USGS ' +
|
||||
'topographic maps.',
|
||||
StyleSheetURL: {
|
||||
Format: 'text/xsl',
|
||||
OnlineResource: 'http://www.university.edu/stylesheets/usgs.xsl',
|
||||
},
|
||||
LegendURL: [
|
||||
{
|
||||
Format: 'image/gif',
|
||||
OnlineResource: 'http://www.university.edu/legends/usgs.gif',
|
||||
size: [72, 72],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
expect(layer.Layer[0].FeatureListURL).to.eql([
|
||||
{
|
||||
Format: 'XML',
|
||||
OnlineResource: 'http://www.university.edu/data/roads_rivers.gml',
|
||||
},
|
||||
]);
|
||||
expect(layer.Layer[0].Attribution).to.eql({
|
||||
Title: 'State College University',
|
||||
OnlineResource: 'http://www.university.edu/',
|
||||
LogoURL: {
|
||||
Format: 'image/gif',
|
||||
OnlineResource: 'http://www.university.edu/icons/logo.gif',
|
||||
size: [100, 100],
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ol.format.WMSCapabilities', function () {
|
||||
describe('when parsing singlelayer.xml', function () {
|
||||
const parser = new WMSCapabilities();
|
||||
let capabilities;
|
||||
before(function (done) {
|
||||
afterLoadText('spec/ol/format/wms/singlelayer.xml', function (xml) {
|
||||
try {
|
||||
capabilities = parser.read(xml);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('can read version', function () {
|
||||
expect(capabilities.version).to.eql('1.3.0');
|
||||
});
|
||||
|
||||
it('can read Service section', function () {
|
||||
// FIXME not all fields are tested
|
||||
const service = capabilities.Service;
|
||||
|
||||
expect(service.Name).to.eql('WMS');
|
||||
expect(service.Title).to.eql('Acme Corp. Map Server');
|
||||
});
|
||||
|
||||
it('can read Capability.Layer', function () {
|
||||
const layer = capabilities.Capability.Layer;
|
||||
|
||||
expect(layer.Title).to.eql('Roads at 1:1M scale');
|
||||
expect(layer.Name).to.be('ROADS_1M');
|
||||
expect(layer.queryable).to.be(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
233
test/browser/spec/ol/format/wmsgetfeatureinfo.test.js
Normal file
233
test/browser/spec/ol/format/wmsgetfeatureinfo.test.js
Normal file
@@ -0,0 +1,233 @@
|
||||
import WMSGetFeatureInfo from '../../../../../src/ol/format/WMSGetFeatureInfo.js';
|
||||
import {addCommon, clearAllProjections} from '../../../../../src/ol/proj.js';
|
||||
import {register} from '../../../../../src/ol/proj/proj4.js';
|
||||
|
||||
describe('ol.format.WMSGetFeatureInfo', function () {
|
||||
describe('#getLayers', function () {
|
||||
it('returns null if layers is undefined', function () {
|
||||
const format = new WMSGetFeatureInfo();
|
||||
expect(format.getLayers()).to.be(null);
|
||||
});
|
||||
|
||||
it('returns the value provided in the layers option', function () {
|
||||
const format = new WMSGetFeatureInfo({
|
||||
layers: ['a', 'z'],
|
||||
});
|
||||
expect(format.getLayers()).to.eql(['a', 'z']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#readFormat', function () {
|
||||
describe('read Features', function () {
|
||||
let features;
|
||||
|
||||
before(function (done) {
|
||||
proj4.defs('urn:x-ogc:def:crs:EPSG:4326', proj4.defs('EPSG:4326'));
|
||||
register(proj4);
|
||||
afterLoadText('spec/ol/format/wms/getfeatureinfo.xml', function (data) {
|
||||
try {
|
||||
features = new WMSGetFeatureInfo().readFeatures(data);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
after(function () {
|
||||
delete proj4.defs['urn:x-ogc:def:crs:EPSG:4326'];
|
||||
clearAllProjections();
|
||||
addCommon();
|
||||
});
|
||||
|
||||
it('creates 3 features', function () {
|
||||
expect(features).to.have.length(3);
|
||||
});
|
||||
|
||||
it('creates a feature for 1071', function () {
|
||||
const feature = features[0];
|
||||
expect(feature.getId()).to.be(undefined);
|
||||
expect(feature.get('FID')).to.equal('1071');
|
||||
expect(feature.get('NO_CAMPAGNE')).to.equal('1020050');
|
||||
});
|
||||
|
||||
it('read boundedBy but no geometry', function () {
|
||||
const feature = features[0];
|
||||
expect(feature.getGeometry()).to.be(undefined);
|
||||
expect(feature.get('boundedBy')).to.eql([
|
||||
-531138.686422,
|
||||
5386348.414671,
|
||||
-117252.819653,
|
||||
6144475.186022,
|
||||
]);
|
||||
});
|
||||
|
||||
it('read empty response', function () {
|
||||
// read empty response
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="ISO-8859-1"?>' +
|
||||
'<msGMLOutput xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' xmlns:xlink="http://www.w3.org/1999/xlink"' +
|
||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
|
||||
' <AAA64_layer>' +
|
||||
' </AAA64_layer>' +
|
||||
'</msGMLOutput>';
|
||||
const features = new WMSGetFeatureInfo().readFeatures(text);
|
||||
expect(features.length).to.be(0);
|
||||
});
|
||||
|
||||
it('read empty attributes', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="ISO-8859-1"?>' +
|
||||
'<msGMLOutput ' +
|
||||
' xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' xmlns:xlink="http://www.w3.org/1999/xlink"' +
|
||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
|
||||
' <AAA64_layer>' +
|
||||
' <AAA64_feature>' +
|
||||
' <gml:boundedBy>' +
|
||||
' <gml:Box srsName="EPSG:4326">' +
|
||||
' <gml:coordinates>' +
|
||||
' 107397.266000,460681.063000 116568.188000,480609.250000' +
|
||||
' </gml:coordinates>' +
|
||||
' </gml:Box>' +
|
||||
' </gml:boundedBy>' +
|
||||
' <FOO>bar</FOO>' +
|
||||
' <EMPTY></EMPTY>' +
|
||||
' </AAA64_feature>' +
|
||||
' </AAA64_layer>' +
|
||||
'</msGMLOutput>';
|
||||
const features = new WMSGetFeatureInfo().readFeatures(text);
|
||||
expect(features.length).to.be(1);
|
||||
expect(features[0].get('FOO')).to.be('bar');
|
||||
// FIXME is that really wanted ?
|
||||
expect(features[0].get('EMPTY')).to.be(undefined);
|
||||
});
|
||||
|
||||
it('read features from multiple layers', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="ISO-8859-1"?>' +
|
||||
'<msGMLOutput ' +
|
||||
' xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' xmlns:xlink="http://www.w3.org/1999/xlink"' +
|
||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
|
||||
' <AAA64_layer>' +
|
||||
' <AAA64_feature>' +
|
||||
' <gml:boundedBy>' +
|
||||
' <gml:Box srsName="EPSG:4326">' +
|
||||
' <gml:coordinates>' +
|
||||
' 129799.109000,467950.250000 133199.906000,468904.063000' +
|
||||
' </gml:coordinates>' +
|
||||
' </gml:Box>' +
|
||||
' </gml:boundedBy>' +
|
||||
' <OBJECTID>287</OBJECTID>' +
|
||||
' <ROUTE>N403</ROUTE>' +
|
||||
' <ROUTE_CH>#N403</ROUTE_CH>' +
|
||||
' <COUNT>1</COUNT>' +
|
||||
' <BEHEERDER>P</BEHEERDER>' +
|
||||
' <LENGTH>4091.25</LENGTH>' +
|
||||
' <SHAPE><shape></SHAPE>' +
|
||||
' <SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
|
||||
' </AAA64_feature>' +
|
||||
' </AAA64_layer>' +
|
||||
' <AAA62_layer>' +
|
||||
' <AAA62_feature>' +
|
||||
' <gml:boundedBy>' +
|
||||
' <gml:Box srsName="EPSG:4326">' +
|
||||
' <gml:coordinates>' +
|
||||
' 129936.000000,468362.000000 131686.000000,473119.000000' +
|
||||
' </gml:coordinates>' +
|
||||
' </gml:Box>' +
|
||||
' </gml:boundedBy>' +
|
||||
' <OBJECTID>1251</OBJECTID>' +
|
||||
' <VWK_ID>1515</VWK_ID>' +
|
||||
' <VWK_BEGDTM>00:00:00 01/01/1998</VWK_BEGDTM>' +
|
||||
' <VWJ_ID_BEG>1472</VWJ_ID_BEG>' +
|
||||
' <VWJ_ID_END>1309</VWJ_ID_END>' +
|
||||
' <VAKTYPE>D</VAKTYPE>' +
|
||||
' <VRT_CODE>227</VRT_CODE>' +
|
||||
' <VRT_NAAM>Vecht</VRT_NAAM>' +
|
||||
' <VWG_NR>2</VWG_NR>' +
|
||||
' <VWG_NAAM>Vecht</VWG_NAAM>' +
|
||||
' <BEGKM>18.25</BEGKM>' +
|
||||
' <ENDKM>23.995</ENDKM>' +
|
||||
' <LENGTH>5745.09</LENGTH>' +
|
||||
' <SHAPE><shape></SHAPE>' +
|
||||
' <SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
|
||||
' </AAA62_feature>' +
|
||||
' </AAA62_layer>' +
|
||||
'</msGMLOutput>';
|
||||
const format = new WMSGetFeatureInfo();
|
||||
const features = format.readFeatures(text);
|
||||
expect(features.length).to.be(2);
|
||||
expect(features[0].get('OBJECTID')).to.be('287');
|
||||
expect(features[1].get('OBJECTID')).to.be('1251');
|
||||
format.setLayers(['AAA64']);
|
||||
const aaa64Features = format.readFeatures(text);
|
||||
expect(aaa64Features.length).to.be(1);
|
||||
format.setLayers(['AAA64', 'AAA62']);
|
||||
const allFeatures = format.readFeatures(text);
|
||||
expect(allFeatures.length).to.be(2);
|
||||
format.setLayers(['foo', 'bar']);
|
||||
const dummyFeatures = format.readFeatures(text);
|
||||
expect(dummyFeatures.length).to.be(0);
|
||||
});
|
||||
|
||||
it('read geoserver’s response', function () {
|
||||
const text =
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
'<wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"' +
|
||||
' xmlns:wfs="http://www.opengis.net/wfs"' +
|
||||
' xmlns:opengeo="http://opengeo.org"' +
|
||||
' xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
|
||||
' xsi:schemaLocation="http://opengeo.org ' +
|
||||
' http://demo.opengeo.org:80/geoserver/wfs?service=WFS&' +
|
||||
'version=1.0.0&request=DescribeFeatureType&' +
|
||||
'typeName=opengeo:roads http://www.opengis.net/wfs ' +
|
||||
' http://demo.opengeo.org:80/geoserver/schemas/wfs/1.0.0/' +
|
||||
'WFS-basic.xsd">' +
|
||||
' <gml:boundedBy>' +
|
||||
' <gml:Box' +
|
||||
' srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">' +
|
||||
' <gml:coordinates xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' decimal="." cs="," ts=" ">' +
|
||||
'591943.9375,4925605 593045.625,4925845' +
|
||||
' </gml:coordinates>' +
|
||||
' </gml:Box>' +
|
||||
' </gml:boundedBy>' +
|
||||
' <gml:featureMember>' +
|
||||
' <opengeo:roads fid="roads.90">' +
|
||||
' <opengeo:cat>3</opengeo:cat>' +
|
||||
' <opengeo:label>secondary highway, hard surface' +
|
||||
' </opengeo:label>' +
|
||||
' <opengeo:the_geom>' +
|
||||
' <gml:MultiLineString' +
|
||||
' srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">' +
|
||||
' <gml:lineStringMember>' +
|
||||
' <gml:LineString>' +
|
||||
' <gml:coordinates xmlns:gml="http://www.opengis.net/gml"' +
|
||||
' decimal="." cs="," ts=" ">' +
|
||||
'593045.60746465,4925605.0059156 593024.32382915,4925606.79305411' +
|
||||
' 592907.54863574,4925624.85647524 592687.35111096,' +
|
||||
'4925670.76834012 592430.76279218,4925678.79393165' +
|
||||
' 592285.97636109,4925715.70811767 592173.39165655,' +
|
||||
'4925761.83511156 592071.1753393,4925793.95523514' +
|
||||
' 591985.96972625,4925831.59842486' +
|
||||
' 591943.98769455,4925844.93220071' +
|
||||
' </gml:coordinates>' +
|
||||
' </gml:LineString>' +
|
||||
' </gml:lineStringMember>' +
|
||||
' </gml:MultiLineString>' +
|
||||
' </opengeo:the_geom>' +
|
||||
' </opengeo:roads>' +
|
||||
' </gml:featureMember>' +
|
||||
'</wfs:FeatureCollection>';
|
||||
const features = new WMSGetFeatureInfo().readFeatures(text);
|
||||
expect(features.length).to.be(1);
|
||||
expect(features[0].get('cat')).to.be('3');
|
||||
expect(features[0].getGeometry().getType()).to.be('MultiLineString');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
408
test/browser/spec/ol/format/wmts/arcgis.xml
Normal file
408
test/browser/spec/ol/format/wmts/arcgis.xml
Normal file
@@ -0,0 +1,408 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"
|
||||
version="1.0.0">
|
||||
<!-- Service Identification -->
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>Demographics_USA_Population_Density</ows:Title>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
</ows:ServiceIdentification>
|
||||
<!-- Operations Metadata -->
|
||||
<ows:OperationsMetadata>
|
||||
<ows:Operation name="GetCapabilities">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get
|
||||
xlink:href="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS/1.0.0/WMTSCapabilities.xml">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<!-- add KVP binding in 10.1 -->
|
||||
<ows:Get
|
||||
xlink:href="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
<ows:Operation name="GetTile">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get
|
||||
xlink:href="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS/tile/1.0.0/">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get
|
||||
xlink:href="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
</ows:OperationsMetadata>
|
||||
<Contents>
|
||||
<!--Layer-->
|
||||
<Layer>
|
||||
<ows:Title>Demographics_USA_Population_Density</ows:Title>
|
||||
<ows:Identifier>Demographics_USA_Population_Density</ows:Identifier>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::3857">
|
||||
<ows:LowerCorner>-1.98402303899E7 2144435.3407000005</ows:LowerCorner>
|
||||
<ows:UpperCorner>-7452840.4651999995 1.1536810662600003E7</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>-178.2278219969978 18.910787002877576</ows:LowerCorner>
|
||||
<ows:UpperCorner>-66.95000499993604 71.38957425051252</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<Style isDefault="true">
|
||||
<ows:Title>Default Style</ows:Title>
|
||||
<ows:Identifier>default</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>default028mm</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<TileMatrixSetLink>
|
||||
<!--Only show this TileMatrixSet if the tiling scheme is compliant to Google Maps (and that happens with tile width = 256 px)-->
|
||||
<TileMatrixSet>GoogleMapsCompatible</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" resourceType="tile"
|
||||
template="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS/tile/1.0.0/Demographics_USA_Population_Density/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png"
|
||||
/>
|
||||
</Layer>
|
||||
<!--TileMatrixSet-->
|
||||
<TileMatrixSet>
|
||||
<ows:Title>TileMatrix using 0.28mm</ows:Title>
|
||||
<ows:Abstract>The tile matrix set that has scale values calculated based on the dpi
|
||||
defined by OGC specification (dpi assumes 0.28mm as the physical distance of a
|
||||
pixel).</ows:Abstract>
|
||||
<ows:Identifier>default028mm</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::3857</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>5.590822640285016E8</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>2.7954113201425034E8</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>1.3977056600712562E8</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>6.988528300356235E7</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>3</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>3.494264150178117E7</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>6</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>1.7471320750890587E7</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>11</MatrixWidth>
|
||||
<MatrixHeight>15</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.375445293</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>21</MatrixWidth>
|
||||
<MatrixHeight>29</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.187722647</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>41</MatrixWidth>
|
||||
<MatrixHeight>58</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.0938617955</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>81</MatrixWidth>
|
||||
<MatrixHeight>115</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.5469304253</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>161</MatrixWidth>
|
||||
<MatrixHeight>229</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.7734656851</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>322</MatrixWidth>
|
||||
<MatrixHeight>458</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.38673237007</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>644</MatrixWidth>
|
||||
<MatrixHeight>915</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.69336618503</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1287</MatrixWidth>
|
||||
<MatrixHeight>1829</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.34668309252</ScaleDenominator>
|
||||
<TopLeftCorner>-2.0037508342787E7 2.0037508342787E7</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2573</MatrixWidth>
|
||||
<MatrixHeight>3658</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<ows:Title>GoogleMapsCompatible</ows:Title>
|
||||
<ows:Abstract>the wellknown 'GoogleMapsCompatible' tile matrix set defined by OGC WMTS
|
||||
specification</ows:Abstract>
|
||||
<ows:Identifier>GoogleMapsCompatible</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18.3:3857</ows:SupportedCRS>
|
||||
<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.0287178</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.0143589</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>139770566.0071794</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>69885283.00358972</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>34942641.50179486</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>17471320.75089743</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.375448715</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.187724357</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.093862179</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.546931089</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.7734655447</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.3867327723</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.6933663862</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.34668319309</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>8192</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>14</ows:Identifier>
|
||||
<ScaleDenominator>34123.67334159654</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16384</MatrixWidth>
|
||||
<MatrixHeight>16384</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>15</ows:Identifier>
|
||||
<ScaleDenominator>17061.83667079827</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32768</MatrixWidth>
|
||||
<MatrixHeight>32768</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>16</ows:Identifier>
|
||||
<ScaleDenominator>8530.918335399136</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>65536</MatrixWidth>
|
||||
<MatrixHeight>65536</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>17</ows:Identifier>
|
||||
<ScaleDenominator>4265.459167699568</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>131072</MatrixWidth>
|
||||
<MatrixHeight>131072</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>2132.729583849784</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.34278925 20037508.34278925</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>262144</MatrixWidth>
|
||||
<MatrixHeight>262144</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
<ServiceMetadataURL
|
||||
xlink:href="https://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Population_Density/MapServer/WMTS/1.0.0/WMTSCapabilities.xml"
|
||||
/>
|
||||
</Capabilities>
|
||||
170
test/browser/spec/ol/format/wmts/capabilities_wgs84.xml
Normal file
170
test/browser/spec/ol/format/wmts/capabilities_wgs84.xml
Normal file
@@ -0,0 +1,170 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0.0">
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>Sample WMTS</ows:Title>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
<ows:Fees>None</ows:Fees>
|
||||
<ows:AccessConstraints>none</ows:AccessConstraints>
|
||||
</ows:ServiceIdentification>
|
||||
<ows:ServiceProvider>
|
||||
<ows:ProviderName></ows:ProviderName>
|
||||
<ows:ProviderSite/>
|
||||
<ows:ServiceContact>
|
||||
<ows:IndividualName></ows:IndividualName>
|
||||
<ows:ContactInfo>
|
||||
<ows:Address>
|
||||
<ows:City></ows:City>
|
||||
<ows:Country></ows:Country>
|
||||
<ows:ElectronicMailAddress></ows:ElectronicMailAddress>
|
||||
</ows:Address>
|
||||
</ows:ContactInfo>
|
||||
</ows:ServiceContact>
|
||||
</ows:ServiceProvider>
|
||||
<Contents>
|
||||
<Layer>
|
||||
<ows:Title>Baselayer</ows:Title>
|
||||
<ows:Abstract>Baselayer</ows:Abstract>
|
||||
<ows:Identifier>baselayer</ows:Identifier>
|
||||
<ows:WGS84BoundingBox>
|
||||
<ows:LowerCorner>-180.0 -90.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>180.0 90.0</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::4326">
|
||||
<ows:LowerCorner>-90.0 -180.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>90.0 180.0</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<Style>
|
||||
<ows:Identifier>default</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>inspire_quad</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" resourceType="tile" template="https://example.com/wmts/baselayer/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png"/>
|
||||
</Layer>
|
||||
<TileMatrixSet>
|
||||
<ows:Title>InspireCRS84Quad</ows:Title>
|
||||
<ows:Identifier>inspire_quad</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>279541132.014357</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>1.3977056600717938E8</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>6.988528300358969E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>3.4942641501794845E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>1.7471320750897422E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>8735660.375448711</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>4367830.187724356</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>2183915.093862178</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>1091957.546931089</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>545978.7734655445</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>272989.3867327722</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>136494.6933663861</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>68247.34668319306</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
<ServiceMetadataURL xlink:href="https://example.com/wmts/1.0.0/WMTSCapabilities.xml"/>
|
||||
</Capabilities>
|
||||
@@ -0,0 +1,626 @@
|
||||
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>basemap.at</ows:Title>
|
||||
<ows:Abstract>basemap.at ist eine Rasterkarte in Form eines vorgenerierten Kachel-Caches, in der Web Mercator Auxiliary Sphere und damit kompatibel zu den gängigen weltweiten Basiskarten wie beispielsweise jenen von OpenStreetMap, Google Maps und Bing Maps.</ows:Abstract>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
<ows:Fees>none</ows:Fees>
|
||||
<ows:AccessConstraints>https://www.basemap.at</ows:AccessConstraints>
|
||||
</ows:ServiceIdentification>
|
||||
<ows:ServiceProvider>
|
||||
<ows:ProviderName>City of Vienna</ows:ProviderName>
|
||||
<ows:ProviderSite xlink:href="https://www.wien.gv.at/viennagis" />
|
||||
<ows:ServiceContact>
|
||||
<ows:ContactInfo>
|
||||
<ows:Address>
|
||||
<ows:City>Vienna</ows:City>
|
||||
<ows:Country>Austria</ows:Country>
|
||||
<ows:ElectronicMailAddress>viennagis@post.wien.gv.at</ows:ElectronicMailAddress>
|
||||
</ows:Address>
|
||||
</ows:ContactInfo>
|
||||
</ows:ServiceContact>
|
||||
</ows:ServiceProvider>
|
||||
<ows:OperationsMetadata>
|
||||
<ows:Operation name="GetCapabilities">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="https://maps.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps1.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps2.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps3.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps4.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
<ows:Operation name="GetTile">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="https://maps.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps1.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps2.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps3.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
<ows:Get xlink:href="https://maps4.wien.gv.at/basemap">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>RESTful</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
</ows:OperationsMetadata>
|
||||
<Contents>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap</ows:Title>
|
||||
<ows:Abstract>Basemap von Österreich in Farbe</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>geolandbasemap</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" template="https://maps1.wien.gv.at/basemap/geolandbasemap/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps2.wien.gv.at/basemap/geolandbasemap/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps3.wien.gv.at/basemap/geolandbasemap/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps4.wien.gv.at/basemap/geolandbasemap/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps.wien.gv.at/basemap/geolandbasemap/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap Overlay</ows:Title>
|
||||
<ows:Abstract>Basemap von Österreich nur Beschriftung als transparenter Layer</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmapoverlay</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" template="https://maps1.wien.gv.at/basemap/bmapoverlay/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps2.wien.gv.at/basemap/bmapoverlay/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps3.wien.gv.at/basemap/bmapoverlay/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps4.wien.gv.at/basemap/bmapoverlay/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps.wien.gv.at/basemap/bmapoverlay/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap Grau</ows:Title>
|
||||
<ows:Abstract>Basemap von Österreich in Grau</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmapgrau</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" template="https://maps1.wien.gv.at/basemap/bmapgrau/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps2.wien.gv.at/basemap/bmapgrau/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps3.wien.gv.at/basemap/bmapgrau/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps4.wien.gv.at/basemap/bmapgrau/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
<ResourceURL format="image/png" template="https://maps.wien.gv.at/basemap/bmapgrau/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Basemap High DPI</ows:Title>
|
||||
<ows:Abstract>Basemap mit 512x512px Kacheln für Unterstützung von User Endgeräten mit high dpi Displays (iPad retina, smartphones mit HD Auflösung)</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmaphidpi</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/jpeg" template="https://maps1.wien.gv.at/basemap/bmaphidpi/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps2.wien.gv.at/basemap/bmaphidpi/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps3.wien.gv.at/basemap/bmaphidpi/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps4.wien.gv.at/basemap/bmaphidpi/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps.wien.gv.at/basemap/bmaphidpi/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap Orthofoto</ows:Title>
|
||||
<ows:Abstract>Basemap als farbiges Orthofoto</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmaporthofoto30cm</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/jpeg" template="https://maps1.wien.gv.at/basemap/bmaporthofoto30cm/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps2.wien.gv.at/basemap/bmaporthofoto30cm/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps3.wien.gv.at/basemap/bmaporthofoto30cm/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps4.wien.gv.at/basemap/bmaporthofoto30cm/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps.wien.gv.at/basemap/bmaporthofoto30cm/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap Gelände</ows:Title>
|
||||
<ows:Abstract>Basemap Geländedarstellung von Österreich in Grau</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmapgelaende</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>grau</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857_0-17</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/jpeg" template="https://maps1.wien.gv.at/basemap/bmapgelaende/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps2.wien.gv.at/basemap/bmapgelaende/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps3.wien.gv.at/basemap/bmapgelaende/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps4.wien.gv.at/basemap/bmapgelaende/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps.wien.gv.at/basemap/bmapgelaende/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Geoland Basemap Oberfläche</ows:Title>
|
||||
<ows:Abstract>Basemap Oberflächendarstellung von Österreich in Grau</ows:Abstract>
|
||||
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
|
||||
<ows:LowerCorner>8.782379 46.358770</ows:LowerCorner>
|
||||
<ows:UpperCorner>17.5 49.037872</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>bmapoberflaeche</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Identifier>grau</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857_0-17</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/jpeg" template="https://maps1.wien.gv.at/basemap/bmapoberflaeche/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps2.wien.gv.at/basemap/bmapoberflaeche/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps3.wien.gv.at/basemap/bmapoberflaeche/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps4.wien.gv.at/basemap/bmapoberflaeche/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
<ResourceURL format="image/jpeg" template="https://maps.wien.gv.at/basemap/bmapoberflaeche/{Style}/google3857/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile" />
|
||||
</Layer>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>google3857</ows:Identifier>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.18.3:3857">
|
||||
<ows:LowerCorner>977650 5838030</ows:LowerCorner>
|
||||
<ows:UpperCorner>1913530 6281290</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18.3:3857</ows:SupportedCRS>
|
||||
<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.029</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.015</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>139770566.007</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>69885283.0036</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>34942641.5018</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>17471320.7509</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.37545</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.18773</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.09386</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.54693</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.773466</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.386733</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.693366</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.3466832</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>8192</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>14</ows:Identifier>
|
||||
<ScaleDenominator>34123.6733416</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16384</MatrixWidth>
|
||||
<MatrixHeight>16384</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>15</ows:Identifier>
|
||||
<ScaleDenominator>17061.8366708</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32768</MatrixWidth>
|
||||
<MatrixHeight>32768</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>16</ows:Identifier>
|
||||
<ScaleDenominator>8530.91833540</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>65536</MatrixWidth>
|
||||
<MatrixHeight>65536</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>17</ows:Identifier>
|
||||
<ScaleDenominator>4265.45916770</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>131072</MatrixWidth>
|
||||
<MatrixHeight>131072</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>2132.72958385</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>262144</MatrixWidth>
|
||||
<MatrixHeight>262144</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>19</ows:Identifier>
|
||||
<ScaleDenominator>1066.36479193</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>524288</MatrixWidth>
|
||||
<MatrixHeight>524288</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>20</ows:Identifier>
|
||||
<ScaleDenominator>533.18239597</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1048576</MatrixWidth>
|
||||
<MatrixHeight>1048576</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>google3857_0-17</ows:Identifier>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.18.3:3857">
|
||||
<ows:LowerCorner>977650 5838030</ows:LowerCorner>
|
||||
<ows:UpperCorner>1913530 6281290</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18.3:3857</ows:SupportedCRS>
|
||||
<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.029</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.015</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>139770566.007</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>69885283.0036</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>34942641.5018</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>17471320.7509</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.37545</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.18773</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.09386</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.54693</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.773466</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.386733</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.693366</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.3466832</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>8192</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>14</ows:Identifier>
|
||||
<ScaleDenominator>34123.6733416</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16384</MatrixWidth>
|
||||
<MatrixHeight>16384</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>15</ows:Identifier>
|
||||
<ScaleDenominator>17061.8366708</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32768</MatrixWidth>
|
||||
<MatrixHeight>32768</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>16</ows:Identifier>
|
||||
<ScaleDenominator>8530.91833540</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>65536</MatrixWidth>
|
||||
<MatrixHeight>65536</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>17</ows:Identifier>
|
||||
<ScaleDenominator>4265.45916770</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>131072</MatrixWidth>
|
||||
<MatrixHeight>131072</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
<ServiceMetadataURL xlink:href="https://maps.wien.gv.at/basemap/1.0.0/WMTSCapabilities.xml" />
|
||||
</Capabilities>
|
||||
@@ -0,0 +1,284 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0.0">
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>Sample WMTS</ows:Title>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
<ows:Fees>None</ows:Fees>
|
||||
<ows:AccessConstraints>none</ows:AccessConstraints>
|
||||
</ows:ServiceIdentification>
|
||||
<ows:ServiceProvider>
|
||||
<ows:ProviderName></ows:ProviderName>
|
||||
<ows:ProviderSite/>
|
||||
<ows:ServiceContact>
|
||||
<ows:IndividualName></ows:IndividualName>
|
||||
<ows:ContactInfo>
|
||||
<ows:Address>
|
||||
<ows:City></ows:City>
|
||||
<ows:Country></ows:Country>
|
||||
<ows:ElectronicMailAddress></ows:ElectronicMailAddress>
|
||||
</ows:Address>
|
||||
</ows:ContactInfo>
|
||||
</ows:ServiceContact>
|
||||
</ows:ServiceProvider>
|
||||
<Contents>
|
||||
<Layer>
|
||||
<ows:Title>Baselayer</ows:Title>
|
||||
<ows:Abstract>Baselayer</ows:Abstract>
|
||||
<ows:Identifier>baselayer</ows:Identifier>
|
||||
<ows:WGS84BoundingBox>
|
||||
<ows:LowerCorner>-180.0 -90.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>180.0 90.0</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::4326">
|
||||
<ows:LowerCorner>-90.0 -180.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>90.0 180.0</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<Style>
|
||||
<ows:Identifier>default</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>inspire_quad</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" resourceType="tile" template="https://example.com/wmts/baselayer/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png"/>
|
||||
</Layer>
|
||||
<Layer>
|
||||
<ows:Title>Mean depth full coverage with land coverage</ows:Title>
|
||||
<ows:Abstract></ows:Abstract>
|
||||
<ows:Identifier>mean_atlas_land</ows:Identifier>
|
||||
<ows:WGS84BoundingBox>
|
||||
<ows:LowerCorner>-36.0 15.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>43.0 90.0</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::4326">
|
||||
<ows:LowerCorner>14.999942759061003 -36.0</ows:LowerCorner>
|
||||
<ows:UpperCorner>90.0 42.999938986416</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<Style>
|
||||
<ows:Identifier>default</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/png</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>inspire_quad</TileMatrixSet>
|
||||
<TileMatrixSetLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>0</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>0</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>1</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>1</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>0</MaxTileRow>
|
||||
<MinTileCol>1</MinTileCol>
|
||||
<MaxTileCol>2</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>2</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>1</MaxTileRow>
|
||||
<MinTileCol>3</MinTileCol>
|
||||
<MaxTileCol>4</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>3</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>3</MaxTileRow>
|
||||
<MinTileCol>6</MinTileCol>
|
||||
<MaxTileCol>9</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>4</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>6</MaxTileRow>
|
||||
<MinTileCol>12</MinTileCol>
|
||||
<MaxTileCol>19</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>5</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>13</MaxTileRow>
|
||||
<MinTileCol>25</MinTileCol>
|
||||
<MaxTileCol>39</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>6</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>26</MaxTileRow>
|
||||
<MinTileCol>51</MinTileCol>
|
||||
<MaxTileCol>79</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>7</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>53</MaxTileRow>
|
||||
<MinTileCol>102</MinTileCol>
|
||||
<MaxTileCol>158</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>8</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>106</MaxTileRow>
|
||||
<MinTileCol>204</MinTileCol>
|
||||
<MaxTileCol>317</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>9</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>213</MaxTileRow>
|
||||
<MinTileCol>409</MinTileCol>
|
||||
<MaxTileCol>634</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>10</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>426</MaxTileRow>
|
||||
<MinTileCol>819</MinTileCol>
|
||||
<MaxTileCol>1268</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>11</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>853</MaxTileRow>
|
||||
<MinTileCol>1638</MinTileCol>
|
||||
<MaxTileCol>2537</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>12</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>1706</MaxTileRow>
|
||||
<MinTileCol>3276</MinTileCol>
|
||||
<MaxTileCol>5074</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
</TileMatrixSetLimits>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" resourceType="tile" template="https://example.com/wmts/mean_atlas_land/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png"/>
|
||||
</Layer>
|
||||
<TileMatrixSet>
|
||||
<ows:Title>InspireCRS84Quad</ows:Title>
|
||||
<ows:Identifier>inspire_quad</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>279541132.014357</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>1.3977056600717938E8</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>6.988528300358969E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>3.4942641501794845E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>1.7471320750897422E7</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>8735660.375448711</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>4367830.187724356</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>2183915.093862178</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>1091957.546931089</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>545978.7734655445</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>272989.3867327722</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>136494.6933663861</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>68247.34668319306</ScaleDenominator>
|
||||
<TopLeftCorner>90.0 -180.0</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
<ServiceMetadataURL xlink:href="https://example.com/wmts/1.0.0/WMTSCapabilities.xml"/>
|
||||
</Capabilities>
|
||||
496
test/browser/spec/ol/format/wmts/ign.xml
Normal file
496
test/browser/spec/ol/format/wmts/ign.xml
Normal file
@@ -0,0 +1,496 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd">
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>Service de visualisation WMTS</ows:Title>
|
||||
<ows:Abstract>
|
||||
Ce service permet la visualisation de couches de données raster IGN au travers d'un flux WMTS
|
||||
</ows:Abstract>
|
||||
<ows:Keywords>
|
||||
<ows:Keyword>Unités administratives</ows:Keyword>
|
||||
<ows:Keyword>Limites administratives</ows:Keyword>
|
||||
<ows:Keyword>Surfaces bâties</ows:Keyword>
|
||||
<ows:Keyword>Réseaux de transport</ows:Keyword>
|
||||
<ows:Keyword>Routes</ows:Keyword>
|
||||
<ows:Keyword>Réseaux ferroviaires</ows:Keyword>
|
||||
<ows:Keyword>Aérodromes</ows:Keyword>
|
||||
<ows:Keyword>Réseau hydrographique</ows:Keyword>
|
||||
<ows:Keyword>Parcelles cadastrales</ows:Keyword>
|
||||
<ows:Keyword>Bâtiments</ows:Keyword>
|
||||
<ows:Keyword>Services d'utilité publique et services publics</ows:Keyword>
|
||||
<ows:Keyword>Réseaux de transport</ows:Keyword>
|
||||
<ows:Keyword>Hydrographie</ows:Keyword>
|
||||
<ows:Keyword>Photographies aériennes</ows:Keyword>
|
||||
<ows:Keyword>Cartes</ows:Keyword>
|
||||
<ows:Keyword>Cartes historiques</ows:Keyword>
|
||||
<ows:Keyword>Altitude</ows:Keyword>
|
||||
</ows:Keywords>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
<ows:Fees>licences</ows:Fees>
|
||||
<ows:AccessConstraints>
|
||||
Conditions Générales d'Utilisation disponibles ici : http://professionnels.ign.fr/doc/Conditions_d_utilisation_des_licences_et_des_services_en_ligne.pdf
|
||||
</ows:AccessConstraints>
|
||||
</ows:ServiceIdentification>
|
||||
<ows:ServiceProvider>
|
||||
<ows:ProviderName>IGN</ows:ProviderName>
|
||||
<ows:ProviderSite xlink:href=""/>
|
||||
<ows:ServiceContact>
|
||||
<ows:IndividualName>Géoportail SAV</ows:IndividualName>
|
||||
<ows:PositionName>custodian</ows:PositionName>
|
||||
<ows:ContactInfo>
|
||||
<ows:Phone>
|
||||
<ows:Voice/>
|
||||
<ows:Facsimile/>
|
||||
</ows:Phone>
|
||||
<ows:Address>
|
||||
<ows:DeliveryPoint>73 avenue de Paris</ows:DeliveryPoint>
|
||||
<ows:City>Saint Mandé</ows:City>
|
||||
<ows:AdministrativeArea/>
|
||||
<ows:PostalCode>94160</ows:PostalCode>
|
||||
<ows:Country>France</ows:Country>
|
||||
<ows:ElectronicMailAddress>geop_services@geoportail.fr</ows:ElectronicMailAddress>
|
||||
</ows:Address>
|
||||
</ows:ContactInfo>
|
||||
</ows:ServiceContact>
|
||||
</ows:ServiceProvider>
|
||||
<ows:OperationsMetadata>
|
||||
<ows:Operation name="GetCapabilities">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="http://wxs.ign.fr/geoportail/wmts?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
<ows:Operation name="GetTile">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="http://wxs.ign.fr/geoportail/wmts?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
</ows:OperationsMetadata>
|
||||
<Contents>
|
||||
<Layer>
|
||||
<ows:Title>Photographies aériennes</ows:Title>
|
||||
<ows:Abstract>Photographies aériennes</ows:Abstract>
|
||||
<ows:Keywords>
|
||||
<ows:Keyword>Photographies</ows:Keyword>
|
||||
</ows:Keywords>
|
||||
<ows:WGS84BoundingBox>
|
||||
<ows:LowerCorner>-180 -86</ows:LowerCorner>
|
||||
<ows:UpperCorner>180 84</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>ORTHOIMAGERY.ORTHOPHOTOS</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Title>Données Brutes</ows:Title>
|
||||
<ows:Abstract>Données brutes sans changement de palette</ows:Abstract>
|
||||
<ows:Keywords>
|
||||
<ows:Keyword>Défaut</ows:Keyword>
|
||||
</ows:Keywords>
|
||||
<ows:Identifier>normal</ows:Identifier>
|
||||
<LegendURL format="image/jpeg" height="200" maxScaleDenominator="100000000" minScaleDenominator="200" width="200" xlink:href="http://www.geoportail.gouv.fr/depot/LEGEND.jpg"/>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>PM</TileMatrixSet>
|
||||
<TileMatrixSetLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>0</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>1</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>1</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>1</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>2</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>2</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>10</TileMatrix>
|
||||
<MinTileRow>31</MinTileRow>
|
||||
<MaxTileRow>1024</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>1024</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>11</TileMatrix>
|
||||
<MinTileRow>62</MinTileRow>
|
||||
<MaxTileRow>2048</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>2048</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>12</TileMatrix>
|
||||
<MinTileRow>125</MinTileRow>
|
||||
<MaxTileRow>4096</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>4096</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>13</TileMatrix>
|
||||
<MinTileRow>2739</MinTileRow>
|
||||
<MaxTileRow>4628</MaxTileRow>
|
||||
<MinTileCol>41</MinTileCol>
|
||||
<MaxTileCol>7917</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>14</TileMatrix>
|
||||
<MinTileRow>5478</MinTileRow>
|
||||
<MaxTileRow>9256</MaxTileRow>
|
||||
<MinTileCol>82</MinTileCol>
|
||||
<MaxTileCol>15835</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>15</TileMatrix>
|
||||
<MinTileRow>10956</MinTileRow>
|
||||
<MaxTileRow>18513</MaxTileRow>
|
||||
<MinTileCol>165</MinTileCol>
|
||||
<MaxTileCol>31670</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>16</TileMatrix>
|
||||
<MinTileRow>21912</MinTileRow>
|
||||
<MaxTileRow>37026</MaxTileRow>
|
||||
<MinTileCol>330</MinTileCol>
|
||||
<MaxTileCol>63341</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>17</TileMatrix>
|
||||
<MinTileRow>43825</MinTileRow>
|
||||
<MaxTileRow>74052</MaxTileRow>
|
||||
<MinTileCol>660</MinTileCol>
|
||||
<MaxTileCol>126683</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>18</TileMatrix>
|
||||
<MinTileRow>87651</MinTileRow>
|
||||
<MaxTileRow>148105</MaxTileRow>
|
||||
<MinTileCol>1320</MinTileCol>
|
||||
<MaxTileCol>253366</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>19</TileMatrix>
|
||||
<MinTileRow>175302</MinTileRow>
|
||||
<MaxTileRow>294060</MaxTileRow>
|
||||
<MinTileCol>170159</MinTileCol>
|
||||
<MaxTileCol>343473</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>2</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>4</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>4</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>3</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>8</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>8</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>4</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>16</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>16</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>5</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>32</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>32</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>6</TileMatrix>
|
||||
<MinTileRow>1</MinTileRow>
|
||||
<MaxTileRow>64</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>64</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>7</TileMatrix>
|
||||
<MinTileRow>3</MinTileRow>
|
||||
<MaxTileRow>128</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>128</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>8</TileMatrix>
|
||||
<MinTileRow>7</MinTileRow>
|
||||
<MaxTileRow>256</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>256</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>9</TileMatrix>
|
||||
<MinTileRow>15</MinTileRow>
|
||||
<MaxTileRow>512</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>512</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
</TileMatrixSetLimits>
|
||||
</TileMatrixSetLink>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>Prefixed</TileMatrixSet>
|
||||
<TileMatrixSetLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>Prefixed:0</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>1</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>1</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
<TileMatrixLimits>
|
||||
<TileMatrix>Prefixed:1</TileMatrix>
|
||||
<MinTileRow>0</MinTileRow>
|
||||
<MaxTileRow>2</MaxTileRow>
|
||||
<MinTileCol>0</MinTileCol>
|
||||
<MaxTileCol>2</MaxTileCol>
|
||||
</TileMatrixLimits>
|
||||
</TileMatrixSetLimits>
|
||||
</TileMatrixSetLink>
|
||||
</Layer>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>PM</ows:Identifier>
|
||||
<ows:SupportedCRS>EPSG:3857</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.0287178958533332</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.0143588959472254</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.7734655447186469</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.3867327723085907</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.6933663861796617</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.3466831930771477</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>8192</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>14</ows:Identifier>
|
||||
<ScaleDenominator>34123.6733415965449154</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16384</MatrixWidth>
|
||||
<MatrixHeight>16384</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>15</ows:Identifier>
|
||||
<ScaleDenominator>17061.8366707982724577</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32768</MatrixWidth>
|
||||
<MatrixHeight>32768</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>16</ows:Identifier>
|
||||
<ScaleDenominator>8530.9183353991362289</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>65536</MatrixWidth>
|
||||
<MatrixHeight>65536</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>17</ows:Identifier>
|
||||
<ScaleDenominator>4265.4591676995681144</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>131072</MatrixWidth>
|
||||
<MatrixHeight>131072</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>2132.7295838497840572</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>262144</MatrixWidth>
|
||||
<MatrixHeight>262144</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>19</ows:Identifier>
|
||||
<ScaleDenominator>1066.3647919248918304</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>524288</MatrixWidth>
|
||||
<MatrixHeight>524288</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>139770566.0071793960087234</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>20</ows:Identifier>
|
||||
<ScaleDenominator>533.1823959624461134</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1048576</MatrixWidth>
|
||||
<MatrixHeight>1048576</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>21</ows:Identifier>
|
||||
<ScaleDenominator>266.5911979812228585</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2097152</MatrixWidth>
|
||||
<MatrixHeight>2097152</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>69885283.0035897239868063</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>34942641.5017948619934032</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>17471320.7508974309967016</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.3754487154983508</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.1877243577491754</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.0938621788745877</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.5469310886252288</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>Prefixed</ows:Identifier>
|
||||
<ows:SupportedCRS>EPSG:3857</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.0287178958533332</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.0143588959472254</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508 20037508</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
</Capabilities>
|
||||
403
test/browser/spec/ol/format/wmts/ogcsample.xml
Normal file
403
test/browser/spec/ol/format/wmts/ogcsample.xml
Normal file
@@ -0,0 +1,403 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Capabilities version="1.0.0" xmlns="http://www.opengis.net/wmts/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0.0/wmtsGetCapabilities_response.xsd">
|
||||
<ows:ServiceIdentification>
|
||||
<ows:Title>Web Map Tile Service</ows:Title>
|
||||
<ows:Abstract>Service that contrains the map
|
||||
access interface to some TileMatrixSets</ows:Abstract>
|
||||
<ows:Keywords>
|
||||
<ows:Keyword>tile</ows:Keyword>
|
||||
<ows:Keyword>tile matrix set</ows:Keyword>
|
||||
<ows:Keyword>map</ows:Keyword>
|
||||
</ows:Keywords>
|
||||
<ows:ServiceType>OGC WMTS</ows:ServiceType>
|
||||
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
|
||||
<ows:Fees>none</ows:Fees>
|
||||
<ows:AccessConstraints>none</ows:AccessConstraints>
|
||||
</ows:ServiceIdentification>
|
||||
<ows:ServiceProvider>
|
||||
<ows:ProviderName>MiraMon</ows:ProviderName>
|
||||
<ows:ProviderSite xlink:href="http://www.creaf.uab.cat/miramon"/>
|
||||
<ows:ServiceContact>
|
||||
<ows:IndividualName>Joan Maso Pau</ows:IndividualName>
|
||||
<ows:PositionName>Senior Software Engineer</ows:PositionName>
|
||||
<ows:ContactInfo>
|
||||
<ows:Phone>
|
||||
<ows:Voice>+34 93 581 1312</ows:Voice>
|
||||
<ows:Facsimile>+34 93 581 4151</ows:Facsimile>
|
||||
</ows:Phone>
|
||||
<ows:Address>
|
||||
<ows:DeliveryPoint>Fac Ciencies UAB</ows:DeliveryPoint>
|
||||
<ows:City>Bellaterra</ows:City>
|
||||
<ows:AdministrativeArea>Barcelona</ows:AdministrativeArea>
|
||||
<ows:PostalCode>08193</ows:PostalCode>
|
||||
<ows:Country>Spain</ows:Country>
|
||||
<ows:ElectronicMailAddress>joan.maso@uab.cat</ows:ElectronicMailAddress>
|
||||
</ows:Address>
|
||||
</ows:ContactInfo>
|
||||
</ows:ServiceContact>
|
||||
</ows:ServiceProvider>
|
||||
<ows:OperationsMetadata>
|
||||
<ows:Operation name="GetCapabilities">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="http://www.maps.bob/cgi-bin/MiraMon5_0.cgi?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
<ows:Value>SOAP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
<ows:Operation name="GetTile">
|
||||
<ows:DCP>
|
||||
<ows:HTTP>
|
||||
<ows:Get xlink:href="http://www.maps.bob/cgi-bin/MiraMon5_0.cgi?">
|
||||
<ows:Constraint name="GetEncoding">
|
||||
<ows:AllowedValues>
|
||||
<ows:Value>KVP</ows:Value>
|
||||
</ows:AllowedValues>
|
||||
</ows:Constraint>
|
||||
</ows:Get>
|
||||
</ows:HTTP>
|
||||
</ows:DCP>
|
||||
</ows:Operation>
|
||||
</ows:OperationsMetadata>
|
||||
<Contents>
|
||||
<Layer>
|
||||
<ows:Title>Blue Marble Next Generation</ows:Title>
|
||||
<ows:Abstract>Blue Marble Next Generation NASA Product</ows:Abstract>
|
||||
<ows:WGS84BoundingBox>
|
||||
<ows:LowerCorner>-180 -90</ows:LowerCorner>
|
||||
<ows:UpperCorner>180 90</ows:UpperCorner>
|
||||
</ows:WGS84BoundingBox>
|
||||
<ows:Identifier>BlueMarbleNextGeneration</ows:Identifier>
|
||||
<Style isDefault="true">
|
||||
<ows:Title>Dark Blue</ows:Title>
|
||||
<ows:Identifier>DarkBlue</ows:Identifier>
|
||||
<LegendURL format="image/png" xlink:href="http://www.miramon.uab.es/wmts/Coastlines/coastlines_darkBlue.png"/>
|
||||
</Style>
|
||||
<Style>
|
||||
<ows:Title>Thick And Red</ows:Title>
|
||||
<ows:Abstract>Specify this style if you want your maps to have thick red coastlines.</ows:Abstract>
|
||||
<ows:Identifier>thickAndRed</ows:Identifier>
|
||||
</Style>
|
||||
<Format>image/jpeg</Format>
|
||||
<Format>image/gif</Format>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>BigWorldPixel</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<TileMatrixSetLink>
|
||||
<TileMatrixSet>google3857subset</TileMatrixSet>
|
||||
</TileMatrixSetLink>
|
||||
<ResourceURL format="image/png" resourceType="tile" template="http://www.example.com/wmts/coastlines/{TileMatrix}/{TileRow}/{TileCol}.png"/>
|
||||
<ResourceURL format="application/gml+xml; version=3.1" resourceType="FeatureInfo" template="http://www.example.com/wmts/coastlines/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}/{J}/{I}.xml"/>
|
||||
<Dimension>
|
||||
<ows:Identifier>Time</ows:Identifier>
|
||||
<Default>20110805</Default>
|
||||
<Value>20110805</Value>
|
||||
<Value>20081024</Value>
|
||||
</Dimension>
|
||||
</Layer>
|
||||
<TileMatrixSet>
|
||||
<!-- -180 85.05112878 -->
|
||||
<ows:Identifier>google3857</ows:Identifier>
|
||||
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.18:3:3857">
|
||||
<ows:LowerCorner>1799448.394855 6124949.747770</ows:LowerCorner>
|
||||
<ows:UpperCorner>1848250.442089 6162571.828177</ows:UpperCorner>
|
||||
</ows:BoundingBox>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18:3:3857</ows:SupportedCRS>
|
||||
<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>0</ows:Identifier>
|
||||
<ScaleDenominator>559082264.029</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1</ows:Identifier>
|
||||
<ScaleDenominator>279541132.015</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2</ows:Identifier>
|
||||
<ScaleDenominator>139770566.007</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>4</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>3</ows:Identifier>
|
||||
<ScaleDenominator>69885283.0036</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8</MatrixWidth>
|
||||
<MatrixHeight>8</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>4</ows:Identifier>
|
||||
<ScaleDenominator>34942641.5018</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16</MatrixWidth>
|
||||
<MatrixHeight>16</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>5</ows:Identifier>
|
||||
<ScaleDenominator>17471320.7509</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32</MatrixWidth>
|
||||
<MatrixHeight>32</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>6</ows:Identifier>
|
||||
<ScaleDenominator>8735660.37545</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>64</MatrixWidth>
|
||||
<MatrixHeight>64</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>7</ows:Identifier>
|
||||
<ScaleDenominator>4367830.18773</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>128</MatrixWidth>
|
||||
<MatrixHeight>128</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>8</ows:Identifier>
|
||||
<ScaleDenominator>2183915.09386</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>256</MatrixWidth>
|
||||
<MatrixHeight>256</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>9</ows:Identifier>
|
||||
<ScaleDenominator>1091957.54693</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>512</MatrixWidth>
|
||||
<MatrixHeight>512</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10</ows:Identifier>
|
||||
<ScaleDenominator>545978.773466</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1024</MatrixWidth>
|
||||
<MatrixHeight>1024</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>11</ows:Identifier>
|
||||
<ScaleDenominator>272989.386733</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2048</MatrixWidth>
|
||||
<MatrixHeight>2048</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>12</ows:Identifier>
|
||||
<ScaleDenominator>136494.693366</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>4096</MatrixWidth>
|
||||
<MatrixHeight>4096</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>13</ows:Identifier>
|
||||
<ScaleDenominator>68247.3466832</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>8192</MatrixWidth>
|
||||
<MatrixHeight>8192</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>14</ows:Identifier>
|
||||
<ScaleDenominator>34123.6733416</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>16384</MatrixWidth>
|
||||
<MatrixHeight>16384</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>15</ows:Identifier>
|
||||
<ScaleDenominator>17061.8366708</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>32768</MatrixWidth>
|
||||
<MatrixHeight>32768</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>16</ows:Identifier>
|
||||
<ScaleDenominator>8530.91833540</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>65536</MatrixWidth>
|
||||
<MatrixHeight>65536</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>17</ows:Identifier>
|
||||
<ScaleDenominator>4265.45916770</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>131072</MatrixWidth>
|
||||
<MatrixHeight>131072</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>2132.72958385</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>262144</MatrixWidth>
|
||||
<MatrixHeight>262144</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>19</ows:Identifier>
|
||||
<ScaleDenominator>1066.36479193</ScaleDenominator>
|
||||
<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>524288</MatrixWidth>
|
||||
<MatrixHeight>524288</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>BigWorldPixel</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:OGC:1.3:CRS84</ows:SupportedCRS>
|
||||
<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GlobalCRS84Pixel</WellKnownScaleSet>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>10000m</ows:Identifier>
|
||||
<ScaleDenominator>33130800.83133142</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>7</MatrixWidth>
|
||||
<MatrixHeight>5</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>20000m</ows:Identifier>
|
||||
<ScaleDenominator>66261601.66266284</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>4</MatrixWidth>
|
||||
<MatrixHeight>3</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>40000m</ows:Identifier>
|
||||
<ScaleDenominator>132523203.3253257</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>60000m</ows:Identifier>
|
||||
<ScaleDenominator>198784804.9879885</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>120000m</ows:Identifier>
|
||||
<ScaleDenominator>397569609.9759771</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>240000m</ows:Identifier>
|
||||
<ScaleDenominator>795139219.9519541</ScaleDenominator>
|
||||
<TopLeftCorner>-180 90</TopLeftCorner>
|
||||
<TileWidth>640</TileWidth>
|
||||
<TileHeight>480</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<ows:Identifier>BigWorld</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:OGC:1.3:CRS84</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>1e6</ows:Identifier>
|
||||
<ScaleDenominator>1e6</ScaleDenominator>
|
||||
<TopLeftCorner>-180 84</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>60000</MatrixWidth>
|
||||
<MatrixHeight>50000</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>2.5e6</ows:Identifier>
|
||||
<ScaleDenominator>2.5e6</ScaleDenominator>
|
||||
<TopLeftCorner>-180 84</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>9000</MatrixWidth>
|
||||
<MatrixHeight>7000</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
<TileMatrixSet>
|
||||
<!-- A custom tile matrix set based on google3857 with tiles at each level covering only part of projection space (extent) -->
|
||||
<ows:Identifier>google3857subset</ows:Identifier>
|
||||
<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18:3:3857</ows:SupportedCRS>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>2132.72958385</ScaleDenominator>
|
||||
<TopLeftCorner>-10000000 10000000</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>1</MatrixWidth>
|
||||
<MatrixHeight>1</MatrixHeight>
|
||||
</TileMatrix>
|
||||
<TileMatrix>
|
||||
<ows:Identifier>18</ows:Identifier>
|
||||
<ScaleDenominator>1066.36479193</ScaleDenominator>
|
||||
<TopLeftCorner>-10000000 10000000</TopLeftCorner>
|
||||
<TileWidth>256</TileWidth>
|
||||
<TileHeight>256</TileHeight>
|
||||
<MatrixWidth>2</MatrixWidth>
|
||||
<MatrixHeight>2</MatrixHeight>
|
||||
</TileMatrix>
|
||||
</TileMatrixSet>
|
||||
</Contents>
|
||||
<ServiceMetadataURL xlink:href="http://www.maps.bob/wmts/1.0.0/WMTSCapabilities.xml"/>
|
||||
</Capabilities>
|
||||
204
test/browser/spec/ol/format/wmtscapabilities.test.js
Normal file
204
test/browser/spec/ol/format/wmtscapabilities.test.js
Normal file
@@ -0,0 +1,204 @@
|
||||
import WMTSCapabilities from '../../../../../src/ol/format/WMTSCapabilities.js';
|
||||
|
||||
describe('ol.format.WMTSCapabilities', function () {
|
||||
describe('when parsing ogcsample.xml', function () {
|
||||
const parser = new WMTSCapabilities();
|
||||
let capabilities;
|
||||
before(function (done) {
|
||||
afterLoadText('spec/ol/format/wmts/ogcsample.xml', function (xml) {
|
||||
try {
|
||||
capabilities = parser.read(xml);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('can read Capability.Contents.Layer', function () {
|
||||
expect(capabilities.Contents.Layer).to.be.an('array');
|
||||
expect(capabilities.Contents.Layer).to.have.length(1);
|
||||
|
||||
const layer = capabilities.Contents.Layer[0];
|
||||
expect(layer.Abstract).to.be.eql(
|
||||
'Blue Marble Next Generation NASA Product'
|
||||
);
|
||||
expect(layer.Identifier).to.be.eql('BlueMarbleNextGeneration');
|
||||
expect(layer.Title).to.be.eql('Blue Marble Next Generation');
|
||||
|
||||
expect(layer.Dimension).to.be.an('array');
|
||||
expect(layer.Dimension).to.have.length(1);
|
||||
expect(layer.Dimension[0]).to.be.an('object');
|
||||
expect(layer.Dimension[0].Identifier).to.be.eql('Time');
|
||||
expect(layer.Dimension[0].Default).to.be.eql('20110805');
|
||||
expect(layer.Dimension[0].Value).to.be.an('array');
|
||||
expect(layer.Dimension[0].Value).to.have.length(2);
|
||||
expect(layer.Dimension[0].Value[0]).to.be.eql('20110805');
|
||||
|
||||
expect(layer.Format).to.be.an('array');
|
||||
expect(layer.Format).to.have.length(2);
|
||||
expect(layer.Format[0]).to.be.eql('image/jpeg');
|
||||
|
||||
expect(layer.Style).to.be.an('array');
|
||||
expect(layer.Style).to.have.length(2);
|
||||
expect(layer.Style[0].Identifier).to.be.eql('DarkBlue');
|
||||
expect(layer.Style[0].isDefault).to.be(true);
|
||||
expect(layer.Style[0].Title).to.be.eql('Dark Blue');
|
||||
expect(layer.Style[0].LegendURL[0].href).to.be.eql(
|
||||
'http://www.miramon.uab.es/wmts/Coastlines/' + 'coastlines_darkBlue.png'
|
||||
);
|
||||
expect(layer.Style[0].LegendURL[0].format).to.be.eql('image/png');
|
||||
|
||||
expect(layer.TileMatrixSetLink).to.be.an('array');
|
||||
expect(layer.TileMatrixSetLink).to.have.length(3);
|
||||
expect(layer.TileMatrixSetLink[0].TileMatrixSet).to.be.eql(
|
||||
'BigWorldPixel'
|
||||
);
|
||||
expect(layer.TileMatrixSetLink[1].TileMatrixSet).to.be.eql('google3857');
|
||||
expect(layer.TileMatrixSetLink[2].TileMatrixSet).to.be.eql(
|
||||
'google3857subset'
|
||||
);
|
||||
|
||||
const wgs84Bbox = layer.WGS84BoundingBox;
|
||||
expect(wgs84Bbox).to.be.an('array');
|
||||
expect(wgs84Bbox[0]).to.be.eql(-180);
|
||||
expect(wgs84Bbox[2]).to.be.eql(180);
|
||||
expect(wgs84Bbox[1]).to.be.eql(-90);
|
||||
expect(wgs84Bbox[3]).to.be.eql(90.0);
|
||||
|
||||
expect(layer.ResourceURL).to.be.an('array');
|
||||
expect(layer.ResourceURL).to.have.length(2);
|
||||
expect(layer.ResourceURL[0].format).to.be.eql('image/png');
|
||||
expect(layer.ResourceURL[0].template).to.be.eql(
|
||||
'http://www.example.com/wmts/coastlines/{TileMatrix}' +
|
||||
'/{TileRow}/{TileCol}.png'
|
||||
);
|
||||
});
|
||||
|
||||
it('Can read Capabilities.Content.TileMatrixSet', function () {
|
||||
expect(capabilities.Contents.TileMatrixSet).to.be.ok();
|
||||
|
||||
const bigWorld = capabilities.Contents.TileMatrixSet[2];
|
||||
expect(bigWorld).to.be.ok();
|
||||
expect(bigWorld.Identifier).to.be.eql('BigWorld');
|
||||
expect(bigWorld.SupportedCRS).to.be.eql('urn:ogc:def:crs:OGC:1.3:CRS84');
|
||||
expect(bigWorld.TileMatrix).to.have.length(2);
|
||||
expect(bigWorld.TileMatrix[0].Identifier).to.be.eql('1e6');
|
||||
expect(bigWorld.TileMatrix[0].MatrixHeight).to.be.eql(50000);
|
||||
expect(bigWorld.TileMatrix[0].MatrixWidth).to.be.eql(60000);
|
||||
expect(bigWorld.TileMatrix[0].ScaleDenominator).to.be.eql(1000000);
|
||||
expect(bigWorld.TileMatrix[0].TileWidth).to.be.eql(256);
|
||||
expect(bigWorld.TileMatrix[0].TileHeight).to.be.eql(256);
|
||||
expect(bigWorld.TileMatrix[0].TopLeftCorner).to.be.a('array');
|
||||
expect(bigWorld.TileMatrix[0].TopLeftCorner[0]).to.be.eql(-180);
|
||||
expect(bigWorld.TileMatrix[0].TopLeftCorner[1]).to.be.eql(84);
|
||||
expect(bigWorld.TileMatrix[1].Identifier).to.be.eql('2.5e6');
|
||||
expect(bigWorld.TileMatrix[1].MatrixHeight).to.be.eql(7000);
|
||||
expect(bigWorld.TileMatrix[1].MatrixWidth).to.be.eql(9000);
|
||||
expect(bigWorld.TileMatrix[1].ScaleDenominator).to.be.eql(2500000);
|
||||
expect(bigWorld.TileMatrix[1].TileWidth).to.be.eql(256);
|
||||
expect(bigWorld.TileMatrix[1].TileHeight).to.be.eql(256);
|
||||
expect(bigWorld.TileMatrix[1].TopLeftCorner).to.be.a('array');
|
||||
expect(bigWorld.TileMatrix[1].TopLeftCorner[0]).to.be.eql(-180);
|
||||
expect(bigWorld.TileMatrix[1].TopLeftCorner[1]).to.be.eql(84);
|
||||
});
|
||||
|
||||
it('Can read OWS tags', function () {
|
||||
expect(capabilities.ServiceIdentification).to.be.ok();
|
||||
expect(capabilities.OperationsMetadata).to.be.ok();
|
||||
});
|
||||
});
|
||||
|
||||
describe('when parsing ign.xml', function () {
|
||||
const parser = new WMTSCapabilities();
|
||||
let capabilities;
|
||||
before(function (done) {
|
||||
afterLoadText('spec/ol/format/wmts/ign.xml', function (xml) {
|
||||
try {
|
||||
capabilities = parser.read(xml);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('can read Capability.Contents.Layer', function () {
|
||||
expect(capabilities.Contents.Layer).to.be.an('array');
|
||||
expect(capabilities.Contents.Layer).to.have.length(1);
|
||||
|
||||
const layer = capabilities.Contents.Layer[0];
|
||||
expect(layer.TileMatrixSetLink).to.be.an('array');
|
||||
expect(layer.TileMatrixSetLink).to.have.length(2);
|
||||
expect(layer.TileMatrixSetLink[0].TileMatrixSet).to.be.eql('PM');
|
||||
expect(layer.TileMatrixSetLink[0].TileMatrixSetLimits).to.be.an('array');
|
||||
expect(layer.TileMatrixSetLink[0].TileMatrixSetLimits).to.have.length(20);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[0].TileMatrixSetLimits[0].TileMatrix
|
||||
).to.be.eql('0');
|
||||
expect(
|
||||
layer.TileMatrixSetLink[0].TileMatrixSetLimits[0].MinTileRow
|
||||
).to.be.eql(0);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[0].TileMatrixSetLimits[0].MaxTileRow
|
||||
).to.be.eql(1);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[0].TileMatrixSetLimits[0].MinTileCol
|
||||
).to.be.eql(0);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[0].TileMatrixSetLimits[0].MaxTileCol
|
||||
).to.be.eql(1);
|
||||
|
||||
expect(layer.TileMatrixSetLink[1].TileMatrixSet).to.be.eql('Prefixed');
|
||||
expect(layer.TileMatrixSetLink[1].TileMatrixSetLimits).to.be.an('array');
|
||||
expect(layer.TileMatrixSetLink[1].TileMatrixSetLimits).to.have.length(2);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[1].TileMatrixSetLimits[0].TileMatrix
|
||||
).to.be.eql('Prefixed:0');
|
||||
expect(
|
||||
layer.TileMatrixSetLink[1].TileMatrixSetLimits[0].MinTileRow
|
||||
).to.be.eql(0);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[1].TileMatrixSetLimits[0].MaxTileRow
|
||||
).to.be.eql(1);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[1].TileMatrixSetLimits[0].MinTileCol
|
||||
).to.be.eql(0);
|
||||
expect(
|
||||
layer.TileMatrixSetLink[1].TileMatrixSetLimits[0].MaxTileCol
|
||||
).to.be.eql(1);
|
||||
});
|
||||
|
||||
it('Can read Capabilities.Content.TileMatrixSet', function () {
|
||||
expect(capabilities.Contents.TileMatrixSet).to.be.ok();
|
||||
|
||||
const pm = capabilities.Contents.TileMatrixSet[0];
|
||||
expect(pm).to.be.ok();
|
||||
expect(pm.Identifier).to.be.eql('PM');
|
||||
expect(pm.SupportedCRS).to.be.eql('EPSG:3857');
|
||||
expect(pm.TileMatrix).to.have.length(22);
|
||||
expect(pm.TileMatrix[0].Identifier).to.be.eql('0');
|
||||
expect(pm.TileMatrix[0].MatrixHeight).to.be.eql(1);
|
||||
expect(pm.TileMatrix[0].MatrixWidth).to.be.eql(1);
|
||||
expect(pm.TileMatrix[0].ScaleDenominator).to.be.eql(
|
||||
559082264.0287178958533332
|
||||
);
|
||||
expect(pm.TileMatrix[0].TileWidth).to.be.eql(256);
|
||||
expect(pm.TileMatrix[0].TileHeight).to.be.eql(256);
|
||||
expect(pm.TileMatrix[0].TopLeftCorner).to.be.a('array');
|
||||
expect(pm.TileMatrix[0].TopLeftCorner[0]).to.be.eql(-20037508);
|
||||
expect(pm.TileMatrix[0].TopLeftCorner[1]).to.be.eql(20037508);
|
||||
expect(pm.TileMatrix[1].Identifier).to.be.eql('1');
|
||||
expect(pm.TileMatrix[1].MatrixHeight).to.be.eql(2);
|
||||
expect(pm.TileMatrix[1].MatrixWidth).to.be.eql(2);
|
||||
expect(pm.TileMatrix[1].ScaleDenominator).to.be.eql(
|
||||
279541132.0143588959472254
|
||||
);
|
||||
expect(pm.TileMatrix[1].TileWidth).to.be.eql(256);
|
||||
expect(pm.TileMatrix[1].TileHeight).to.be.eql(256);
|
||||
expect(pm.TileMatrix[1].TopLeftCorner).to.be.a('array');
|
||||
expect(pm.TileMatrix[1].TopLeftCorner[0]).to.be.eql(-20037508);
|
||||
expect(pm.TileMatrix[1].TopLeftCorner[1]).to.be.eql(20037508);
|
||||
});
|
||||
});
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user