mapcomplete/Logic/FeatureSource/Sources/WayHandlingApplyingFeatureSource.ts

65 lines
No EOL
2.7 KiB
TypeScript

/**
* This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indiciates with what renderConfig it should be rendered.
*/
import {UIEventSource} from "../../UIEventSource";
import {GeoOperations} from "../../GeoOperations";
import FeatureSource from "../FeatureSource";
import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
export default class RenderingMultiPlexerFeatureSource {
public readonly features: UIEventSource<(any & {pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined})[]>;
constructor(upstream: FeatureSource, layer: LayerConfig) {
this.features = upstream.features.map(
features => {
if (features === undefined) {
return;
}
const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({rendering: r, index: i}))
const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point"))
const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid"))
const lineRenderObjects = layer.lineRendering
const withIndex : (any & {pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined})[] = [];
for (const f of features) {
const feat = f.feature;
if(feat.geometry.type === "Point"){
for (const rendering of pointRenderings) {
withIndex.push({
...feat,
pointRenderingIndex: rendering.index
})
}
}else{
// This is a a line
for (const rendering of centroidRenderings) {
withIndex.push({
...GeoOperations.centerpoint(feat),
pointRenderingIndex: rendering.index
})
}
for (let i = 0; i < lineRenderObjects.length; i++){
withIndex.push({
...feat,
lineRenderingIndex:i
})
}
}
}
return withIndex;
}
);
}
}