forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			102 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {OsmCreateAction} from "./OsmChangeAction";
							 | 
						||
| 
								 | 
							
								import {Tag} from "../../Tags/Tag";
							 | 
						||
| 
								 | 
							
								import {Changes} from "../Changes";
							 | 
						||
| 
								 | 
							
								import {ChangeDescription} from "./ChangeDescription";
							 | 
						||
| 
								 | 
							
								import FeaturePipelineState from "../../State/FeaturePipelineState";
							 | 
						||
| 
								 | 
							
								import FeatureSource from "../../FeatureSource/FeatureSource";
							 | 
						||
| 
								 | 
							
								import CreateNewWayAction from "./CreateNewWayAction";
							 | 
						||
| 
								 | 
							
								import CreateWayWithPointReuseAction, {MergePointConfig} from "./CreateWayWithPointReuseAction";
							 | 
						||
| 
								 | 
							
								import {And} from "../../Tags/And";
							 | 
						||
| 
								 | 
							
								import {TagUtils} from "../../Tags/TagUtils";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAction {
							 | 
						||
| 
								 | 
							
								    private readonly _tags: Tag[];
							 | 
						||
| 
								 | 
							
								    public newElementId: string = undefined;
							 | 
						||
| 
								 | 
							
								    public newElementIdNumber: number  = undefined;
							 | 
						||
| 
								 | 
							
								    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: [number, number][],
							 | 
						||
| 
								 | 
							
								                innerRingsCoordinates:  [number, number][][],
							 | 
						||
| 
								 | 
							
								                state: FeaturePipelineState,
							 | 
						||
| 
								 | 
							
								                config: MergePointConfig[],
							 | 
						||
| 
								 | 
							
								                changeType: "import" | "create" | string
							 | 
						||
| 
								 | 
							
								    ) {
							 | 
						||
| 
								 | 
							
								        super(null,true);
							 | 
						||
| 
								 | 
							
								        this._tags = [...tags, new Tag("type","multipolygon")];
							 | 
						||
| 
								 | 
							
								        this.changeType = changeType;
							 | 
						||
| 
								 | 
							
								        this.theme = state.layoutToUse.id
							 | 
						||
| 
								 | 
							
								        this. createOuterWay = new CreateWayWithPointReuseAction([], outerRingCoordinates, state, config)
							 | 
						||
| 
								 | 
							
								        this. createInnerWays = innerRingsCoordinates.map(ringCoordinates => 
							 | 
						||
| 
								 | 
							
								            new CreateNewWayAction([], 
							 | 
						||
| 
								 | 
							
								            ringCoordinates.map(([lon, lat] )=> ({lat, lon})), 
							 | 
						||
| 
								 | 
							
								            {theme: state.layoutToUse.id}))
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        this.geojsonPreview =  {
							 | 
						||
| 
								 | 
							
								            type: "Feature",
							 | 
						||
| 
								 | 
							
								            properties: TagUtils.changeAsProperties(new And(this._tags).asChange({})),
							 | 
						||
| 
								 | 
							
								            geometry:{
							 | 
						||
| 
								 | 
							
								                type: "Polygon",
							 | 
						||
| 
								 | 
							
								                coordinates: [
							 | 
						||
| 
								 | 
							
								                    outerRingCoordinates,
							 | 
						||
| 
								 | 
							
								                    ...innerRingsCoordinates
							 | 
						||
| 
								 | 
							
								                ]
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public async getPreview(): Promise<FeatureSource> {
							 | 
						||
| 
								 | 
							
								        const outerPreview = await this.createOuterWay.getPreview()
							 | 
						||
| 
								 | 
							
								        outerPreview.features.data.push({
							 | 
						||
| 
								 | 
							
								            freshness: new Date(),
							 | 
						||
| 
								 | 
							
								            feature: this.geojsonPreview
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								       return outerPreview
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> {
							 | 
						||
| 
								 | 
							
								        console.log("Running CMPWPRA")
							 | 
						||
| 
								 | 
							
								        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
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |