2021-01-03 03:09:52 +01:00
|
|
|
import FeatureSource from "./FeatureSource";
|
|
|
|
import {UIEventSource} from "../UIEventSource";
|
|
|
|
import LayerConfig from "../../Customizations/JSON/LayerConfig";
|
|
|
|
import {GeoOperations} from "../GeoOperations";
|
|
|
|
|
2021-03-25 15:19:44 +01:00
|
|
|
/**
|
|
|
|
* This is the part of the pipeline which introduces extra points at the center of an area (but only if this is demanded by the wayhandling)
|
|
|
|
*/
|
2021-01-03 03:09:52 +01:00
|
|
|
export default class WayHandlingApplyingFeatureSource implements FeatureSource {
|
2021-04-23 16:51:44 +02:00
|
|
|
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
|
|
|
public readonly name;
|
2021-01-03 03:09:52 +01:00
|
|
|
|
2021-02-20 01:45:51 +01:00
|
|
|
constructor(layers: UIEventSource<{
|
2021-01-03 03:09:52 +01:00
|
|
|
layerDef: LayerConfig
|
2021-02-20 01:45:51 +01:00
|
|
|
}[]>,
|
2021-01-03 03:09:52 +01:00
|
|
|
upstream: FeatureSource) {
|
2021-04-23 16:51:44 +02:00
|
|
|
this.name = "Wayhandling of " + upstream.name;
|
2021-01-03 03:09:52 +01:00
|
|
|
this.features = upstream.features.map(
|
|
|
|
features => {
|
2021-04-23 16:51:44 +02:00
|
|
|
if (features === undefined) {
|
2021-01-03 03:09:52 +01:00
|
|
|
return;
|
|
|
|
}
|
2021-02-20 01:45:51 +01:00
|
|
|
|
|
|
|
const layerDict = {};
|
|
|
|
let allDefaultWayHandling = true;
|
|
|
|
for (const layer of layers.data) {
|
|
|
|
layerDict[layer.layerDef.id] = layer;
|
|
|
|
if (layer.layerDef.wayHandling !== LayerConfig.WAYHANDLING_DEFAULT) {
|
|
|
|
allDefaultWayHandling = false;
|
|
|
|
}
|
|
|
|
}
|
2021-04-23 16:51:44 +02:00
|
|
|
|
2021-01-03 03:09:52 +01:00
|
|
|
const newFeatures: { feature: any, freshness: Date }[] = [];
|
|
|
|
for (const f of features) {
|
|
|
|
const feat = f.feature;
|
2021-01-04 04:06:21 +01:00
|
|
|
const layerId = feat._matching_layer_id;
|
2021-01-03 03:09:52 +01:00
|
|
|
const layer: LayerConfig = layerDict[layerId].layerDef;
|
|
|
|
if (layer === undefined) {
|
|
|
|
throw "No layer found with id " + layerId;
|
|
|
|
}
|
2021-04-23 16:51:44 +02:00
|
|
|
|
|
|
|
if (layer.wayHandling === LayerConfig.WAYHANDLING_DEFAULT) {
|
2021-01-03 03:09:52 +01:00
|
|
|
newFeatures.push(f);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (feat.geometry.type === "Point") {
|
|
|
|
newFeatures.push(f);
|
|
|
|
// it is a point, nothing to do here
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-03-25 15:19:44 +01:00
|
|
|
// Create the copy
|
2021-01-03 03:09:52 +01:00
|
|
|
const centerPoint = GeoOperations.centerpoint(feat);
|
2021-04-23 12:55:38 +02:00
|
|
|
centerPoint["_matching_layer_id"] = feat._matching_layer_id;
|
2021-04-23 16:51:44 +02:00
|
|
|
|
2021-01-03 03:09:52 +01:00
|
|
|
newFeatures.push({feature: centerPoint, freshness: f.freshness});
|
2021-04-23 16:51:44 +02:00
|
|
|
if (layer.wayHandling === LayerConfig.WAYHANDLING_CENTER_AND_WAY) {
|
2021-01-03 03:09:52 +01:00
|
|
|
newFeatures.push(f);
|
|
|
|
}
|
2021-04-23 16:51:44 +02:00
|
|
|
|
2021-01-03 03:09:52 +01:00
|
|
|
}
|
|
|
|
return newFeatures;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|