"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Widths = void 0; var LayerDefinition_1 = require("../LayerDefinition"); var TagsFilter_1 = require("../../Logic/TagsFilter"); var TagRendering_1 = require("../TagRendering"); var Widths = /** @class */ (function (_super) { __extends(Widths, _super); function Widths(carWidth, cyclistWidth, pedestrianWidth) { var _this = _super.call(this) || this; _this._bothSideParking = new TagsFilter_1.Tag("parking:lane:both", "parallel"); _this._noSideParking = new TagsFilter_1.Tag("parking:lane:both", "no_parking"); _this._otherParkingMode = new TagsFilter_1.Or([ new TagsFilter_1.Tag("parking:lane:both", "perpendicular"), new TagsFilter_1.Tag("parking:lane:left", "perpendicular"), new TagsFilter_1.Tag("parking:lane:right", "perpendicular"), new TagsFilter_1.Tag("parking:lane:both", "diagonal"), new TagsFilter_1.Tag("parking:lane:left", "diagonal"), new TagsFilter_1.Tag("parking:lane:right", "diagonal"), ]); _this._leftSideParking = new TagsFilter_1.And([new TagsFilter_1.Tag("parking:lane:left", "parallel"), new TagsFilter_1.Tag("parking:lane:right", "no_parking")]); _this._rightSideParking = new TagsFilter_1.And([new TagsFilter_1.Tag("parking:lane:right", "parallel"), new TagsFilter_1.Tag("parking:lane:left", "no_parking")]); _this._sidewalkBoth = new TagsFilter_1.Tag("sidewalk", "both"); _this._sidewalkLeft = new TagsFilter_1.Tag("sidewalk", "left"); _this._sidewalkRight = new TagsFilter_1.Tag("sidewalk", "right"); _this._sidewalkNone = new TagsFilter_1.Tag("sidewalk", "none"); _this._oneSideParking = new TagsFilter_1.Or([_this._leftSideParking, _this._rightSideParking]); _this._carfree = new TagsFilter_1.Or([new TagsFilter_1.Tag("highway", "pedestrian"), new TagsFilter_1.Tag("highway", "living_street")]); _this._notCarFree = new TagsFilter_1.Not(_this._carfree); _this.carWidth = carWidth; _this.cyclistWidth = cyclistWidth; _this.pedestrianWidth = pedestrianWidth; _this.minzoom = 12; function r(n) { var pre = Math.floor(n); var post = Math.floor((n * 10) % 10); return "" + pre + "." + post; } _this.name = "widths"; _this.overpassFilter = new TagsFilter_1.Tag("width:carriageway", "*"); _this.title = new TagRendering_1.TagRenderingOptions({ freeform: { renderTemplate: "{name}", template: "$$$", key: "name" } }); var self = _this; _this.style = function (properties) { var c = "#f00"; var props = self.calcProps(properties); if (props.pedestrianFlowNeeded > 0) { c = "#fa0"; } if (props.width >= props.targetWidth || !props.cyclingAllowed) { c = "#0c0"; } if (!props.parkingStateKnown && properties["note:width:carriageway"] === undefined) { c = "#f0f"; } if (_this._carfree.matchesProperties(properties)) { c = "#aaa"; } // Mark probably wrong data if (props.width > 15) { c = "#f0f"; } var dashArray = undefined; if (props.onewayBike) { dashArray = [20, 8]; } return { icon: null, color: c, weight: 7, dashArray: dashArray }; }; _this.elementsToShow = [ new TagRendering_1.TagRenderingOptions({ question: "Mogen auto's hier parkeren?", mappings: [ { k: _this._bothSideParking, txt: "Auto's kunnen langs beide zijden parkeren.Dit gebruikt " + r(_this.carWidth * 2) + "m
" }, { k: _this._oneSideParking, txt: "Auto's kunnen langs één kant parkeren.
Dit gebruikt " + r(_this.carWidth) + "m
" }, { k: _this._otherParkingMode, txt: "Deze straat heeft dwarsparkeren of diagonaalparkeren aan minstens één zijde. Deze parkeerruimte is niet opgenomen in de straatbreedte." }, { k: _this._noSideParking, txt: "Auto's mogen hier niet parkeren" }, ], freeform: { key: "note:width:carriageway", renderTemplate: "{note:width:carriageway}", template: "$$$", } }).OnlyShowIf(_this._notCarFree), new TagRendering_1.TagRenderingOptions({ mappings: [ { k: _this._sidewalkNone, txt: "Deze straat heeft geen voetpaden. Voetgangers hebben hier " + r(_this.pedestrianWidth * 2) + "m nodig" }, { k: new TagsFilter_1.Or([_this._sidewalkLeft, _this._sidewalkRight]), txt: "Deze straat heeft een voetpad aan één kant. Voetgangers hebben hier " + r(_this.pedestrianWidth) + "m nodig" }, { k: _this._sidewalkBoth, txt: "Deze straat heeft voetpad aan beide zijden." }, ], freeform: { key: "note:width:carriageway", renderTemplate: "{note:width:carriageway}", template: "$$$", } }).OnlyShowIf(_this._notCarFree), new TagRendering_1.TagRenderingOptions({ mappings: [ { k: new TagsFilter_1.Tag("bicycle", "use_sidepath"), txt: "Er is een afgescheiden, verplicht te gebruiken fietspad. Fietsen op dit wegsegment hoeft dus niet" }, { k: new TagsFilter_1.Tag("bicycle", "no"), txt: "Fietsen is hier niet toegestaan" }, { k: new TagsFilter_1.Tag("oneway:bicycle", "yes"), txt: "Eenrichtingsverkeer, óók voor fietsers. Dit gebruikt " + r(_this.carWidth + _this.cyclistWidth) + "m" }, { k: new TagsFilter_1.And([new TagsFilter_1.Tag("oneway", "yes"), new TagsFilter_1.Tag("oneway:bicycle", "no")]), txt: "Tweerichtingverkeer voor fietsers, eenrichting voor auto's Dit gebruikt " + r(_this.carWidth + 2 * _this.cyclistWidth) + "m" }, { k: new TagsFilter_1.Tag("oneway", "yes"), txt: "Eenrichtingsverkeer voor iedereen. Dit gebruikt " + (_this.carWidth + _this.cyclistWidth) + "m" }, { k: null, txt: "Tweerichtingsverkeer voor iedereen. Dit gebruikt " + r(2 * _this.carWidth + 2 * _this.cyclistWidth) + "m" } ] }).OnlyShowIf(_this._notCarFree), new TagRendering_1.TagRenderingOptions({ tagsPreprocessor: function (tags) { var props = self.calcProps(tags); tags.targetWidth = r(props.targetWidth); tags.short = ""; if (props.width < props.targetWidth) { tags.short = "Er is dus " + r(props.targetWidth - props.width) + "m te weinig"; } }, freeform: { key: "width:carriageway", renderTemplate: "De totale nodige ruimte voor vlot en veilig verkeer is dus {targetWidth}m
" + "{short}", template: "$$$", } }).OnlyShowIf(_this._notCarFree), new TagRendering_1.TagRenderingOptions({ mappings: [ { k: new TagsFilter_1.Tag("highway", "living_street"), txt: "Dit is een woonerf" }, { k: new TagsFilter_1.Tag("highway", "pedestrian"), txt: "Deze weg is autovrij" } ] }), new TagRendering_1.TagRenderingOptions({ mappings: [ { k: new TagsFilter_1.Tag("sidewalk", "none"), txt: "De afstand van huis tot huis is {width:carriageway}m" }, { k: new TagsFilter_1.Tag("sidewalk", "left"), txt: "De afstand van huis tot voetpad is {width:carriageway}m" }, { k: new TagsFilter_1.Tag("sidewalk", "right"), txt: "De afstand van huis tot voetpad is {width:carriageway}m" }, { k: new TagsFilter_1.Tag("sidewalk", "both"), txt: "De afstand van voetpad tot voetpad is {width:carriageway}m" }, { k: new TagsFilter_1.Tag("sidewalk", ""), txt: "De straatbreedte is {width:carriageway}m" } ] }) ]; return _this; } Widths.prototype.calcProps = function (properties) { var parkingStateKnown = true; var parallelParkingCount = 0; if (this._oneSideParking.matchesProperties(properties)) { parallelParkingCount = 1; } else if (this._bothSideParking.matchesProperties(properties)) { parallelParkingCount = 2; } else if (this._noSideParking.matchesProperties(properties)) { parallelParkingCount = 0; } else if (this._otherParkingMode.matchesProperties(properties)) { parallelParkingCount = 0; } else { parkingStateKnown = false; console.log("No parking data for ", properties.name, properties.id, properties); } var pedestrianFlowNeeded = 0; if (this._sidewalkBoth.matchesProperties(properties)) { pedestrianFlowNeeded = 0; } else if (this._sidewalkNone.matchesProperties(properties)) { pedestrianFlowNeeded = 2; } else if (this._sidewalkLeft.matchesProperties(properties) || this._sidewalkRight.matches(properties)) { pedestrianFlowNeeded = 1; } else { pedestrianFlowNeeded = -1; } var onewayCar = properties.oneway === "yes"; var onewayBike = properties["oneway:bicycle"] === "yes" || (onewayCar && properties["oneway:bicycle"] === undefined); var cyclingAllowed = !(properties.bicycle === "use_sidepath" || properties.bicycle === "no"); var carWidth = (onewayCar ? 1 : 2) * this.carWidth; var cyclistWidth = 0; if (cyclingAllowed) { cyclistWidth = (onewayBike ? 1 : 2) * this.cyclistWidth; } var width = parseFloat(properties["width:carriageway"]); var targetWidth = carWidth + cyclistWidth + Math.max(0, pedestrianFlowNeeded) * this.pedestrianWidth + parallelParkingCount * this.carWidth; return { parkingLanes: parallelParkingCount, parkingStateKnown: parkingStateKnown, width: width, targetWidth: targetWidth, onewayBike: onewayBike, pedestrianFlowNeeded: pedestrianFlowNeeded, cyclingAllowed: cyclingAllowed }; }; return Widths; }(LayerDefinition_1.LayerDefinition)); exports.Widths = Widths;