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 {
|
||||||
|
|
||||||
|
@ -14,13 +16,14 @@ export default class SelectedElementTagsUpdater {
|
||||||
"changeset",
|
"changeset",
|
||||||
"user",
|
"user",
|
||||||
"uid",
|
"uid",
|
||||||
"id"] )
|
"id"])
|
||||||
|
|
||||||
constructor(state: {
|
constructor(state: {
|
||||||
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);
|
||||||
|
@ -115,7 +127,7 @@ export default class SelectedElementTagsUpdater {
|
||||||
if (currentKey.startsWith("_")) {
|
if (currentKey.startsWith("_")) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if(this.metatags.has(currentKey)){
|
if (this.metatags.has(currentKey)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (currentKey in latestTags) {
|
if (currentKey in latestTags) {
|
||||||
|
|
|
@ -78,6 +78,83 @@ export default class SimpleMetaTagger {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme.
|
||||||
|
* These changes are performed in-place.
|
||||||
|
*
|
||||||
|
* Returns 'true' is at least one change has been made
|
||||||
|
* @param tags
|
||||||
|
*/
|
||||||
|
public static removeBothTagging(tags: any): boolean{
|
||||||
|
let somethingChanged = false
|
||||||
|
/**
|
||||||
|
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
||||||
|
*/
|
||||||
|
function set(k, value) {
|
||||||
|
if (tags[k] === undefined || tags[k] === "") {
|
||||||
|
tags[k] = value
|
||||||
|
somethingChanged = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tags["sidewalk"]) {
|
||||||
|
|
||||||
|
const v = tags["sidewalk"]
|
||||||
|
switch (v) {
|
||||||
|
case "none":
|
||||||
|
case "no":
|
||||||
|
set("sidewalk:left", "no");
|
||||||
|
set("sidewalk:right", "no");
|
||||||
|
break
|
||||||
|
case "both":
|
||||||
|
set("sidewalk:left", "yes");
|
||||||
|
set("sidewalk:right", "yes");
|
||||||
|
break;
|
||||||
|
case "left":
|
||||||
|
set("sidewalk:left", "yes");
|
||||||
|
set("sidewalk:right", "no");
|
||||||
|
break;
|
||||||
|
case "right":
|
||||||
|
set("sidewalk:left", "no");
|
||||||
|
set("sidewalk:right", "yes");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
set("sidewalk:left", v);
|
||||||
|
set("sidewalk:right", v);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
delete tags["sidewalk"]
|
||||||
|
somethingChanged = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const regex = /\([^:]*\):both:\(.*\)/
|
||||||
|
for (const key in tags) {
|
||||||
|
const v = tags[key]
|
||||||
|
if (key.endsWith(":both")) {
|
||||||
|
const strippedKey = key.substring(0, key.length - ":both".length)
|
||||||
|
set(strippedKey + ":left", v)
|
||||||
|
set(strippedKey + ":right", v)
|
||||||
|
delete tags[key]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const match = key.match(regex)
|
||||||
|
if (match !== null) {
|
||||||
|
const strippedKey = match[1]
|
||||||
|
const property = match[1]
|
||||||
|
set(strippedKey + ":left:" + property, v)
|
||||||
|
set(strippedKey + ":right:" + property, v)
|
||||||
|
console.log("Left-right rewritten " + key)
|
||||||
|
delete tags[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return somethingChanged
|
||||||
|
}
|
||||||
|
|
||||||
private static noBothButLeftRight = new SimpleMetaTagger(
|
private static noBothButLeftRight = new SimpleMetaTagger(
|
||||||
{
|
{
|
||||||
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
|
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
|
||||||
|
@ -91,74 +168,7 @@ export default class SimpleMetaTagger {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tgs = feature.properties;
|
return SimpleMetaTagger.removeBothTagging(feature.properties)
|
||||||
let somethingChanged = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
|
||||||
*/
|
|
||||||
function set(k, value) {
|
|
||||||
if (tgs[k] === undefined || tgs[k] === "") {
|
|
||||||
tgs[k] = value
|
|
||||||
somethingChanged = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tgs["sidewalk"]) {
|
|
||||||
|
|
||||||
const v = tgs["sidewalk"]
|
|
||||||
switch (v) {
|
|
||||||
case "none":
|
|
||||||
case "no":
|
|
||||||
set("sidewalk:left", "no");
|
|
||||||
set("sidewalk:right", "no");
|
|
||||||
break
|
|
||||||
case "both":
|
|
||||||
set("sidewalk:left", "yes");
|
|
||||||
set("sidewalk:right", "yes");
|
|
||||||
break;
|
|
||||||
case "left":
|
|
||||||
set("sidewalk:left", "yes");
|
|
||||||
set("sidewalk:right", "no");
|
|
||||||
break;
|
|
||||||
case "right":
|
|
||||||
set("sidewalk:left", "no");
|
|
||||||
set("sidewalk:right", "yes");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
set("sidewalk:left", v);
|
|
||||||
set("sidewalk:right", v);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delete tgs["sidewalk"]
|
|
||||||
somethingChanged = true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const regex = /\([^:]*\):both:\(.*\)/
|
|
||||||
for (const key in tgs) {
|
|
||||||
const v = tgs[key]
|
|
||||||
if (key.endsWith(":both")) {
|
|
||||||
const strippedKey = key.substring(0, key.length - ":both".length)
|
|
||||||
set(strippedKey + ":left", v)
|
|
||||||
set(strippedKey + ":right", v)
|
|
||||||
delete tgs[key]
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
const match = key.match(regex)
|
|
||||||
if (match !== null) {
|
|
||||||
const strippedKey = match[1]
|
|
||||||
const property = match[1]
|
|
||||||
set(strippedKey + ":left:" + property, v)
|
|
||||||
set(strippedKey + ":right:" + property, v)
|
|
||||||
console.log("Left-right rewritten " + key)
|
|
||||||
delete tgs[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return somethingChanged
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
private static surfaceArea = new SimpleMetaTagger(
|
private static surfaceArea = new SimpleMetaTagger(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue