Introduce ol.render.Feature
This commit is contained in:
@@ -11,6 +11,7 @@ goog.require('ol.format.Feature');
|
||||
goog.require('ol.format.FormatType');
|
||||
goog.require('ol.geom.Geometry');
|
||||
goog.require('ol.geom.GeometryLayout');
|
||||
goog.require('ol.geom.GeometryType');
|
||||
goog.require('ol.geom.LineString');
|
||||
goog.require('ol.geom.MultiLineString');
|
||||
goog.require('ol.geom.MultiPoint');
|
||||
@@ -19,6 +20,7 @@ goog.require('ol.geom.Polygon');
|
||||
goog.require('ol.proj');
|
||||
goog.require('ol.proj.Projection');
|
||||
goog.require('ol.proj.Units');
|
||||
goog.require('ol.render.Feature');
|
||||
|
||||
|
||||
|
||||
@@ -45,6 +47,15 @@ ol.format.MVT = function(opt_options) {
|
||||
units: ol.proj.Units.TILE_PIXELS
|
||||
});
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {function((ol.geom.Geometry|Object.<string, *>)=)|
|
||||
* function(ol.geom.GeometryType,Array.<number>,
|
||||
* (Array.<number>|Array.<Array.<number>>),Object.<string, *>)}
|
||||
*/
|
||||
this.featureClass_ = goog.isDef(options.featureClass) ?
|
||||
options.featureClass : ol.render.Feature;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {string}
|
||||
@@ -79,12 +90,15 @@ ol.format.MVT.prototype.getType = function() {
|
||||
/**
|
||||
* @private
|
||||
* @param {Object} rawFeature Raw Mapbox feature.
|
||||
* @param {string} layer Layer.
|
||||
* @param {olx.format.ReadOptions=} opt_options Read options.
|
||||
* @return {ol.Feature} Feature.
|
||||
*/
|
||||
ol.format.MVT.prototype.readFeature_ = function(rawFeature, opt_options) {
|
||||
var feature = new ol.Feature();
|
||||
ol.format.MVT.prototype.readFeature_ = function(
|
||||
rawFeature, layer, opt_options) {
|
||||
var feature = new this.featureClass_();
|
||||
var values = rawFeature.properties;
|
||||
values[this.layerName_] = layer;
|
||||
var geometry = ol.format.Feature.transformWithOptions(
|
||||
ol.format.MVT.readGeometry_(rawFeature), false,
|
||||
this.adaptOptions(opt_options));
|
||||
@@ -98,18 +112,66 @@ ol.format.MVT.prototype.readFeature_ = function(rawFeature, opt_options) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {Object} rawFeature Raw Mapbox feature.
|
||||
* @param {string} layer Layer.
|
||||
* @return {ol.render.Feature} Feature.
|
||||
*/
|
||||
ol.format.MVT.prototype.readRenderFeature_ = function(rawFeature, layer) {
|
||||
var coords = rawFeature.loadGeometry();
|
||||
var end = 0;
|
||||
var ends = [];
|
||||
var flatCoordinates = [];
|
||||
var line, coord;
|
||||
for (var i = 0, ii = coords.length; i < ii; ++i) {
|
||||
line = coords[i];
|
||||
for (var j = 0, jj = line.length; j < jj; ++j) {
|
||||
coord = line[j];
|
||||
// Non-tilespace coords can be calculated here when a TileGrid and
|
||||
// TileCoord are known.
|
||||
flatCoordinates.push(coord.x, coord.y);
|
||||
}
|
||||
end += 2 * j;
|
||||
ends.push(end);
|
||||
}
|
||||
|
||||
var type = rawFeature.type;
|
||||
/** @type {ol.geom.GeometryType} */
|
||||
var geometryType;
|
||||
if (type === 1) {
|
||||
geometryType = coords.length === 1 ?
|
||||
ol.geom.GeometryType.POINT : ol.geom.GeometryType.MULTI_POINT;
|
||||
} else if (type === 2) {
|
||||
if (coords.length === 1) {
|
||||
geometryType = ol.geom.GeometryType.LINE_STRING;
|
||||
} else {
|
||||
geometryType = ol.geom.GeometryType.MULTI_LINE_STRING;
|
||||
}
|
||||
} else {
|
||||
geometryType = ol.geom.GeometryType.POLYGON;
|
||||
}
|
||||
|
||||
var properties = rawFeature.properties;
|
||||
properties[this.layerName_] = layer;
|
||||
|
||||
return new this.featureClass_(
|
||||
geometryType, flatCoordinates, ends, rawFeature.properties);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
ol.format.MVT.prototype.readFeatures = function(source, opt_options) {
|
||||
goog.asserts.assertInstanceof(source, ArrayBuffer);
|
||||
|
||||
var layerName = this.layerName_;
|
||||
var layers = this.layers_;
|
||||
|
||||
var pbf = new ol.ext.pbf(source);
|
||||
var tile = new ol.ext.vectortile.VectorTile(pbf);
|
||||
var features = [];
|
||||
var featureClass = this.featureClass_;
|
||||
var layer, feature;
|
||||
for (var name in tile.layers) {
|
||||
if (!goog.isNull(layers) && !goog.array.contains(layers, name)) {
|
||||
@@ -118,8 +180,11 @@ ol.format.MVT.prototype.readFeatures = function(source, opt_options) {
|
||||
layer = tile.layers[name];
|
||||
|
||||
for (var i = 0, ii = layer.length; i < layer.length; ++i) {
|
||||
feature = this.readFeature_(layer.feature(i), opt_options);
|
||||
feature.set(layerName, name);
|
||||
if (featureClass === ol.render.Feature) {
|
||||
feature = this.readRenderFeature_(layer.feature(i), name);
|
||||
} else {
|
||||
feature = this.readFeature_(layer.feature(i), name, opt_options);
|
||||
}
|
||||
features.push(feature);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user