forked from MapComplete/MapComplete
Rewrite left-right tags when updating them on click
This commit is contained in:
parent
45e8ee310b
commit
40c4ae769d
2 changed files with 95 additions and 73 deletions
|
@ -6,6 +6,8 @@ import {ElementStorage} from "../ElementStorage";
|
||||||
import {Changes} from "../Osm/Changes";
|
import {Changes} from "../Osm/Changes";
|
||||||
import {OsmObject} from "../Osm/OsmObject";
|
import {OsmObject} from "../Osm/OsmObject";
|
||||||
import {OsmConnection} from "../Osm/OsmConnection";
|
import {OsmConnection} from "../Osm/OsmConnection";
|
||||||
|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||||
|
import SimpleMetaTagger from "../SimpleMetaTagger";
|
||||||
|
|
||||||
export default class SelectedElementTagsUpdater {
|
export default class SelectedElementTagsUpdater {
|
||||||
|
|
||||||
|
@ -20,7 +22,8 @@ export default class SelectedElementTagsUpdater {
|
||||||
selectedElement: UIEventSource<any>,
|
selectedElement: UIEventSource<any>,
|
||||||
allElements: ElementStorage,
|
allElements: ElementStorage,
|
||||||
changes: Changes,
|
changes: Changes,
|
||||||
osmConnection: OsmConnection
|
osmConnection: OsmConnection,
|
||||||
|
layoutToUse: LayoutConfig
|
||||||
}) {
|
}) {
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,7 +40,8 @@ export default class SelectedElementTagsUpdater {
|
||||||
selectedElement: UIEventSource<any>,
|
selectedElement: UIEventSource<any>,
|
||||||
allElements: ElementStorage,
|
allElements: ElementStorage,
|
||||||
changes: Changes,
|
changes: Changes,
|
||||||
osmConnection: OsmConnection
|
osmConnection: OsmConnection,
|
||||||
|
layoutToUse: LayoutConfig
|
||||||
}) {
|
}) {
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,11 +74,18 @@ export default class SelectedElementTagsUpdater {
|
||||||
selectedElement: UIEventSource<any>,
|
selectedElement: UIEventSource<any>,
|
||||||
allElements: ElementStorage,
|
allElements: ElementStorage,
|
||||||
changes: Changes,
|
changes: Changes,
|
||||||
osmConnection: OsmConnection
|
osmConnection: OsmConnection,
|
||||||
|
layoutToUse: LayoutConfig
|
||||||
}, latestTags: any, id: string
|
}, latestTags: any, id: string
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
const leftRightSensitive = state.layoutToUse.layers.some(layer => layer.lineRendering.some(lr => lr.leftRightSensitive))
|
||||||
|
|
||||||
|
if (leftRightSensitive) {
|
||||||
|
SimpleMetaTagger.removeBothTagging(latestTags)
|
||||||
|
}
|
||||||
|
|
||||||
const pendingChanges = state.changes.pendingChanges.data
|
const pendingChanges = state.changes.pendingChanges.data
|
||||||
.filter(change => change.type + "/" + change.id === id)
|
.filter(change => change.type + "/" + change.id === id)
|
||||||
.filter(change => change.tags !== undefined);
|
.filter(change => change.tags !== undefined);
|
||||||
|
@ -92,6 +103,7 @@ export default class SelectedElementTagsUpdater {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// With the changes applied, we merge them onto the upstream object
|
// With the changes applied, we merge them onto the upstream object
|
||||||
let somethingChanged = false;
|
let somethingChanged = false;
|
||||||
const currentTagsSource = state.allElements.getEventSourceById(id);
|
const currentTagsSource = state.allElements.getEventSourceById(id);
|
||||||
|
|
|
@ -78,35 +78,29 @@ export default class SimpleMetaTagger {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
private static noBothButLeftRight = new SimpleMetaTagger(
|
|
||||||
{
|
|
||||||
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
|
|
||||||
doc: "Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined",
|
|
||||||
includesDates: false,
|
|
||||||
cleanupRetagger: true
|
|
||||||
},
|
|
||||||
((feature, state, layer) => {
|
|
||||||
|
|
||||||
if(!layer.lineRendering.some(lr => lr.leftRightSensitive)){
|
/**
|
||||||
return;
|
* Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme.
|
||||||
}
|
* These changes are performed in-place.
|
||||||
|
*
|
||||||
const tgs = feature.properties;
|
* Returns 'true' is at least one change has been made
|
||||||
|
* @param tags
|
||||||
|
*/
|
||||||
|
public static removeBothTagging(tags: any): boolean{
|
||||||
let somethingChanged = false
|
let somethingChanged = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
||||||
*/
|
*/
|
||||||
function set(k, value) {
|
function set(k, value) {
|
||||||
if (tgs[k] === undefined || tgs[k] === "") {
|
if (tags[k] === undefined || tags[k] === "") {
|
||||||
tgs[k] = value
|
tags[k] = value
|
||||||
somethingChanged = true
|
somethingChanged = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tgs["sidewalk"]) {
|
if (tags["sidewalk"]) {
|
||||||
|
|
||||||
const v = tgs["sidewalk"]
|
const v = tags["sidewalk"]
|
||||||
switch (v) {
|
switch (v) {
|
||||||
case "none":
|
case "none":
|
||||||
case "no":
|
case "no":
|
||||||
|
@ -130,19 +124,19 @@ export default class SimpleMetaTagger {
|
||||||
set("sidewalk:right", v);
|
set("sidewalk:right", v);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
delete tgs["sidewalk"]
|
delete tags["sidewalk"]
|
||||||
somethingChanged = true
|
somethingChanged = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const regex = /\([^:]*\):both:\(.*\)/
|
const regex = /\([^:]*\):both:\(.*\)/
|
||||||
for (const key in tgs) {
|
for (const key in tags) {
|
||||||
const v = tgs[key]
|
const v = tags[key]
|
||||||
if (key.endsWith(":both")) {
|
if (key.endsWith(":both")) {
|
||||||
const strippedKey = key.substring(0, key.length - ":both".length)
|
const strippedKey = key.substring(0, key.length - ":both".length)
|
||||||
set(strippedKey + ":left", v)
|
set(strippedKey + ":left", v)
|
||||||
set(strippedKey + ":right", v)
|
set(strippedKey + ":right", v)
|
||||||
delete tgs[key]
|
delete tags[key]
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,12 +147,28 @@ export default class SimpleMetaTagger {
|
||||||
set(strippedKey + ":left:" + property, v)
|
set(strippedKey + ":left:" + property, v)
|
||||||
set(strippedKey + ":right:" + property, v)
|
set(strippedKey + ":right:" + property, v)
|
||||||
console.log("Left-right rewritten " + key)
|
console.log("Left-right rewritten " + key)
|
||||||
delete tgs[key]
|
delete tags[key]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return somethingChanged
|
return somethingChanged
|
||||||
|
}
|
||||||
|
|
||||||
|
private static noBothButLeftRight = new SimpleMetaTagger(
|
||||||
|
{
|
||||||
|
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
|
||||||
|
doc: "Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined",
|
||||||
|
includesDates: false,
|
||||||
|
cleanupRetagger: true
|
||||||
|
},
|
||||||
|
((feature, state, layer) => {
|
||||||
|
|
||||||
|
if(!layer.lineRendering.some(lr => lr.leftRightSensitive)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SimpleMetaTagger.removeBothTagging(feature.properties)
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
private static surfaceArea = new SimpleMetaTagger(
|
private static surfaceArea = new SimpleMetaTagger(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue