forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {OsmCreateAction, PreviewableAction} from "./OsmChangeAction"
 | 
						|
import {Tag} from "../../Tags/Tag"
 | 
						|
import {Changes} from "../Changes"
 | 
						|
import {ChangeDescription} from "./ChangeDescription"
 | 
						|
import CreateNewWayAction from "./CreateNewWayAction"
 | 
						|
import CreateWayWithPointReuseAction, {MergePointConfig} from "./CreateWayWithPointReuseAction"
 | 
						|
import {And} from "../../Tags/And"
 | 
						|
import {TagUtils} from "../../Tags/TagUtils"
 | 
						|
import {FeatureSource, IndexedFeatureSource} from "../../FeatureSource/FeatureSource"
 | 
						|
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig";
 | 
						|
import {Position} from "geojson";
 | 
						|
import FullNodeDatabaseSource from "../../FeatureSource/TiledFeatureSource/FullNodeDatabaseSource";
 | 
						|
 | 
						|
/**
 | 
						|
 * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points
 | 
						|
 */
 | 
						|
export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAction implements PreviewableAction {
 | 
						|
    public newElementId: string = undefined
 | 
						|
    public newElementIdNumber: number = undefined
 | 
						|
    private readonly _tags: Tag[]
 | 
						|
    private readonly createOuterWay: CreateWayWithPointReuseAction
 | 
						|
    private readonly createInnerWays: CreateNewWayAction[]
 | 
						|
    private readonly geojsonPreview: any
 | 
						|
    private readonly theme: string
 | 
						|
    private readonly changeType: "import" | "create" | string
 | 
						|
 | 
						|
    constructor(
 | 
						|
        tags: Tag[],
 | 
						|
        outerRingCoordinates: Position[],
 | 
						|
        innerRingsCoordinates: Position[][],
 | 
						|
        state: {
 | 
						|
            layout: LayoutConfig;
 | 
						|
            changes: Changes;
 | 
						|
            indexedFeatures: IndexedFeatureSource,
 | 
						|
            fullNodeDatabase?: FullNodeDatabaseSource
 | 
						|
        },
 | 
						|
        config: MergePointConfig[],
 | 
						|
        changeType: "import" | "create" | string
 | 
						|
    ) {
 | 
						|
        super(null, true)
 | 
						|
        this._tags = [...tags, new Tag("type", "multipolygon")]
 | 
						|
        this.changeType = changeType
 | 
						|
        this.theme = state?.layout?.id ?? ""
 | 
						|
        this.createOuterWay = new CreateWayWithPointReuseAction(
 | 
						|
            [],
 | 
						|
            <[number,number][]> outerRingCoordinates,
 | 
						|
            state,
 | 
						|
            config
 | 
						|
        )
 | 
						|
        this.createInnerWays = innerRingsCoordinates.map(
 | 
						|
            (ringCoordinates) =>
 | 
						|
                new CreateNewWayAction(
 | 
						|
                    [],
 | 
						|
                    ringCoordinates.map(([lon, lat]) => ({ lat, lon })),
 | 
						|
                    { theme: state?.layout?.id }
 | 
						|
                )
 | 
						|
        )
 | 
						|
 | 
						|
        this.geojsonPreview = {
 | 
						|
            type: "Feature",
 | 
						|
            properties: TagUtils.changeAsProperties(new And(this._tags).asChange({})),
 | 
						|
            geometry: {
 | 
						|
                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()
 | 
						|
        this.newElementId = "relation/" + this.newElementIdNumber
 | 
						|
        descriptions.push({
 | 
						|
            type: "relation",
 | 
						|
            id: this.newElementIdNumber,
 | 
						|
            tags: new And(this._tags).asChange({}),
 | 
						|
            meta: {
 | 
						|
                theme: this.theme,
 | 
						|
                changeType: this.changeType,
 | 
						|
            },
 | 
						|
            changes: {
 | 
						|
                members: [
 | 
						|
                    {
 | 
						|
                        type: "way",
 | 
						|
                        ref: this.createOuterWay.newElementIdNumber,
 | 
						|
                        role: "outer",
 | 
						|
                    },
 | 
						|
                    // @ts-ignore
 | 
						|
                    ...this.createInnerWays.map((a) => ({
 | 
						|
                        type: "way",
 | 
						|
                        ref: a.newElementIdNumber,
 | 
						|
                        role: "inner",
 | 
						|
                    })),
 | 
						|
                ],
 | 
						|
            },
 | 
						|
        })
 | 
						|
 | 
						|
        return descriptions
 | 
						|
    }
 | 
						|
 | 
						|
    getPreview(): Promise<FeatureSource> {
 | 
						|
        return undefined
 | 
						|
    }
 | 
						|
}
 |