Parse PBF directly in ol.format.MVT

This change also fixes a previous issue, where MultiPolygon geometries for
ol.Feature features were never created.
This commit is contained in:
Andreas Hocevar
2017-08-28 19:05:10 +02:00
parent 4b4f383043
commit 3cb5060497
5 changed files with 364 additions and 174 deletions

View File

@@ -1,11 +1,11 @@
goog.require('ol.Feature');
goog.require('ol.ext.PBF');
goog.require('ol.ext.vectortile.VectorTile');
goog.require('ol.extent');
goog.require('ol.format.MVT');
goog.require('ol.geom.Point');
goog.require('ol.geom.Polygon');
goog.require('ol.geom.MultiPolygon');
goog.require('ol.render.Feature');
where('ArrayBuffer.isView').describe('ol.format.MVT', function() {
@@ -41,36 +41,23 @@ where('ArrayBuffer.isView').describe('ol.format.MVT', function() {
featureClass: ol.Feature,
layers: ['poi_label']
});
var pbf = new ol.ext.PBF(data);
var tile = new ol.ext.vectortile.VectorTile(pbf);
var geometry, rawGeometry;
var geometry;
rawGeometry = tile.layers['poi_label'].feature(0).loadGeometry();
geometry = format.readFeatures(data)[0]
.getGeometry();
geometry = format.readFeatures(data)[0].getGeometry();
expect(geometry.getType()).to.be('Point');
expect(geometry.getCoordinates())
.to.eql([rawGeometry[0][0].x, rawGeometry[0][0].y]);
expect(geometry.getCoordinates()).to.eql([-1210, 2681]);
rawGeometry = tile.layers['water'].feature(0).loadGeometry();
format.setLayers(['water']);
geometry = format.readFeatures(data)[0]
.getGeometry();
geometry = format.readFeatures(data)[0].getGeometry();
expect(geometry.getType()).to.be('Polygon');
expect(rawGeometry[0].length)
.to.equal(geometry.getCoordinates()[0].length);
expect(geometry.getCoordinates()[0][0])
.to.eql([rawGeometry[0][0].x, rawGeometry[0][0].y]);
expect(geometry.getCoordinates()[0].length).to.be(10);
expect(geometry.getCoordinates()[0][0]).to.eql([1007, 2302]);
rawGeometry = tile.layers['barrier_line'].feature(0).loadGeometry();
format.setLayers(['barrier_line']);
geometry = format.readFeatures(data)[0]
.getGeometry();
geometry = format.readFeatures(data)[0].getGeometry();
expect(geometry.getType()).to.be('MultiLineString');
expect(rawGeometry[1].length)
.to.equal(geometry.getCoordinates()[1].length);
expect(geometry.getCoordinates()[1][0])
.to.eql([rawGeometry[1][0].x, rawGeometry[1][0].y]);
expect(geometry.getCoordinates()[1].length).to.be(6);
expect(geometry.getCoordinates()[1][0]).to.eql([4160, 3489]);
});
it('parses id property', function() {
@@ -102,7 +89,7 @@ where('ArrayBuffer.isView').describe('ol.format.MVT', function() {
describe('ol.format.MVT', function() {
describe('#readFeature_', function() {
describe('#createFeature_', function() {
it('accepts a geometryName', function() {
var format = new ol.format.MVT({
featureClass: ol.Feature,
@@ -114,16 +101,99 @@ describe('ol.format.MVT', function() {
geometry: 'foo'
},
type: 1,
loadGeometry: function() {
return [[0, 0]];
layer: {
name: 'layer1'
}
};
var feature = format.readFeature_(rawFeature, 'mapbox');
var readRawGeometry_ = ol.format.MVT.readRawGeometry_;
ol.format.MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0);
ends.push(2);
};
var feature = format.createFeature_({}, rawFeature);
ol.format.MVT.readRawGeometry_ = readRawGeometry_;
var geometry = feature.getGeometry();
expect(geometry).to.be.a(ol.geom.Point);
expect(feature.get('myGeom')).to.equal(geometry);
expect(feature.get('geometry')).to.be('foo');
});
it('detects a Polygon', function() {
var format = new ol.format.MVT({
featureClass: ol.Feature
});
var rawFeature = {
type: 3,
properties: {},
layer: {
name: 'layer1'
}
};
var readRawGeometry_ = ol.format.MVT.readRawGeometry_;
ol.format.MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0, 3, 0, 3, 3, 3, 0, 0, 0);
flatCoordinates.push(1, 1, 1, 2, 2, 2, 2, 1, 1, 1);
ends.push(10, 20);
};
var feature = format.createFeature_({}, rawFeature);
ol.format.MVT.readRawGeometry_ = readRawGeometry_;
var geometry = feature.getGeometry();
expect(geometry).to.be.a(ol.geom.Polygon);
});
it('detects a MultiPolygon', function() {
var format = new ol.format.MVT({
featureClass: ol.Feature
});
var rawFeature = {
type: 3,
properties: {},
layer: {
name: 'layer1'
}
};
var readRawGeometry_ = ol.format.MVT.readRawGeometry_;
ol.format.MVT.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);
ends.push(10, 20);
};
var feature = format.createFeature_({}, rawFeature);
ol.format.MVT.readRawGeometry_ = readRawGeometry_;
var geometry = feature.getGeometry();
expect(geometry).to.be.a(ol.geom.MultiPolygon);
});
it('creates ol.render.Feature instances', function() {
var format = new ol.format.MVT();
var rawFeature = {
type: 3,
properties: {
foo: 'bar'
},
layer: {
name: 'layer1'
}
};
var readRawGeometry_ = ol.format.MVT.readRawGeometry_;
var createdFlatCoordinates;
var createdEnds;
ol.format.MVT.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;
};
var feature = format.createFeature_({}, rawFeature);
ol.format.MVT.readRawGeometry_ = readRawGeometry_;
expect(feature).to.be.a(ol.render.Feature);
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');
});
});
});