268 lines
7.7 KiB
JavaScript
268 lines
7.7 KiB
JavaScript
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');
|
|
});
|
|
});
|
|
});
|