forked from MapComplete/MapComplete
Add multiple icons for multipolygons
This commit is contained in:
parent
42bd301389
commit
477dc265d2
1 changed files with 97 additions and 65 deletions
|
@ -1,8 +1,8 @@
|
||||||
/**
|
/**
|
||||||
* This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered.
|
* This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered.
|
||||||
*/
|
*/
|
||||||
import { Store } from "../../UIEventSource"
|
import {Store} from "../../UIEventSource"
|
||||||
import { GeoOperations } from "../../GeoOperations"
|
import {GeoOperations} from "../../GeoOperations"
|
||||||
import FeatureSource from "../FeatureSource"
|
import FeatureSource from "../FeatureSource"
|
||||||
import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig"
|
import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig"
|
||||||
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"
|
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"
|
||||||
|
@ -16,71 +16,13 @@ export default class RenderingMultiPlexerFeatureSource {
|
||||||
})[]
|
})[]
|
||||||
>
|
>
|
||||||
private readonly pointRenderings: { rendering: PointRenderingConfig; index: number }[]
|
private readonly pointRenderings: { rendering: PointRenderingConfig; index: number }[]
|
||||||
private centroidRenderings: { rendering: PointRenderingConfig; index: number }[]
|
private readonly centroidRenderings: { rendering: PointRenderingConfig; index: number }[]
|
||||||
private projectedCentroidRenderings: { rendering: PointRenderingConfig; index: number }[]
|
private readonly projectedCentroidRenderings: { rendering: PointRenderingConfig; index: number }[]
|
||||||
private startRenderings: { rendering: PointRenderingConfig; index: number }[]
|
private readonly startRenderings: { rendering: PointRenderingConfig; index: number }[]
|
||||||
private endRenderings: { rendering: PointRenderingConfig; index: number }[]
|
private readonly endRenderings: { rendering: PointRenderingConfig; index: number }[]
|
||||||
private hasCentroid: boolean
|
private readonly hasCentroid: boolean
|
||||||
private lineRenderObjects: LineRenderingConfig[]
|
private lineRenderObjects: LineRenderingConfig[]
|
||||||
|
|
||||||
private inspectFeature(
|
|
||||||
feat,
|
|
||||||
addAsPoint: (feat, rendering, centerpoint: [number, number]) => void,
|
|
||||||
withIndex: any[]
|
|
||||||
) {
|
|
||||||
if (feat.geometry.type === "Point") {
|
|
||||||
for (const rendering of this.pointRenderings) {
|
|
||||||
withIndex.push({
|
|
||||||
...feat,
|
|
||||||
pointRenderingIndex: rendering.index,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// This is a a line: add the centroids
|
|
||||||
let centerpoint: [number, number] = undefined
|
|
||||||
let projectedCenterPoint: [number, number] = undefined
|
|
||||||
if (this.hasCentroid) {
|
|
||||||
centerpoint = GeoOperations.centerpointCoordinates(feat)
|
|
||||||
if (this.projectedCentroidRenderings.length > 0) {
|
|
||||||
projectedCenterPoint = <[number, number]>(
|
|
||||||
GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const rendering of this.centroidRenderings) {
|
|
||||||
addAsPoint(feat, rendering, centerpoint)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (feat.geometry.type === "LineString") {
|
|
||||||
for (const rendering of this.projectedCentroidRenderings) {
|
|
||||||
addAsPoint(feat, rendering, projectedCenterPoint)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add start- and endpoints
|
|
||||||
const coordinates = feat.geometry.coordinates
|
|
||||||
for (const rendering of this.startRenderings) {
|
|
||||||
addAsPoint(feat, rendering, coordinates[0])
|
|
||||||
}
|
|
||||||
for (const rendering of this.endRenderings) {
|
|
||||||
const coordinate = coordinates[coordinates.length - 1]
|
|
||||||
addAsPoint(feat, rendering, coordinate)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (const rendering of this.projectedCentroidRenderings) {
|
|
||||||
addAsPoint(feat, rendering, centerpoint)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AT last, add it 'as is' to what we should render
|
|
||||||
for (let i = 0; i < this.lineRenderObjects.length; i++) {
|
|
||||||
withIndex.push({
|
|
||||||
...feat,
|
|
||||||
lineRenderingIndex: i,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(upstream: FeatureSource, layer: LayerConfig) {
|
constructor(upstream: FeatureSource, layer: LayerConfig) {
|
||||||
const pointRenderObjects: { rendering: PointRenderingConfig; index: number }[] =
|
const pointRenderObjects: { rendering: PointRenderingConfig; index: number }[] =
|
||||||
layer.mapRendering.map((r, i) => ({
|
layer.mapRendering.map((r, i) => ({
|
||||||
|
@ -130,4 +72,94 @@ export default class RenderingMultiPlexerFeatureSource {
|
||||||
return withIndex
|
return withIndex
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For every source feature, adds the necessary rendering-features
|
||||||
|
*/
|
||||||
|
private inspectFeature(
|
||||||
|
feat,
|
||||||
|
addAsPoint: (feat, rendering, centerpoint: [number, number]) => void,
|
||||||
|
withIndex: any[]
|
||||||
|
) {
|
||||||
|
if (feat.geometry.type === "Point") {
|
||||||
|
for (const rendering of this.pointRenderings) {
|
||||||
|
withIndex.push({
|
||||||
|
...feat,
|
||||||
|
pointRenderingIndex: rendering.index,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else if (feat.geometry.type === "MultiPolygon") {
|
||||||
|
if (this.centroidRenderings.length > 0 || this.projectedCentroidRenderings.length > 0) {
|
||||||
|
|
||||||
|
const centerpoints: [number, number][] = (<[number, number][][][]>feat.geometry.coordinates).map(rings => GeoOperations.centerpointCoordinates(
|
||||||
|
{type: "Feature", properties: {}, geometry: {type: "Polygon", coordinates: rings}}
|
||||||
|
))
|
||||||
|
for (const centroidRendering of this.centroidRenderings) {
|
||||||
|
for (const centerpoint of centerpoints) {
|
||||||
|
addAsPoint(feat, centroidRendering, centerpoint)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const centroidRendering of this.projectedCentroidRenderings) {
|
||||||
|
for (const centerpoint of centerpoints) {
|
||||||
|
addAsPoint(feat, centroidRendering, centerpoint)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// AT last, add it 'as is' to what we should render
|
||||||
|
for (let i = 0; i < this.lineRenderObjects.length; i++) {
|
||||||
|
withIndex.push({
|
||||||
|
...feat,
|
||||||
|
lineRenderingIndex: i,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// This is a a line or polygon: add the centroids
|
||||||
|
let centerpoint: [number, number] = undefined
|
||||||
|
let projectedCenterPoint: [number, number] = undefined
|
||||||
|
if (this.hasCentroid) {
|
||||||
|
centerpoint = GeoOperations.centerpointCoordinates(feat)
|
||||||
|
if (this.projectedCentroidRenderings.length > 0) {
|
||||||
|
projectedCenterPoint = <[number, number]>(
|
||||||
|
GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const rendering of this.centroidRenderings) {
|
||||||
|
addAsPoint(feat, rendering, centerpoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (feat.geometry.type === "LineString") {
|
||||||
|
for (const rendering of this.projectedCentroidRenderings) {
|
||||||
|
addAsPoint(feat, rendering, projectedCenterPoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add start- and endpoints
|
||||||
|
const coordinates = feat.geometry.coordinates
|
||||||
|
for (const rendering of this.startRenderings) {
|
||||||
|
addAsPoint(feat, rendering, coordinates[0])
|
||||||
|
}
|
||||||
|
for (const rendering of this.endRenderings) {
|
||||||
|
const coordinate = coordinates[coordinates.length - 1]
|
||||||
|
addAsPoint(feat, rendering, coordinate)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const rendering of this.projectedCentroidRenderings) {
|
||||||
|
addAsPoint(feat, rendering, centerpoint)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AT last, add it 'as is' to what we should render
|
||||||
|
for (let i = 0; i < this.lineRenderObjects.length; i++) {
|
||||||
|
withIndex.push({
|
||||||
|
...feat,
|
||||||
|
lineRenderingIndex: i,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue