2023-05-30 02:52:22 +02:00
import { SpecialVisualization , SpecialVisualizationState } from "../../SpecialVisualization" ;
import { AutoAction } from "../AutoApplyButton" ;
import { Feature , LineString , Polygon } from "geojson" ;
import { UIEventSource } from "../../../Logic/UIEventSource" ;
import BaseUIElement from "../../BaseUIElement" ;
import { ImportFlowUtils } from "./ImportFlow" ;
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" ;
import SvelteUIElement from "../../Base/SvelteUIElement" ;
import { FixedUiElement } from "../../Base/FixedUiElement" ;
import WayImportFlow from "./WayImportFlow.svelte" ;
import WayImportFlowState , { WayImportFlowArguments } from "./WayImportFlowState" ;
import { Utils } from "../../../Utils" ;
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig" ;
import { Changes } from "../../../Logic/Osm/Changes" ;
import { IndexedFeatureSource } from "../../../Logic/FeatureSource/FeatureSource" ;
import FullNodeDatabaseSource from "../../../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" ;
/ * *
* Wrapper around 'WayImportFlow' to make it a special visualisation
* /
export default class WayImportButtonViz implements AutoAction , SpecialVisualization {
2023-06-01 02:52:21 +02:00
public readonly funcName : string = "import_way_button"
public readonly docs : string = "This button will copy the data from an external dataset into OpenStreetMap, copying the geometry and adding it as a 'line'" + ImportFlowUtils . documentationGeneral
public readonly args : { name : string ; defaultValue? : string ; doc : string } [ ] = [
. . . ImportFlowUtils . generalArguments ,
{
name : "snap_to_point_if" ,
doc : "Points with the given tags will be snapped to or moved" ,
} ,
{
name : "max_snap_distance" ,
doc : "If the imported object is a LineString or (Multi)Polygon, already existing OSM-points will be reused to construct the geometry of the newly imported way" ,
defaultValue : "0.05" ,
} ,
{
name : "move_osm_point_if" ,
doc : "Moves the OSM-point to the newly imported point if these conditions are met" ,
} ,
{
name : "max_move_distance" ,
doc : "If an OSM-point is moved, the maximum amount of meters it is moved. Capped on 20m" ,
defaultValue : "0.05" ,
} ,
{
name : "snap_onto_layers" ,
doc : "If no existing nearby point exists, but a line of a specified layer is closeby, snap to this layer instead" ,
} ,
{
name : "snap_to_layer_max_distance" ,
doc : "Distance to distort the geometry to snap to this layer" ,
defaultValue : "0.1" ,
} ,
]
2023-05-30 02:52:22 +02:00
public readonly supportsAutoAction = true
public readonly needsNodeDatabase = true
2023-06-02 08:42:08 +02:00
constr ( state : SpecialVisualizationState , tagSource : UIEventSource < Record < string , string > > , argument : string [ ] , feature : Feature , _ : LayerConfig ) : BaseUIElement {
2023-05-30 02:52:22 +02:00
const geometry = feature . geometry
if ( ! ( geometry . type == "LineString" || geometry . type === "Polygon" ) ) {
console . error ( "Invalid type to import" , geometry . type )
return new FixedUiElement ( "Invalid geometry type:" + geometry . type ) . SetClass ( "alert" )
}
const args : WayImportFlowArguments = < any > Utils . ParseVisArgs ( this . args , argument )
const tagsToApply = ImportFlowUtils . getTagsToApply ( tagSource , args )
const importFlow = new WayImportFlowState ( state , < Feature < LineString | Polygon > > feature , args , tagsToApply , tagSource )
return new SvelteUIElement ( WayImportFlow , {
importFlow
} )
}
public async applyActionOn ( feature : Feature , state : {
layout : LayoutConfig ;
changes : Changes ;
indexedFeatures : IndexedFeatureSource ,
fullNodeDatabase : FullNodeDatabaseSource
} , tagSource : UIEventSource < any > , argument : string [ ] ) : Promise < void > {
{
// Small safety check to prevent duplicate imports
const id = tagSource . data . id
if ( ImportFlowUtils . importedIds . has ( id ) ) {
return
}
ImportFlowUtils . importedIds . add ( id )
}
if ( feature . geometry . type !== "LineString" && feature . geometry . type !== "Polygon" ) {
return
}
const args : WayImportFlowArguments = < any > Utils . ParseVisArgs ( this . args , argument )
const tagsToApply = ImportFlowUtils . getTagsToApply ( tagSource , args )
2023-06-01 02:52:21 +02:00
const mergeConfigs = WayImportFlowState . GetMergeConfig ( args )
2023-05-30 02:52:22 +02:00
const action = WayImportFlowState . CreateAction ( < Feature < LineString | Polygon > > feature , args , state , tagsToApply , mergeConfigs )
2023-06-01 02:52:21 +02:00
tagSource . data [ "_imported" ] = "yes"
tagSource . ping ( )
2023-05-30 02:52:22 +02:00
await state . changes . applyAction ( action )
}
getLayerDependencies ( args : string [ ] ) {
return ImportFlowUtils . getLayerDependenciesWithSnapOnto ( this . args , args )
}
}