2023-06-01 02:52:21 +02:00
|
|
|
import {OsmCreateAction, PreviewableAction} from "./OsmChangeAction"
|
2023-05-30 02:52:22 +02:00
|
|
|
import {Tag} from "../../Tags/Tag"
|
|
|
|
import {Changes} from "../Changes"
|
|
|
|
import {ChangeDescription} from "./ChangeDescription"
|
2021-12-10 04:00:02 +01:00
|
|
|
import CreateNewWayAction from "./CreateNewWayAction"
|
2023-05-30 02:52:22 +02:00
|
|
|
import CreateWayWithPointReuseAction, {MergePointConfig} from "./CreateWayWithPointReuseAction"
|
|
|
|
import {And} from "../../Tags/And"
|
|
|
|
import {TagUtils} from "../../Tags/TagUtils"
|
2023-06-01 02:52:21 +02:00
|
|
|
import {FeatureSource, IndexedFeatureSource} from "../../FeatureSource/FeatureSource"
|
2023-05-30 02:52:22 +02:00
|
|
|
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig";
|
|
|
|
import {Position} from "geojson";
|
|
|
|
import FullNodeDatabaseSource from "../../FeatureSource/TiledFeatureSource/FullNodeDatabaseSource";
|
2021-12-10 04:00:02 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points
|
|
|
|
*/
|
2023-06-01 02:52:21 +02:00
|
|
|
export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAction implements PreviewableAction {
|
2021-12-10 04:00:02 +01:00
|
|
|
public newElementId: string = undefined
|
2022-01-26 21:40:38 +01:00
|
|
|
public newElementIdNumber: number = undefined
|
|
|
|
private readonly _tags: Tag[]
|
2021-12-10 04:00:02 +01:00
|
|
|
private readonly createOuterWay: CreateWayWithPointReuseAction
|
2022-01-26 21:40:38 +01:00
|
|
|
private readonly createInnerWays: CreateNewWayAction[]
|
|
|
|
private readonly geojsonPreview: any
|
2021-12-10 04:00:02 +01:00
|
|
|
private readonly theme: string
|
|
|
|
private readonly changeType: "import" | "create" | string
|
2022-01-26 21:40:38 +01:00
|
|
|
|
2021-12-10 04:00:02 +01:00
|
|
|
constructor(
|
|
|
|
tags: Tag[],
|
2023-05-30 02:52:22 +02:00
|
|
|
outerRingCoordinates: Position[],
|
|
|
|
innerRingsCoordinates: Position[][],
|
|
|
|
state: {
|
|
|
|
layout: LayoutConfig;
|
|
|
|
changes: Changes;
|
|
|
|
indexedFeatures: IndexedFeatureSource,
|
|
|
|
fullNodeDatabase?: FullNodeDatabaseSource
|
|
|
|
},
|
2021-12-10 04:00:02 +01:00
|
|
|
config: MergePointConfig[],
|
|
|
|
changeType: "import" | "create" | string
|
|
|
|
) {
|
2022-01-26 21:40:38 +01:00
|
|
|
super(null, true)
|
|
|
|
this._tags = [...tags, new Tag("type", "multipolygon")]
|
2021-12-10 04:00:02 +01:00
|
|
|
this.changeType = changeType
|
2023-03-28 05:13:48 +02:00
|
|
|
this.theme = state?.layout?.id ?? ""
|
2022-01-26 21:40:38 +01:00
|
|
|
this.createOuterWay = new CreateWayWithPointReuseAction(
|
|
|
|
[],
|
2023-05-30 02:52:22 +02:00
|
|
|
<[number,number][]> outerRingCoordinates,
|
2022-01-26 21:40:38 +01:00
|
|
|
state,
|
|
|
|
config
|
|
|
|
)
|
|
|
|
this.createInnerWays = innerRingsCoordinates.map(
|
|
|
|
(ringCoordinates) =>
|
|
|
|
new CreateNewWayAction(
|
|
|
|
[],
|
|
|
|
ringCoordinates.map(([lon, lat]) => ({ lat, lon })),
|
2023-03-28 05:13:48 +02:00
|
|
|
{ theme: state?.layout?.id }
|
2022-02-22 14:13:41 +01:00
|
|
|
)
|
2022-09-08 21:40:48 +02:00
|
|
|
)
|
2022-01-26 21:40:38 +01:00
|
|
|
|
|
|
|
this.geojsonPreview = {
|
2021-12-10 04:00:02 +01:00
|
|
|
type: "Feature",
|
|
|
|
properties: TagUtils.changeAsProperties(new And(this._tags).asChange({})),
|
2022-01-26 21:40:38 +01:00
|
|
|
geometry: {
|
2021-12-10 04:00:02 +01:00
|
|
|
type: "Polygon",
|
|
|
|
coordinates: [outerRingCoordinates, ...innerRingsCoordinates],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> {
|
|
|
|
const descriptions: ChangeDescription[] = []
|
|
|
|
descriptions.push(...(await this.createOuterWay.CreateChangeDescriptions(changes)))
|
|
|
|
for (const innerWay of this.createInnerWays) {
|
|
|
|
descriptions.push(...(await innerWay.CreateChangeDescriptions(changes)))
|
|
|
|
}
|
|
|
|
|
|
|
|
this.newElementIdNumber = changes.getNewID()
|
2022-01-26 21:40:38 +01:00
|
|
|
this.newElementId = "relation/" + this.newElementIdNumber
|
2021-12-10 04:00:02 +01:00
|
|
|
descriptions.push({
|
2022-01-26 21:40:38 +01:00
|
|
|
type: "relation",
|
2021-12-10 04:00:02 +01:00
|
|
|
id: this.newElementIdNumber,
|
|
|
|
tags: new And(this._tags).asChange({}),
|
|
|
|
meta: {
|
|
|
|
theme: this.theme,
|
2022-01-26 21:40:38 +01:00
|
|
|
changeType: this.changeType,
|
2021-12-10 04:00:02 +01:00
|
|
|
},
|
|
|
|
changes: {
|
|
|
|
members: [
|
|
|
|
{
|
|
|
|
type: "way",
|
|
|
|
ref: this.createOuterWay.newElementIdNumber,
|
|
|
|
role: "outer",
|
|
|
|
},
|
|
|
|
// @ts-ignore
|
|
|
|
...this.createInnerWays.map((a) => ({
|
|
|
|
type: "way",
|
|
|
|
ref: a.newElementIdNumber,
|
|
|
|
role: "inner",
|
|
|
|
})),
|
|
|
|
],
|
|
|
|
},
|
|
|
|
})
|
2022-01-26 21:40:38 +01:00
|
|
|
|
2021-12-10 04:00:02 +01:00
|
|
|
return descriptions
|
|
|
|
}
|
2023-06-01 02:52:21 +02:00
|
|
|
|
|
|
|
getPreview(): Promise<FeatureSource> {
|
|
|
|
return undefined
|
|
|
|
}
|
2021-12-10 04:00:02 +01:00
|
|
|
}
|