Merge branch 'master' of github.com:pietervdvn/MapComplete

This commit is contained in:
pietervdvn 2021-10-27 01:26:38 +02:00
commit ba26bf3e63
6 changed files with 2305 additions and 2340 deletions

View file

@ -83,6 +83,7 @@ export interface TagRenderingConfigJson {
* Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes
*/ */
mappings?: { mappings?: {
/** /**
* If this condition is met, then the text under `then` will be shown. * If this condition is met, then the text under `then` will be shown.
* If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.
@ -168,6 +169,13 @@ export interface TagRenderingConfigJson {
*/ */
ifnot?: AndOrTagConfigJson | string ifnot?: AndOrTagConfigJson | string
/**
* If chosen as answer, these tags will be applied as well onto the object.
* Not compatible with multiAnswer
*/
addExtraTags: string[]
}[] }[]
/** /**

View file

@ -6,6 +6,7 @@ import {TagUtils} from "../../Logic/Tags/TagUtils";
import {And} from "../../Logic/Tags/And"; import {And} from "../../Logic/Tags/And";
import ValidatedTextField from "../../UI/Input/ValidatedTextField"; import ValidatedTextField from "../../UI/Input/ValidatedTextField";
import {Utils} from "../../Utils"; import {Utils} from "../../Utils";
import {Tag} from "../../Logic/Tags/Tag";
/*** /***
* The parsed version of TagRenderingConfigJSON * The parsed version of TagRenderingConfigJSON
@ -36,6 +37,7 @@ export default class TagRenderingConfig {
readonly ifnot?: TagsFilter, readonly ifnot?: TagsFilter,
readonly then: Translation readonly then: Translation
readonly hideInAnswer: boolean | TagsFilter readonly hideInAnswer: boolean | TagsFilter
readonly addExtraTags: Tag[]
}[] }[]
readonly roaming: boolean; readonly roaming: boolean;
@ -119,21 +121,24 @@ export default class TagRenderingConfig {
this.mappings = json.mappings.map((mapping, i) => { this.mappings = json.mappings.map((mapping, i) => {
const ctx = `${context}.mapping[${i}]`
if (mapping.then === undefined) { if (mapping.then === undefined) {
throw `${context}.mapping[${i}]: Invalid mapping: if without body` throw `${ctx}: Invalid mapping: if without body`
} }
if (mapping.ifnot !== undefined && !this.multiAnswer) { if (mapping.ifnot !== undefined && !this.multiAnswer) {
throw `${context}.mapping[${i}]: Invalid mapping: ifnot defined, but the tagrendering is not a multianswer` throw `${ctx}: Invalid mapping: ifnot defined, but the tagrendering is not a multianswer`
} }
if (mapping.if === undefined) { if (mapping.if === undefined) {
throw `${context}.mapping[${i}]: Invalid mapping: "if" is not defined, but the tagrendering is not a multianswer` throw `${ctx}: Invalid mapping: "if" is not defined, but the tagrendering is not a multianswer`
} }
if (typeof mapping.if !== "string" && mapping.if["length"] !== undefined) { if (typeof mapping.if !== "string" && mapping.if["length"] !== undefined) {
throw `${context}.mapping[${i}]: Invalid mapping: "if" is defined as an array. Use {"and": <your conditions>} or {"or": <your conditions>} instead` throw `${ctx}: Invalid mapping: "if" is defined as an array. Use {"and": <your conditions>} or {"or": <your conditions>} instead`
} }
if(mapping.addExtraTags !== undefined && this.multiAnswer){
throw `${ctx}: Invalid mapping: got a multi-Answer with addExtraTags; this is not allowed`
}
let hideInAnswer: boolean | TagsFilter = false; let hideInAnswer: boolean | TagsFilter = false;
if (typeof mapping.hideInAnswer === "boolean") { if (typeof mapping.hideInAnswer === "boolean") {
@ -141,12 +146,12 @@ export default class TagRenderingConfig {
} else if (mapping.hideInAnswer !== undefined) { } else if (mapping.hideInAnswer !== undefined) {
hideInAnswer = TagUtils.Tag(mapping.hideInAnswer, `${context}.mapping[${i}].hideInAnswer`); hideInAnswer = TagUtils.Tag(mapping.hideInAnswer, `${context}.mapping[${i}].hideInAnswer`);
} }
const mappingContext = `${context}.mapping[${i}]`
const mp = { const mp = {
if: TagUtils.Tag(mapping.if, `${mappingContext}.if`), if: TagUtils.Tag(mapping.if, `${ctx}.if`),
ifnot: (mapping.ifnot !== undefined ? TagUtils.Tag(mapping.ifnot, `${mappingContext}.ifnot`) : undefined), ifnot: (mapping.ifnot !== undefined ? TagUtils.Tag(mapping.ifnot, `${ctx}.ifnot`) : undefined),
then: Translations.T(mapping.then, `{mappingContext}.then`), then: Translations.T(mapping.then, `{mappingContext}.then`),
hideInAnswer: hideInAnswer hideInAnswer: hideInAnswer,
addExtraTags: (mapping.addExtraTags??[]).map((str, j) => TagUtils.SimpleTag(str, `${ctx}.addExtraTags[${j}]`))
}; };
if (this.question) { if (this.question) {
if (hideInAnswer !== true && mp.if !== undefined && !mp.if.isUsableAsAnswer()) { if (hideInAnswer !== true && mp.if !== undefined && !mp.if.isUsableAsAnswer()) {

View file

@ -49,7 +49,7 @@ export default class TagRenderingQuestion extends Combine {
const applicableMappingsSrc = const applicableMappingsSrc =
UIEventSource.ListStabilized(tags.map(tags => { UIEventSource.ListStabilized(tags.map(tags => {
const applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter }[] = [] const applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter, addExtraTags: Tag[] }[] = []
for (const mapping of configuration.mappings ?? []) { for (const mapping of configuration.mappings ?? []) {
if (mapping.hideInAnswer === true) { if (mapping.hideInAnswer === true) {
continue continue
@ -108,7 +108,7 @@ export default class TagRenderingQuestion extends Combine {
const saveButton = new Combine([ const saveButton = new Combine([
options.saveButtonConstr(inputElement.GetValue()), options.saveButtonConstr(inputElement.GetValue()),
new Toggle(Translations.t.general.testing, undefined, State.state.featureSwitchIsTesting).SetClass("alert") new Toggle(Translations.t.general.testing.SetClass("alert"), undefined, State.state.featureSwitchIsTesting)
]) ])
let bottomTags: BaseUIElement; let bottomTags: BaseUIElement;
@ -147,7 +147,7 @@ export default class TagRenderingQuestion extends Combine {
private static GenerateInputElement(configuration: TagRenderingConfig, private static GenerateInputElement(configuration: TagRenderingConfig,
applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter }[], applicableMappings: { if: TagsFilter, then: any, ifnot?: TagsFilter, addExtraTags: Tag[] }[],
applicableUnit: Unit, applicableUnit: Unit,
tagsSource: UIEventSource<any>) tagsSource: UIEventSource<any>)
: InputElement<TagsFilter> { : InputElement<TagsFilter> {
@ -341,12 +341,16 @@ export default class TagRenderingQuestion extends Combine {
mapping: { mapping: {
if: TagsFilter, if: TagsFilter,
then: Translation, then: Translation,
addExtraTags: Tag[]
}, ifNot?: TagsFilter[]): InputElement<TagsFilter> { }, ifNot?: TagsFilter[]): InputElement<TagsFilter> {
let tagging: TagsFilter = mapping.if; let tagging: TagsFilter = mapping.if;
if (ifNot !== undefined) { if (ifNot !== undefined) {
tagging = new And([mapping.if, ...ifNot]) tagging = new And([mapping.if, ...ifNot])
} }
if (mapping.addExtraTags) {
tagging = new And([tagging, ...mapping.addExtraTags])
}
return new FixedInputElement( return new FixedInputElement(
new SubstitutedTranslation(mapping.then, tagsSource), new SubstitutedTranslation(mapping.then, tagsSource),

View file

@ -2,13 +2,7 @@
"id": "charging_station", "id": "charging_station",
"name": { "name": {
"en": "Charging stations", "en": "Charging stations",
"nl": "Oplaadpunten", "nl": "Oplaadpunten"
"de": "Ladestationen",
"it": "Stazioni di ricarica",
"ja": "充電ステーション",
"nb_NO": "Ladestasjoner",
"ru": "Зарядные станции",
"zh_Hant": "充電站"
}, },
"minzoom": 10, "minzoom": 10,
"source": { "source": {
@ -24,24 +18,12 @@
"title": { "title": {
"render": { "render": {
"en": "Charging station", "en": "Charging station",
"nl": "Oplaadpunten", "nl": "Oplaadpunten"
"de": "Ladestation",
"it": "Stazione di ricarica",
"ja": "充電ステーション",
"nb_NO": "Ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站"
} }
}, },
"description": { "description": {
"en": "A charging station", "en": "A charging station",
"nl": "Oplaadpunten", "nl": "Oplaadpunten"
"de": "Eine Ladestation",
"it": "Una stazione di ricarica",
"ja": "充電ステーション",
"nb_NO": "En ladestasjon",
"ru": "Зарядная станция",
"zh_Hant": "充電站"
}, },
"tagRenderings": [ "tagRenderings": [
"images", "images",
@ -50,8 +32,7 @@
"#": "Allowed vehicle types", "#": "Allowed vehicle types",
"question": { "question": {
"en": "Which vehicles are allowed to charge here?", "en": "Which vehicles are allowed to charge here?",
"nl": "Welke voertuigen kunnen hier opgeladen worden?", "nl": "Welke voertuigen kunnen hier opgeladen worden?"
"de": "Welche Fahrzeuge dürfen hier geladen werden?"
}, },
"multiAnswer": true, "multiAnswer": true,
"mappings": [ "mappings": [
@ -59,9 +40,8 @@
"if": "bicycle=yes", "if": "bicycle=yes",
"ifnot": "bicycle=no", "ifnot": "bicycle=no",
"then": { "then": {
"en": "<b>bicycles</b> can be charged here", "en": "<b>Bcycles</b> can be charged here",
"nl": "<b>Fietsen</b> kunnen hier opgeladen worden", "nl": "<b>Fietsen</b> kunnen hier opgeladen worden"
"de": "<b>Fahrräder</b> können hier geladen werden"
} }
}, },
{ {
@ -69,8 +49,7 @@
"ifnot": "motorcar=no", "ifnot": "motorcar=no",
"then": { "then": {
"en": "<b>Cars</b> can be charged here", "en": "<b>Cars</b> can be charged here",
"nl": "<b>Elektrische auto's</b> kunnen hier opgeladen worden", "nl": "<b>Elektrische auto's</b> kunnen hier opgeladen worden"
"de": "<b>Autos</b> können hier geladen werden"
} }
}, },
{ {
@ -78,8 +57,7 @@
"ifnot": "scooter=no", "ifnot": "scooter=no",
"then": { "then": {
"en": "<b>Scooters</b> can be charged here", "en": "<b>Scooters</b> can be charged here",
"nl": "<b>Electrische scooters</b> (snorfiets of bromfiets) kunnen hier opgeladen worden", "nl": "<b>Electrische scooters</b> (snorfiets of bromfiets) kunnen hier opgeladen worden"
"de": "<b> Roller</b> können hier geladen werden"
} }
}, },
{ {
@ -87,8 +65,7 @@
"ifnot": "hgv=no", "ifnot": "hgv=no",
"then": { "then": {
"en": "<b>Heavy good vehicles</b> (such as trucks) can be charged here", "en": "<b>Heavy good vehicles</b> (such as trucks) can be charged here",
"nl": "<b>Vrachtwagens</b> kunnen hier opgeladen worden", "nl": "<b>Vrachtwagens</b> kunnen hier opgeladen worden"
"de": "<b>Lastkraftwagen</b> (LKW) können hier geladen werden"
} }
}, },
{ {
@ -96,8 +73,7 @@
"ifnot": "bus=no", "ifnot": "bus=no",
"then": { "then": {
"en": "<b>Buses</b> can be charged here", "en": "<b>Buses</b> can be charged here",
"nl": "<b>Bussen</b> kunnen hier opgeladen worden", "nl": "<b>Bussen</b> kunnen hier opgeladen worden"
"de": "<b>Busse</b> können hier geladen werden"
} }
} }
] ]
@ -106,13 +82,11 @@
"id": "access", "id": "access",
"question": { "question": {
"en": "Who is allowed to use this charging station?", "en": "Who is allowed to use this charging station?",
"nl": "Wie mag er dit oplaadpunt gebruiken?", "nl": "Wie mag er dit oplaadpunt gebruiken?"
"de": "Wer darf diese Ladestation benutzen?"
}, },
"render": { "render": {
"en": "Access is {access}", "en": "Access is {access}",
"nl": "Toegang voor {access}", "nl": "Toegang voor {access}"
"de": "Zugang ist {access}"
}, },
"freeform": { "freeform": {
"key": "access", "key": "access",
@ -145,14 +119,14 @@
"if": "access=customers", "if": "access=customers",
"then": { "then": {
"en": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span>", "en": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span>",
"nl": "Enkel <b>klanten van de bijhorende plaats</b> mogen dit oplaadpunt gebruiken<br/><span class='subtle'>Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden</span>" "nl": "Enkel <b>klanten van de bijhorende plaats</b> mogen dit oplaadpunt gebruiken<br/><span class='subtle'>Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel</span>"
} }
}, },
{ {
"if": "access=private", "if": "access=private",
"then": { "then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)", "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
"nl": "Niet toegankelijk voor het publiek <span class='subtle'>Enkel toegankelijk voor de eigenaar, medewerkers ,...</span> " "nl": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers ,...</span> "
} }
} }
] ]
@ -161,13 +135,11 @@
"id": "capacity", "id": "capacity",
"render": { "render": {
"en": "{capacity} vehicles can be charged here at the same time", "en": "{capacity} vehicles can be charged here at the same time",
"nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden", "nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden"
"de": "{capacity} Fahrzeuge können hier gleichzeitig geladen werden"
}, },
"question": { "question": {
"en": "How much vehicles can be charged here at the same time?", "en": "How much vehicles can be charged here at the same time?",
"nl": "Hoeveel voertuigen kunnen hier opgeladen worden?", "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?"
"de": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?"
}, },
"freeform": { "freeform": {
"key": "capacity", "key": "capacity",
@ -177,9 +149,8 @@
{ {
"id": "Available_charging_stations (generated)", "id": "Available_charging_stations (generated)",
"question": { "question": {
"en": "Which charging stations are available here?", "en": "Which charging connections are available here?",
"nl": "Welke aansluitingen zijn hier beschikbaar?", "nl": "Welke aansluitingen zijn hier beschikbaar?"
"de": "Welche Ladestationen gibt es hier?"
}, },
"multiAnswer": true, "multiAnswer": true,
"mappings": [ "mappings": [
@ -280,8 +251,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Chademo_type4.svg'/> <span><b>Chademo</b></span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Chademo_type4.svg'/> <span><b>Chademo</b></span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Chademo_type4.svg'/> <span><b>Chademo</b></span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Chademo_type4.svg'/> <span><b>Chademo</b></span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Chademo_type4.svg'/> <span><b>Chademo</b></span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -290,8 +260,7 @@
"ifnot": "socket:type1_cable=", "ifnot": "socket:type1_cable=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 with cable</b> (J1772)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 with cable</b> (J1772)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 met kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 met kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Typ 1 mit Kabel</b> (J1772)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -329,8 +298,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 with cable</b> (J1772)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 with cable</b> (J1772)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 met kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 met kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Typ 1 mit Kabel</b> (J1772)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -339,8 +307,7 @@
"ifnot": "socket:type1=", "ifnot": "socket:type1=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>without</i> cable</b> (J1772)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>without</i> cable</b> (J1772)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>zonder</i> kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>zonder</i> kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Typ 1 <i>ohne</i> Kabel</b> (J1772)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -378,8 +345,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>without</i> cable</b> (J1772)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>without</i> cable</b> (J1772)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>zonder</i> kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Type 1 <i>zonder</i> kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1_J1772.svg'/> <span><b>Typ 1 <i>ohne</i> Kabel</b> (J1772)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -388,8 +354,7 @@
"ifnot": "socket:type1_combo=", "ifnot": "socket:type1_combo=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (aka Type 1 Combo)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (aka Type 1 Combo)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (ook gekend als Type 1 Combo)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (ook gekend als Type 1 Combo)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Typ 1 CCS</b> (auch bekannt als Typ 1 Combo)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -427,8 +392,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (aka Type 1 Combo)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (aka Type 1 Combo)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (ook gekend als Type 1 Combo)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Type 1 CCS</b> (ook gekend als Type 1 Combo)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type1-ccs.svg'/> <span><b>Typ 1 CCS</b> (auch bekannt als Typ 1 Combo)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -437,8 +401,7 @@
"ifnot": "socket:tesla_supercharger=", "ifnot": "socket:tesla_supercharger=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -476,8 +439,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <span><b>Tesla Supercharger</b></span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -486,8 +448,7 @@
"ifnot": "socket:type2=", "ifnot": "socket:type2=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Typ 2</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -525,8 +486,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Type 2</b> (mennekes)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_socket.svg'/> <span><b>Typ 2</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -535,8 +495,7 @@
"ifnot": "socket:type2_combo=", "ifnot": "socket:type2_combo=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Typ 2 CCS</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -574,8 +533,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Type 2 CCS</b> (mennekes)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Typ 2 CCS</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -584,8 +542,7 @@
"ifnot": "socket:type2_cable=", "ifnot": "socket:type2_cable=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 with cable</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 with cable</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 met kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 met kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Typ 2 mit Kabel</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -623,8 +580,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 with cable</b> (mennekes)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 with cable</b> (mennekes)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 met kabel</b> (J1772)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Type 2 met kabel</b> (J1772)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_tethered.svg'/> <span><b>Typ 2 mit Kabel</b> (Mennekes)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -633,8 +589,7 @@
"ifnot": "socket:tesla_supercharger_ccs=", "ifnot": "socket:tesla_supercharger_ccs=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (a branded type2_css)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (a branded type2_css)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (Typ 2 CSS)</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -672,8 +627,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (a branded type2_css)</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (a branded type2_css)</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/Type2_CCS.svg'/> <span><b>Tesla Supercharger CCS</b> (Typ 2 CSS)</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -786,8 +740,7 @@
"ifnot": "socket:USB-A=", "ifnot": "socket:USB-A=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> to charge phones and small electronics</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> to charge phones and small electronics</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> om GSMs en kleine electronica op te laden</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> om GSMs en kleine electronica op te laden</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> zum Laden von Smartphones oder Elektrokleingeräten</span></div>"
} }
}, },
{ {
@ -799,8 +752,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> to charge phones and small electronics</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> to charge phones and small electronics</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> om GSMs en kleine electronica op te laden</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> om GSMs en kleine electronica op te laden</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/usb_port.svg'/> <span><b>USB</b> zum Laden von Smartphones und Elektrokleingeräten</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -852,8 +804,7 @@
"ifnot": "socket:bosch_5pin=", "ifnot": "socket:bosch_5pin=",
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect with 5 pins</b> and cable</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect with 5 pins</b> and cable</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect mit 5 Pins</b> und Kabel</span></div>"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": [ "or": [
@ -887,8 +838,7 @@
}, },
"then": { "then": {
"en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect with 5 pins</b> and cable</span></div>", "en": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect with 5 pins</b> and cable</span></div>",
"nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</span></div>", "nl": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</span></div>"
"de": "<div class='flex'><img class='w-12 mx-4' src='./assets/layers/charging_station/bosch-5pin.svg'/> <span><b>Bosch Active Connect mit 5 Pins</b> und Kabel</span></div>"
}, },
"hideInAnswer": true "hideInAnswer": true
} }
@ -1239,21 +1189,14 @@
}, },
"question": { "question": {
"en": "When is this charging station opened?", "en": "When is this charging station opened?",
"nl": "Wanneer is dit oplaadpunt beschikbaar??", "nl": "Wanneer is dit oplaadpunt beschikbaar??"
"de": "Wann ist diese Ladestation geöffnet?",
"it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
"ja": "この充電ステーションはいつオープンしますか?",
"nb_NO": "Når åpnet denne ladestasjonen?",
"ru": "В какое время работает эта зарядная станция?",
"zh_Hant": "何時是充電站開放使用的時間?"
}, },
"mappings": [ "mappings": [
{ {
"if": "opening_hours=24/7", "if": "opening_hours=24/7",
"then": { "then": {
"en": "24/7 opened (including holidays)", "en": "24/7 opened (including holidays)",
"nl": "24/7 open - ook tijdens vakanties", "nl": "24/7 open - ook tijdens vakanties"
"de": "durchgehend geöffnet (auch an Feiertagen)"
} }
} }
] ]
@ -1362,8 +1305,7 @@
"ifnot": "payment:app=no", "ifnot": "payment:app=no",
"then": { "then": {
"en": "Payment is done using a dedicated app", "en": "Payment is done using a dedicated app",
"nl": "Betalen via een app van het netwerk", "nl": "Betalen via een app van het netwerk"
"de": "Bezahlung mit einer speziellen App"
} }
}, },
{ {
@ -1371,8 +1313,7 @@
"ifnot": "payment:membership_card=no", "ifnot": "payment:membership_card=no",
"then": { "then": {
"en": "Payment is done using a membership card", "en": "Payment is done using a membership card",
"nl": "Betalen via een lidkaart van het netwerk", "nl": "Betalen via een lidkaart van het netwerk"
"de": "Bezahlung mit einer Mitgliedskarte"
} }
} }
] ]
@ -1383,8 +1324,7 @@
"#": "In some cases, charging is free but one has to be authenticated. We only ask for authentication if fee is no (or unset). By default one sees the questions for either the payment options or the authentication options, but normally not both", "#": "In some cases, charging is free but one has to be authenticated. We only ask for authentication if fee is no (or unset). By default one sees the questions for either the payment options or the authentication options, but normally not both",
"question": { "question": {
"en": "What kind of authentication is available at the charging station?", "en": "What kind of authentication is available at the charging station?",
"nl": "Hoe kan men zich aanmelden aan dit oplaadstation?", "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?"
"de": "Welche Authentifizierung ist an der Ladestation möglich?"
}, },
"multiAnswer": true, "multiAnswer": true,
"mappings": [ "mappings": [
@ -1393,8 +1333,7 @@
"ifnot": "authentication:membership_card=no", "ifnot": "authentication:membership_card=no",
"then": { "then": {
"en": "Authentication by a membership card", "en": "Authentication by a membership card",
"nl": "Aanmelden met een lidkaart is mogelijk", "nl": "Aanmelden met een lidkaart is mogelijk"
"de": "Authentifizierung durch eine Mitgliedskarte"
} }
}, },
{ {
@ -1402,8 +1341,7 @@
"ifnot": "authentication:app=no", "ifnot": "authentication:app=no",
"then": { "then": {
"en": "Authentication by an app", "en": "Authentication by an app",
"nl": "Aanmelden via een applicatie is mogelijk", "nl": "Aanmelden via een applicatie is mogelijk"
"de": "Authentifizierung durch eine App"
} }
}, },
{ {
@ -1411,17 +1349,15 @@
"ifnot": "authentication:phone_call=no", "ifnot": "authentication:phone_call=no",
"then": { "then": {
"en": "Authentication via phone call is available", "en": "Authentication via phone call is available",
"nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk", "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk"
"de": "Authentifizierung per Anruf ist möglich"
} }
}, },
{ {
"if": "authentication:short_message=yes", "if": "authentication:short_message=yes",
"ifnot": "authentication:short_message=no", "ifnot": "authentication:short_message=no",
"then": { "then": {
"en": "Authentication via phone call is available", "en": "Authentication via SMS is available",
"nl": "Aanmelden via SMS is mogelijk", "nl": "Aanmelden via SMS is mogelijk"
"de": "Authentifizierung per Anruf ist möglich"
} }
}, },
{ {
@ -1429,8 +1365,7 @@
"ifnot": "authentication:nfc=no", "ifnot": "authentication:nfc=no",
"then": { "then": {
"en": "Authentication via NFC is available", "en": "Authentication via NFC is available",
"nl": "Aanmelden via NFC is mogelijk", "nl": "Aanmelden via NFC is mogelijk"
"de": "Authentifizierung über NFC ist möglich"
} }
}, },
{ {
@ -1438,8 +1373,7 @@
"ifnot": "authentication:money_card=no", "ifnot": "authentication:money_card=no",
"then": { "then": {
"en": "Authentication via Money Card is available", "en": "Authentication via Money Card is available",
"nl": "Aanmelden met Money Card is mogelijk", "nl": "Aanmelden met Money Card is mogelijk"
"de": "Authentifizierung über Geldkarte ist möglich"
} }
}, },
{ {
@ -1447,8 +1381,7 @@
"ifnot": "authentication:debit_card=no", "ifnot": "authentication:debit_card=no",
"then": { "then": {
"en": "Authentication via debit card is available", "en": "Authentication via debit card is available",
"nl": "Aanmelden met een betaalkaart is mogelijk", "nl": "Aanmelden met een betaalkaart is mogelijk"
"de": "Authentifizierung per Debitkarte ist möglich"
} }
}, },
{ {
@ -1456,8 +1389,7 @@
"ifnot": "authentication:none=no", "ifnot": "authentication:none=no",
"then": { "then": {
"en": "Charging here is (also) possible without authentication", "en": "Charging here is (also) possible without authentication",
"nl": "Hier opladen is (ook) mogelijk zonder aan te melden", "nl": "Hier opladen is (ook) mogelijk zonder aan te melden"
"de": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
} }
} }
], ],
@ -1472,13 +1404,11 @@
"id": "Auth phone", "id": "Auth phone",
"render": { "render": {
"en": "Authenticate by calling or SMS'ing to <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>", "en": "Authenticate by calling or SMS'ing to <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>",
"nl": "Aanmelden door te bellen of te SMS'en naar <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>", "nl": "Aanmelden door te bellen of te SMS'en naar <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>"
"de": "Authentifizierung durch Anruf oder SMS an <a href='tel:{authentication:phone_call:number}'>{authentication:phone_call:number}</a>"
}, },
"question": { "question": {
"en": "What's the phone number for authentication call or SMS?", "en": "What's the phone number for authentication call or SMS?",
"nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?", "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?"
"de": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?"
}, },
"freeform": { "freeform": {
"key": "authentication:phone_call:number", "key": "authentication:phone_call:number",
@ -1495,24 +1425,21 @@
"id": "maxstay", "id": "maxstay",
"question": { "question": {
"en": "What is the maximum amount of time one is allowed to stay here?", "en": "What is the maximum amount of time one is allowed to stay here?",
"nl": "Hoelang mag een voertuig hier blijven staan?", "nl": "Hoelang mag een voertuig hier blijven staan?"
"de": "Was ist die Höchstdauer des Aufenthalts hier?"
}, },
"freeform": { "freeform": {
"key": "maxstay" "key": "maxstay"
}, },
"render": { "render": {
"en": "One can stay at most <b>{canonical(maxstay)}</b>", "en": "One can stay at most <b>{canonical(maxstay)}</b>",
"nl": "De maximale parkeertijd hier is <b>{canonical(maxstay)}</b>", "nl": "De maximale parkeertijd hier is <b>{canonical(maxstay)}</b>"
"de": "Die maximale Parkzeit beträgt <b>{canonical(maxstay)}</b>"
}, },
"mappings": [ "mappings": [
{ {
"if": "maxstay=unlimited", "if": "maxstay=unlimited",
"then": { "then": {
"en": "No timelimit on leaving your vehicle here", "en": "No timelimit on leaving your vehicle here",
"nl": "Geen maximum parkeertijd", "nl": "Geen maximum parkeertijd"
"de": "Keine Höchstparkdauer"
} }
} }
], ],
@ -1529,22 +1456,11 @@
"id": "Network", "id": "Network",
"render": { "render": {
"en": "Part of the network <b>{network}</b>", "en": "Part of the network <b>{network}</b>",
"nl": "Maakt deel uit van het <b>{network}</b>-netwerk", "nl": "Maakt deel uit van het <b>{network}</b>-netwerk"
"de": "Teil des Netzwerks <b>{network}</b>",
"it": "{network}",
"ja": "{network}",
"nb_NO": "{network}",
"ru": "{network}",
"zh_Hant": "{network}"
}, },
"question": { "question": {
"en": "Is this charging station part of a network?", "en": "Is this charging station part of a network?",
"nl": "Is dit oplaadpunt deel van een groter netwerk?", "nl": "Is dit oplaadpunt deel van een groter netwerk?"
"de": "Ist diese Ladestation Teil eines Netzwerks?",
"it": "A quale rete appartiene questa stazione di ricarica?",
"ja": "この充電ステーションの運営チェーンはどこですか?",
"ru": "К какой сети относится эта станция?",
"zh_Hant": "充電站所屬的網路是?"
}, },
"freeform": { "freeform": {
"key": "network" "key": "network"
@ -1554,16 +1470,14 @@
"if": "no:network=yes", "if": "no:network=yes",
"then": { "then": {
"en": "Not part of a bigger network", "en": "Not part of a bigger network",
"nl": "Maakt geen deel uit van een groter netwerk", "nl": "Maakt geen deel uit van een groter netwerk"
"de": "Nicht Teil eines größeren Netzwerks"
} }
}, },
{ {
"if": "network=none", "if": "network=none",
"then": { "then": {
"en": "Not part of a bigger network", "en": "Not part of a bigger network",
"nl": "Maakt geen deel uit van een groter netwerk", "nl": "Maakt geen deel uit van een groter netwerk"
"de": "Nicht Teil eines größeren Netzwerks"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -1585,13 +1499,11 @@
"id": "Operator", "id": "Operator",
"question": { "question": {
"en": "Who is the operator of this charging station?", "en": "Who is the operator of this charging station?",
"nl": "Wie beheert dit oplaadpunt?", "nl": "Wie beheert dit oplaadpunt?"
"de": "Wer ist der Betreiber dieser Ladestation?"
}, },
"render": { "render": {
"en": "This charging station is operated by {operator}", "en": "This charging station is operated by {operator}",
"nl": "Wordt beheerd door {operator}", "nl": "Wordt beheerd door {operator}"
"de": "Diese Ladestation wird betrieben von {operator}"
}, },
"freeform": { "freeform": {
"key": "operator" "key": "operator"
@ -1605,12 +1517,8 @@
}, },
"then": { "then": {
"en": "Actually, {operator} is the network", "en": "Actually, {operator} is the network",
"nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt", "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
"de": "Eigentlich ist {operator} das Netzwerk"
}, },
"addExtraTags": [
"operator="
],
"hideInAnswer": "operator=" "hideInAnswer": "operator="
} }
] ]
@ -1619,13 +1527,11 @@
"id": "phone", "id": "phone",
"question": { "question": {
"en": "What number can one call if there is a problem with this charging station?", "en": "What number can one call if there is a problem with this charging station?",
"nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?", "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?"
"de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
}, },
"render": { "render": {
"en": "In case of problems, call <a href='tel:{phone}'>{phone}</a>", "en": "In case of problems, call <a href='tel:{phone}'>{phone}</a>",
"nl": "Bij problemen, bel naar <a href='tel:{phone}'>{phone}</a>", "nl": "Bij problemen, bel naar <a href='tel:{phone}'>{phone}</a>"
"de": "Bei Problemen, anrufen unter <a href='tel:{phone}'>{phone}</a>"
}, },
"freeform": { "freeform": {
"key": "phone", "key": "phone",
@ -1636,13 +1542,11 @@
"id": "email", "id": "email",
"question": { "question": {
"en": "What is the email address of the operator?", "en": "What is the email address of the operator?",
"nl": "Wat is het email-adres van de operator?", "nl": "Wat is het email-adres van de operator?"
"de": "Wie ist die Email-Adresse des Betreibers?"
}, },
"render": { "render": {
"en": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>", "en": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>",
"nl": "Bij problemen, email naar <a href='mailto:{email}'>{email}</a>", "nl": "Bij problemen, email naar <a href='mailto:{email}'>{email}</a>"
"de": "Bei Problemen senden Sie eine E-Mail an <a href='mailto:{email}'>{email}</a>"
}, },
"freeform": { "freeform": {
"key": "email", "key": "email",
@ -1652,14 +1556,12 @@
{ {
"id": "website", "id": "website",
"question": { "question": {
"en": "What is the website of the operator?", "en": "What is the website where one can find more information about this charging station?",
"nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?", "nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?"
"de": "Wie ist die Webseite des Betreibers?"
}, },
"render": { "render": {
"en": "More info on <a href='{website}'>{website}</a>", "en": "More info on <a href='{website}'>{website}</a>",
"nl": "Meer informatie op <a href='{website}'>{website}</a>", "nl": "Meer informatie op <a href='{website}'>{website}</a>"
"de": "Weitere Informationen auf <a href='{website}'>{website}</a>"
}, },
"freeform": { "freeform": {
"key": "website", "key": "website",
@ -1671,13 +1573,11 @@
"id": "ref", "id": "ref",
"question": { "question": {
"en": "What is the reference number of this charging station?", "en": "What is the reference number of this charging station?",
"nl": "Wat is het referentienummer van dit oplaadstation?", "nl": "Wat is het referentienummer van dit oplaadstation?"
"de": "Wie lautet die Kennung dieser Ladestation?"
}, },
"render": { "render": {
"en": "Reference number is <b>{ref}</b>", "en": "Reference number is <b>{ref}</b>",
"nl": "Het referentienummer van dit oplaadpunt is <b>{ref}</b>", "nl": "Het referentienummer van dit oplaadpunt is <b>{ref}</b>"
"de": "Die Kennziffer ist <b>{ref}</b>"
}, },
"freeform": { "freeform": {
"key": "ref" "key": "ref"
@ -1689,8 +1589,7 @@
"id": "Operational status", "id": "Operational status",
"question": { "question": {
"en": "Is this charging point in use?", "en": "Is this charging point in use?",
"nl": "Is dit oplaadpunt operationeel?", "nl": "Is dit oplaadpunt operationeel?"
"de": "Ist dieser Ladepunkt in Betrieb?"
}, },
"mappings": [ "mappings": [
{ {
@ -1705,8 +1604,7 @@
}, },
"then": { "then": {
"en": "This charging station works", "en": "This charging station works",
"nl": "Dit oplaadpunt werkt", "nl": "Dit oplaadpunt werkt"
"de": "Diese Ladestation funktioniert"
} }
}, },
{ {
@ -1721,8 +1619,7 @@
}, },
"then": { "then": {
"en": "This charging station is broken", "en": "This charging station is broken",
"nl": "Dit oplaadpunt is kapot", "nl": "Dit oplaadpunt is kapot"
"de": "Diese Ladestation ist kaputt"
} }
}, },
{ {
@ -1737,8 +1634,7 @@
}, },
"then": { "then": {
"en": "A charging station is planned here", "en": "A charging station is planned here",
"nl": "Hier zal binnenkort een oplaadpunt gebouwd worden", "nl": "Hier zal binnenkort een oplaadpunt gebouwd worden"
"de": "Hier ist eine Ladestation geplant"
} }
}, },
{ {
@ -1753,8 +1649,7 @@
}, },
"then": { "then": {
"en": "A charging station is constructed here", "en": "A charging station is constructed here",
"nl": "Hier wordt op dit moment een oplaadpunt gebouwd", "nl": "Hier wordt op dit moment een oplaadpunt gebouwd"
"de": "Hier wird eine Ladestation gebaut"
} }
}, },
{ {
@ -1769,8 +1664,7 @@
}, },
"then": { "then": {
"en": "This charging station has beed permanently disabled and is not in use anymore but is still visible", "en": "This charging station has beed permanently disabled and is not in use anymore but is still visible",
"nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig", "nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig"
"de": "Diese Ladestation wurde dauerhaft deaktiviert und wird nicht mehr benutzt, ist aber noch sichtbar"
} }
} }
] ]
@ -1779,24 +1673,21 @@
"id": "Parking:fee", "id": "Parking:fee",
"question": { "question": {
"en": "Does one have to pay a parking fee while charging?", "en": "Does one have to pay a parking fee while charging?",
"nl": "Moet men parkeergeld betalen tijdens het opladen?", "nl": "Moet men parkeergeld betalen tijdens het opladen?"
"de": "Muss man beim Laden eine Parkgebühr bezahlen?"
}, },
"mappings": [ "mappings": [
{ {
"if": "parking:fee=no", "if": "parking:fee=no",
"then": { "then": {
"en": "No additional parking cost while charging", "en": "No additional parking cost while charging",
"nl": "Geen extra parkeerkost tijdens het opladen", "nl": "Geen extra parkeerkost tijdens het opladen"
"de": "Keine zusätzlichen Parkgebühren beim Laden"
} }
}, },
{ {
"if": "parking:fee=yes", "if": "parking:fee=yes",
"then": { "then": {
"en": "An additional parking fee should be paid while charging", "en": "An additional parking fee should be paid while charging",
"nl": "Tijdens het opladen moet er parkeergeld betaald worden", "nl": "Tijdens het opladen moet er parkeergeld betaald worden"
"de": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten"
} }
} }
], ],
@ -1883,10 +1774,8 @@
"socket:typee=1" "socket:typee=1"
], ],
"title": { "title": {
"en": "Charging station", "en": "electrical outlet to charge e-bikes",
"nl": "gewone stekker <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (bedoeld om electrische fietsen op te laden)", "nl": "laadpunt met gewone stekker(s) <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (bedoeld om electrische fietsen op te laden)"
"de": "Ladestation",
"ru": "Зарядная станция"
}, },
"preciseInput": { "preciseInput": {
"preferredBackground": "map" "preferredBackground": "map"
@ -1941,23 +1830,20 @@
{ {
"question": { "question": {
"en": "All vehicle types", "en": "All vehicle types",
"nl": "Alle voertuigen", "nl": "Alle voertuigen"
"de": "Alle Fahrzeugtypen"
} }
}, },
{ {
"question": { "question": {
"en": "Charging station for bicycles", "en": "Charging station for bicycles",
"nl": "Oplaadpunten voor fietsen", "nl": "Oplaadpunten voor fietsen"
"de": "Ladestation für Fahrräder"
}, },
"osmTags": "bicycle=yes" "osmTags": "bicycle=yes"
}, },
{ {
"question": { "question": {
"en": "Charging station for cars", "en": "Charging station for cars",
"nl": "Oplaadpunten voor auto's", "nl": "Oplaadpunten voor auto's"
"de": "Ladestation für Autos"
}, },
"osmTags": { "osmTags": {
"or": [ "or": [
@ -1974,8 +1860,7 @@
{ {
"question": { "question": {
"en": "Only working charging stations", "en": "Only working charging stations",
"nl": "Enkel werkende oplaadpunten", "nl": "Enkel werkende oplaadpunten"
"de": "Nur funktionierende Ladestationen"
}, },
"osmTags": { "osmTags": {
"and": [ "and": [
@ -1992,8 +1877,7 @@
{ {
"question": { "question": {
"en": "All connectors", "en": "All connectors",
"nl": "Alle types", "nl": "Alle types"
"de": "Alle Anschlüsse"
} }
}, },
{ {
@ -2013,8 +1897,7 @@
{ {
"question": { "question": {
"en": "Has a <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div> connector", "en": "Has a <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div> connector",
"nl": "Heeft een <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div>", "nl": "Heeft een <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div>"
"de": "Hat einen <div style='display: inline-block'><b><b>Chademo</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Chademo_type4.svg'/></div> Stecker"
}, },
"osmTags": "socket:chademo~*" "osmTags": "socket:chademo~*"
}, },
@ -2042,8 +1925,7 @@
{ {
"question": { "question": {
"en": "Has a <div style='display: inline-block'><b><b>Tesla Supercharger</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> connector", "en": "Has a <div style='display: inline-block'><b><b>Tesla Supercharger</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> connector",
"nl": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div>", "nl": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div>"
"de": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> Stecker"
}, },
"osmTags": "socket:tesla_supercharger~*" "osmTags": "socket:tesla_supercharger~*"
}, },
@ -2131,15 +2013,11 @@
], ],
"human": { "human": {
"en": " minutes", "en": " minutes",
"nl": " minuten", "nl": " minuten"
"de": " Minuten",
"ru": " минут"
}, },
"humanSingular": { "humanSingular": {
"en": " minute", "en": " minute",
"nl": " minuut", "nl": " minuut"
"de": " Minute",
"ru": " минута"
} }
}, },
{ {
@ -2155,15 +2033,11 @@
], ],
"human": { "human": {
"en": " hours", "en": " hours",
"nl": " uren", "nl": " uren"
"de": " Stunden",
"ru": " часов"
}, },
"humanSingular": { "humanSingular": {
"en": " hour", "en": " hour",
"nl": " uur", "nl": " uur"
"de": " Stunde",
"ru": " час"
} }
}, },
{ {
@ -2176,15 +2050,11 @@
], ],
"human": { "human": {
"en": " days", "en": " days",
"nl": " day", "nl": " day"
"de": " Tage",
"ru": " дней"
}, },
"humanSingular": { "humanSingular": {
"en": " day", "en": " day",
"nl": " dag", "nl": " dag"
"de": " Tag",
"ru": " день"
} }
} }
] ]
@ -2220,9 +2090,7 @@
], ],
"human": { "human": {
"en": "Volts", "en": "Volts",
"nl": "volt", "nl": "volt"
"de": "Volt",
"ru": "Вольт"
} }
} }
], ],
@ -2291,9 +2159,7 @@
], ],
"human": { "human": {
"en": "kilowatt", "en": "kilowatt",
"nl": "kilowatt", "nl": "kilowatt"
"de": "Kilowatt",
"ru": "киловатт"
} }
}, },
{ {
@ -2303,9 +2169,7 @@
], ],
"human": { "human": {
"en": "megawatt", "en": "megawatt",
"nl": "megawatt", "nl": "megawatt"
"de": "Megawatt",
"ru": "мегаватт"
} }
} }
], ],

View file

@ -83,7 +83,6 @@
} }
] ]
}, },
"description": {},
"tagRenderings": [ "tagRenderings": [
{ {
"question": { "question": {

85
scripts/slice.ts Normal file
View file

@ -0,0 +1,85 @@
import * as fs from "fs";
import TiledFeatureSource from "../Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource";
import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource";
import * as readline from "readline";
import ScriptUtils from "./ScriptUtils";
async function main(args: string[]) {
console.log("GeoJSON slicer")
if (args.length < 3) {
console.log("USAGE: <input-file.line-delimited-geojson> <target-zoom-level> <output-directory>")
return
}
const inputFile = args[0]
const zoomlevel = Number(args[1])
const outputDirectory = args[2]
if (!fs.existsSync(outputDirectory)) {
fs.mkdirSync(outputDirectory)
console.log("Directory created")
}
console.log("Using directory ", outputDirectory)
const fileStream = fs.createReadStream(inputFile);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.
const allFeatures = []
// @ts-ignore
for await (const line of rl) {
// Each line in input.txt will be successively available here as `line`.
try{
allFeatures.push(JSON.parse(line))
}catch (e) {
console.error("Could not parse", line)
break
}
if(allFeatures.length % 10000 === 0){
ScriptUtils.erasableLog("Loaded ", allFeatures.length, "features up till now")
}
}
console.log("Loaded all", allFeatures.length, "points")
const keysToRemove = ["ID","STRAATNMID","NISCODE","GEMEENTE","POSTCODE","HERKOMST","APPTNR"]
for (const f of allFeatures) {
for (const keyToRm of keysToRemove) {
delete f.properties[keyToRm]
}
}
//const knownKeys = Utils.Dedup([].concat(...allFeatures.map(f => Object.keys(f.properties))))
//console.log("Kept keys: ", knownKeys)
TiledFeatureSource.createHierarchy(
new StaticFeatureSource(allFeatures, false),
{
minZoomLevel: zoomlevel,
maxZoomLevel: zoomlevel,
maxFeatureCount: Number.MAX_VALUE,
registerTile: tile => {
const path = `${outputDirectory}/tile_${tile.z}_${tile.x}_${tile.y}.geojson`
fs.writeFileSync(path, JSON.stringify({
"type": "FeatureCollection",
"features": tile.features.data.map(ff => ff.feature)
}, null, " "))
console.log("Written ", path, "which has ", tile.features.data.length, "features")
}
}
)
}
let args = [...process.argv]
args.splice(0, 2)
main(args).then(_ => {
console.log("All done!")
});