Add Open Toilet Map, fix #34
This commit is contained in:
parent
2df565dc50
commit
a55767c1e9
11 changed files with 188 additions and 188 deletions
|
@ -15,6 +15,7 @@ import {GhostBikes} from "./Layouts/GhostBikes";
|
||||||
import {CustomLayoutFromJSON} from "./JSON/CustomLayoutFromJSON";
|
import {CustomLayoutFromJSON} from "./JSON/CustomLayoutFromJSON";
|
||||||
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
|
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
|
||||||
import * as aed from "../assets/themes/aed/aed.json";
|
import * as aed from "../assets/themes/aed/aed.json";
|
||||||
|
import * as toilets from "../assets/themes/toilets/toilets.json";
|
||||||
|
|
||||||
export class AllKnownLayouts {
|
export class AllKnownLayouts {
|
||||||
|
|
||||||
|
@ -28,6 +29,7 @@ export class AllKnownLayouts {
|
||||||
new GhostBikes(),
|
new GhostBikes(),
|
||||||
CustomLayoutFromJSON.LayoutFromJSON(bookcases),
|
CustomLayoutFromJSON.LayoutFromJSON(bookcases),
|
||||||
CustomLayoutFromJSON.LayoutFromJSON(aed),
|
CustomLayoutFromJSON.LayoutFromJSON(aed),
|
||||||
|
CustomLayoutFromJSON.LayoutFromJSON(toilets),
|
||||||
|
|
||||||
new MetaMap(),
|
new MetaMap(),
|
||||||
new StreetWidth(),
|
new StreetWidth(),
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
import {LayerDefinition} from "../LayerDefinition";
|
|
||||||
import {FixedUiElement} from "../../UI/Base/FixedUiElement";
|
|
||||||
import L from "leaflet";
|
|
||||||
import {Tag} from "../../Logic/TagsFilter";
|
|
||||||
|
|
||||||
export class Toilets extends LayerDefinition{
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super("toilets");
|
|
||||||
|
|
||||||
this.name="toilet";
|
|
||||||
this.newElementTags = [new Tag( "amenity", "toilets")];
|
|
||||||
this.icon = "./assets/toilets.svg";
|
|
||||||
this.overpassFilter = new Tag("amenity","toilets");
|
|
||||||
this.minzoom = 13;
|
|
||||||
this.questions = [Quests.hasFee,
|
|
||||||
Quests.toiletsWheelChairs,
|
|
||||||
Quests.toiletsChangingTable,
|
|
||||||
Quests.toiletsChangingTableLocation,
|
|
||||||
Quests.toiletsPosition];
|
|
||||||
|
|
||||||
this.style = function(tags){
|
|
||||||
if(tags.wheelchair == "yes"){
|
|
||||||
|
|
||||||
return {icon : new L.icon({
|
|
||||||
iconUrl: "assets/wheelchair.svg",
|
|
||||||
iconSize: [40, 40]
|
|
||||||
})};
|
|
||||||
}
|
|
||||||
return {icon : new L.icon({
|
|
||||||
iconUrl: "assets/toilets.svg",
|
|
||||||
iconSize: [40, 40]
|
|
||||||
})};
|
|
||||||
}
|
|
||||||
|
|
||||||
this.elementsToShow = [
|
|
||||||
new FixedUiElement("Toiletten"),
|
|
||||||
|
|
||||||
new TagMappingOptions({
|
|
||||||
key: "access",
|
|
||||||
mapping: {
|
|
||||||
yes: "Toegankelijk",
|
|
||||||
no: "Niet toegankelijk",
|
|
||||||
private: "Niet toegankelijk",
|
|
||||||
customers: "Enkel voor klanten",
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
new TagMappingOptions({
|
|
||||||
key: "fee",
|
|
||||||
mapping: {
|
|
||||||
yes: "Betalend",
|
|
||||||
no: "Gratis",
|
|
||||||
["0"]: "Gratis"
|
|
||||||
},
|
|
||||||
template: "Betalend, men vraagt {fee}"
|
|
||||||
}),
|
|
||||||
|
|
||||||
new TagMappingOptions({
|
|
||||||
key: "toilets:position",
|
|
||||||
mapping: {
|
|
||||||
seated: 'Gewone zittoiletten',
|
|
||||||
urinal: 'Een enkele urinoir',
|
|
||||||
urinals: 'Urinoirs',
|
|
||||||
['urinals;seated']: "Urinoirs en gewone toiletten",
|
|
||||||
['seated;urinals']: "Urinoirs en gewone toiletten",
|
|
||||||
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
new TagMappingOptions({
|
|
||||||
key: "wheelchair",
|
|
||||||
mapping: {
|
|
||||||
yes: "Rolstoeltoegankelijk",
|
|
||||||
no: "Niet Rolstoeltoegankelijk",
|
|
||||||
limited: "Beperkt rolstoeltoegankelijk",
|
|
||||||
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
import {Layout} from "../Layout";
|
|
||||||
import * as Layer from "../Layers/Toilets";
|
|
||||||
|
|
||||||
export class Toilets extends Layout{
|
|
||||||
constructor() {
|
|
||||||
super( "toilets",
|
|
||||||
["en"],
|
|
||||||
"Open Toilet Map",
|
|
||||||
[new Layer.Toilets()],
|
|
||||||
12,
|
|
||||||
51.2,
|
|
||||||
3.2,
|
|
||||||
|
|
||||||
|
|
||||||
" <h3>Open Toilet Map</h3>\n" +
|
|
||||||
"\n" +
|
|
||||||
"<p>Help us to create the most complete map about <i>all</i> the toilets in the world, based on openStreetMap." +
|
|
||||||
"One can answer questions here, which help users all over the world to find an accessible toilet, close to them.</p>"
|
|
||||||
,
|
|
||||||
" <p>Start by <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">creating an account\n" +
|
|
||||||
" </a> or by " +
|
|
||||||
" <span onclick=\"authOsm()\" class=\"activate-osm-authentication\">logging in</span>.</p>",
|
|
||||||
"Start by clicking a pin and answering the questions");
|
|
||||||
}
|
|
||||||
}
|
|
4
State.ts
4
State.ts
|
@ -24,7 +24,7 @@ export class State {
|
||||||
// The singleton of the global state
|
// The singleton of the global state
|
||||||
public static state: State;
|
public static state: State;
|
||||||
|
|
||||||
public static vNumber = "0.0.5b";
|
public static vNumber = "0.0.5c";
|
||||||
|
|
||||||
public static runningFromConsole: boolean = false;
|
public static runningFromConsole: boolean = false;
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ export class State {
|
||||||
*/
|
*/
|
||||||
public bm;
|
public bm;
|
||||||
/**
|
/**
|
||||||
The user crednetials
|
The user credentials
|
||||||
*/
|
*/
|
||||||
public osmConnection: OsmConnection;
|
public osmConnection: OsmConnection;
|
||||||
|
|
||||||
|
|
|
@ -44,14 +44,17 @@ export class MoreScreen extends UIElement {
|
||||||
const currentLocation = State.state.locationControl.data;
|
const currentLocation = State.state.locationControl.data;
|
||||||
const linkText =
|
const linkText =
|
||||||
`https://pietervdvn.github.io/MapComplete/${layout.name}.html?z=${currentLocation.zoom}&lat=${currentLocation.lat}&lon=${currentLocation.lon}`
|
`https://pietervdvn.github.io/MapComplete/${layout.name}.html?z=${currentLocation.zoom}&lat=${currentLocation.lat}&lon=${currentLocation.lon}`
|
||||||
|
let description = Translations.W(layout.description);
|
||||||
|
if(description !== undefined){
|
||||||
|
description = new Combine(["<br/>", description]);
|
||||||
|
}
|
||||||
const link =
|
const link =
|
||||||
new SubtleButton(layout.icon,
|
new SubtleButton(layout.icon,
|
||||||
new Combine([
|
new Combine([
|
||||||
"<b>",
|
"<b>",
|
||||||
Translations.W(layout.title),
|
Translations.W(layout.title),
|
||||||
"</b>",
|
"</b>",
|
||||||
"<br/>",
|
description ?? "",
|
||||||
Translations.W(layout.description),
|
|
||||||
]), {url: linkText, newTab: false});
|
]), {url: linkText, newTab: false});
|
||||||
|
|
||||||
els.push(link)
|
els.push(link)
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
viewBox="0 0 64 64"
|
|
||||||
height="64"
|
|
||||||
width="64"
|
|
||||||
id="svg109"
|
|
||||||
version="1.1"
|
|
||||||
sodipodi:docname="Public_bookcase-14.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1001"
|
|
||||||
id="namedview6"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="8.4285714"
|
|
||||||
inkscape:cx="21.124627"
|
|
||||||
inkscape:cy="25.918314"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="layer2" />
|
|
||||||
<metadata
|
|
||||||
id="metadata115">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs113" />
|
|
||||||
<g
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="background">
|
|
||||||
<ellipse
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.49738699;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
id="path819"
|
|
||||||
cx="31.967007"
|
|
||||||
cy="32.109043"
|
|
||||||
rx="32.00938"
|
|
||||||
ry="31.946436" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer2"
|
|
||||||
inkscape:label="icon">
|
|
||||||
<path
|
|
||||||
id="path4176"
|
|
||||||
d="M 32.123859,10.440678 8.6779661,17.139504 v 3.349413 L 32.123859,13.79009 55.569753,20.488917 v -3.349413 z m -11.59865,11.964995 c -0.522431,0.02077 -1.041409,0.124297 -1.556954,0.320538 v 20.835706 c 0,0 8.38755,-0.322013 10.525792,7.817477 V 29.497007 c -1.631616,-3.400613 -5.311804,-7.237191 -8.968838,-7.091334 z m 8.968838,28.973731 C 24.066203,47.228261 16.331902,46.172115 16.331902,46.172115 V 26.376556 l -2.629816,-1.046692 v 23.445893 l 15.791961,5.207293 h 5.259628 L 50.545632,48.775757 V 25.329864 l -2.629812,1.046692 v 20.835709 l -13.162145,4.167139 c -1.754454,-0.663351 -3.795938,-0.545319 -5.259628,0 z M 45.279464,22.726221 C 40.03579,22.448689 33.986193,25.566152 30.808953,28.247518 v 22.045945 c 2.933724,-2.408355 8.190227,-5.573982 14.470511,-6.208191 z"
|
|
||||||
style="fill:#734a08;fill-opacity:1;stroke:none;stroke-width:3.34941339"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.8 KiB |
169
assets/themes/toilets/toilets.json
Normal file
169
assets/themes/toilets/toilets.json
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
{
|
||||||
|
"layers": [
|
||||||
|
{
|
||||||
|
"id": "Toilet",
|
||||||
|
"title": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "Toilet"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "./assets/themes/toilets/toilets.svg",
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "./assets/themes/toilets/wheelchair.svg",
|
||||||
|
"if": "wheelchair=yes"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"key": "*",
|
||||||
|
"render": "#0000ff"
|
||||||
|
},
|
||||||
|
"description": "A toilet",
|
||||||
|
"minzoom": "14",
|
||||||
|
"wayHandling": 2,
|
||||||
|
"presets": [
|
||||||
|
{
|
||||||
|
"title": "Toilet",
|
||||||
|
"tags": "amenity=toilets",
|
||||||
|
"description": "Only add public toilets"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagRenderings": [
|
||||||
|
{
|
||||||
|
"key": "access",
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "Public access",
|
||||||
|
"if": "access=yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"then": "Only access to customers",
|
||||||
|
"if": "access=customers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "access=no",
|
||||||
|
"then": "Not accessible"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"then": "Accessible, but one has to ask a key to enter",
|
||||||
|
"if": "access=key"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"question": "Are these toilets publicly accessible?",
|
||||||
|
"type": "text",
|
||||||
|
"addExtraTags": "fixme=the tag access was filled out by the user and might need refinement",
|
||||||
|
"render": "Access is {access}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "These are paid toilets",
|
||||||
|
"if": "fee=yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "fee=no",
|
||||||
|
"then": "Free to use"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "text",
|
||||||
|
"question": "Are these toilets free to use?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "charge",
|
||||||
|
"mappings": [],
|
||||||
|
"question": "How much does one have to pay for these toilets?",
|
||||||
|
"type": "string",
|
||||||
|
"render": "The fee is {charge}",
|
||||||
|
"condition": "fee=yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "There is a dedicated toilet for wheelchair users",
|
||||||
|
"if": "wheelchair=yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "wheelchair=no",
|
||||||
|
"then": "No wheelchair access"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "text",
|
||||||
|
"question": "Is there a dedicated toilet for wheelchair users"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": "toilets:position=seated",
|
||||||
|
"then": "There are only seated toilets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "toilets:position=urinals",
|
||||||
|
"then": "There are only urinals here"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "toilets:position=squat",
|
||||||
|
"then": "There are only squat toilets here"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "toilets:position=seated;urinals",
|
||||||
|
"then": "Both seated toilets and urinals are available here"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"question": "Which kind of toilets are this?",
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "A changing table is available",
|
||||||
|
"if": "changing_table=yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "changing_table=no",
|
||||||
|
"then": "No changing table is available"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"question": "Is a changing table (to change diapers) available?",
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "changing_table:location",
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"then": "The changing table is in the toilet for women. ",
|
||||||
|
"if": "changing_table:location=female_toilet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"then": "The changing table is in the toilet for men. ",
|
||||||
|
"if": "changing_table:location=male_toilet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "changing_table:location=wheelchair_toilet",
|
||||||
|
"then": "The changing table is in the toilet for wheelchair users. "
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "changing_table:location=dedicated_room",
|
||||||
|
"then": "The changing table is in a dedicated room. "
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "text",
|
||||||
|
"question": "Where is the changing table located?",
|
||||||
|
"condition": "changing_table=yes",
|
||||||
|
"render": "The changing table is located at {changing_table:location}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"overpassTags": "amenity=toilets"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"startLat": "51.2095",
|
||||||
|
"startZoom": "12",
|
||||||
|
"maintainer": "Pieter Vander Vennet",
|
||||||
|
"title": "Open Toilet Map",
|
||||||
|
"startLon": "3.2222",
|
||||||
|
"icon": "./assets/themes/toilets/toilets.svg",
|
||||||
|
"description": "A map of public toilets",
|
||||||
|
"language": "en",
|
||||||
|
"name": "toilets"
|
||||||
|
}
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
@ -7,6 +7,8 @@ import {LocalStorageSource} from "./Logic/Web/LocalStorageSource";
|
||||||
import {createHash} from "crypto";
|
import {createHash} from "crypto";
|
||||||
import Combine from "./UI/Base/Combine";
|
import Combine from "./UI/Base/Combine";
|
||||||
import {Button} from "./UI/Base/Button";
|
import {Button} from "./UI/Base/Button";
|
||||||
|
import {FixedUiElement} from "./UI/Base/FixedUiElement";
|
||||||
|
import {State} from "./State";
|
||||||
|
|
||||||
const connection = new OsmConnection(true, new UIEventSource<string>(undefined), false);
|
const connection = new OsmConnection(true, new UIEventSource<string>(undefined), false);
|
||||||
connection.AttemptLogin();
|
connection.AttemptLogin();
|
||||||
|
@ -16,7 +18,7 @@ const localStorage = LocalStorageSource.Get("last-custom-save");
|
||||||
console.log("hash", hash)
|
console.log("hash", hash)
|
||||||
console.log("Saved: ", localStorage.data)
|
console.log("Saved: ", localStorage.data)
|
||||||
|
|
||||||
if (hash === undefined || hash === "") {
|
if (hash === undefined || hash === "" && localStorage.data !== undefined) {
|
||||||
const previous = localStorage.data.split("#");
|
const previous = localStorage.data.split("#");
|
||||||
hash = previous[1];
|
hash = previous[1];
|
||||||
console.log("Using previously saved data ", hash)
|
console.log("Using previously saved data ", hash)
|
||||||
|
@ -41,4 +43,9 @@ new Combine([
|
||||||
themeGenerator.themeObject.data.maintainer = connection.userDetails.data.name;
|
themeGenerator.themeObject.data.maintainer = connection.userDetails.data.name;
|
||||||
themeGenerator.themeObject.data.layers = [];
|
themeGenerator.themeObject.data.layers = [];
|
||||||
themeGenerator.themeObject.ping();
|
themeGenerator.themeObject.ping();
|
||||||
})]).AttachTo("preview");
|
}),
|
||||||
|
"<br/>",
|
||||||
|
"Version: ",
|
||||||
|
State.vNumber
|
||||||
|
|
||||||
|
]).AttachTo("preview");
|
||||||
|
|
|
@ -1193,6 +1193,7 @@ form {
|
||||||
border-right:1px solid gray;
|
border-right:1px solid gray;
|
||||||
border-top: 1px solid gray;
|
border-top: 1px solid gray;
|
||||||
border-bottom: 1px solid lightgray;
|
border-bottom: 1px solid lightgray;
|
||||||
|
min-width: 4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue