Merge pull request #11540 from gberaudo/avoid_mvt_reprojection

Avoid unnecessary transform in the MVT format
This commit is contained in:
Andreas Hocevar
2020-09-10 19:18:33 +02:00
committed by GitHub
3 changed files with 36 additions and 27 deletions

View File

@@ -194,7 +194,7 @@ class MVT extends FeatureFormat {
values,
id
);
feature.transform(options.dataProjection, options.featureProjection);
feature.transform(options.dataProjection);
} else {
let geom;
if (geometryType == GeometryType.POLYGON) {

View File

@@ -276,34 +276,34 @@ class RenderFeature {
/**
* Transform geometry coordinates from tile pixel space to projected.
* The SRS of the source and destination are expected to be the same.
*
* @param {import("../proj.js").ProjectionLike} source The current projection
* @param {import("../proj.js").ProjectionLike} destination The desired projection.
* @param {import("../proj.js").ProjectionLike} projection The data projection
*/
transform(source, destination) {
source = getProjection(source);
const pixelExtent = source.getExtent();
const projectedExtent = source.getWorldExtent();
const scale = getHeight(projectedExtent) / getHeight(pixelExtent);
composeTransform(
tmpTransform,
projectedExtent[0],
projectedExtent[3],
scale,
-scale,
0,
0,
0
);
transform2D(
this.flatCoordinates_,
0,
this.flatCoordinates_.length,
2,
tmpTransform,
this.flatCoordinates_
);
transform(projection) {
projection = getProjection(projection);
const pixelExtent = projection.getExtent();
const projectedExtent = projection.getWorldExtent();
if (pixelExtent && projectedExtent) {
const scale = getHeight(projectedExtent) / getHeight(pixelExtent);
composeTransform(
tmpTransform,
projectedExtent[0],
projectedExtent[3],
scale,
-scale,
0,
0,
0
);
transform2D(
this.flatCoordinates_,
0,
this.flatCoordinates_.length,
2,
tmpTransform,
this.flatCoordinates_
);
}
}
/**
* @return {Array<number>|Array<Array<number>>} Ends or endss.

View File

@@ -65,6 +65,15 @@ where('ArrayBuffer.isView').describe('ol.format.MVT', function () {
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({