Avoid unnecessary transform in MVT format
When using ol.render.Feature there was a mandatory geometry transform. With this change it is now easy to read features directly in the native tile projection. Since there is no needed transform, there is no need either to define an extent and a world extent, for that use-case.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user