Add Open Toilet Map, fix #34

This commit is contained in:
Pieter Vander Vennet 2020-08-22 16:00:33 +02:00
parent 2df565dc50
commit a55767c1e9
11 changed files with 188 additions and 188 deletions

View file

@ -15,6 +15,7 @@ import {GhostBikes} from "./Layouts/GhostBikes";
import {CustomLayoutFromJSON} from "./JSON/CustomLayoutFromJSON";
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
import * as aed from "../assets/themes/aed/aed.json";
import * as toilets from "../assets/themes/toilets/toilets.json";
export class AllKnownLayouts {
@ -28,6 +29,7 @@ export class AllKnownLayouts {
new GhostBikes(),
CustomLayoutFromJSON.LayoutFromJSON(bookcases),
CustomLayoutFromJSON.LayoutFromJSON(aed),
CustomLayoutFromJSON.LayoutFromJSON(toilets),
new MetaMap(),
new StreetWidth(),

View file

@ -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",
}
}),
];
}
}

View file

@ -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");
}
}

View file

@ -24,7 +24,7 @@ export class State {
// The singleton of the global state
public static state: State;
public static vNumber = "0.0.5b";
public static vNumber = "0.0.5c";
public static runningFromConsole: boolean = false;
@ -47,7 +47,7 @@ export class State {
*/
public bm;
/**
The user crednetials
The user credentials
*/
public osmConnection: OsmConnection;

View file

@ -44,14 +44,17 @@ export class MoreScreen extends UIElement {
const currentLocation = State.state.locationControl.data;
const linkText =
`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 =
new SubtleButton(layout.icon,
new Combine([
"<b>",
Translations.W(layout.title),
"</b>",
"<br/>",
Translations.W(layout.description),
description ?? "",
]), {url: linkText, newTab: false});
els.push(link)

View file

@ -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

View 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"
}

View file

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -7,6 +7,8 @@ import {LocalStorageSource} from "./Logic/Web/LocalStorageSource";
import {createHash} from "crypto";
import Combine from "./UI/Base/Combine";
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);
connection.AttemptLogin();
@ -16,7 +18,7 @@ const localStorage = LocalStorageSource.Get("last-custom-save");
console.log("hash", hash)
console.log("Saved: ", localStorage.data)
if (hash === undefined || hash === "") {
if (hash === undefined || hash === "" && localStorage.data !== undefined) {
const previous = localStorage.data.split("#");
hash = previous[1];
console.log("Using previously saved data ", hash)
@ -41,4 +43,9 @@ new Combine([
themeGenerator.themeObject.data.maintainer = connection.userDetails.data.name;
themeGenerator.themeObject.data.layers = [];
themeGenerator.themeObject.ping();
})]).AttachTo("preview");
}),
"<br/>",
"Version: ",
State.vNumber
]).AttachTo("preview");

View file

@ -1193,6 +1193,7 @@ form {
border-right:1px solid gray;
border-top: 1px solid gray;
border-bottom: 1px solid lightgray;
min-width: 4em;
}