One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.
OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.
Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.
",
- "search": {
- "search": "Search a location",
- "searching": "Searching…",
- "nothing": "Nothing found…",
- "error": "Something went wrong…"
+ "split": {
+ "split": "Split",
+ "cancel": "Cancel",
+ "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.",
+ "loginToSplit": "You must be logged in to split a road",
+ "splitTitle": "Choose on the map where to split this road",
+ "hasBeenSplit": "This way has been split"
},
- "returnToTheMap": "Return to the map",
- "save": "Save",
- "cancel": "Cancel",
- "skip": "Skip this question",
- "oneSkippedQuestion": "One question is skipped",
- "skippedQuestions": "Some questions are skipped",
- "number": "number",
- "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options",
- "add": {
- "addNewMapLabel": "Add new item",
- "disableFiltersExplanation": "Some features might be hidden by a filter",
- "disableFilters": "Disable all filters",
- "addNew": "Add a new {category} here",
- "presetInfo": "The new POI will have {tags}",
- "warnVisibleForEveryone": "Your addition will be visible for everyone",
- "title": "Add a new point?",
- "intro": "You clicked somewhere where no data is known yet. ",
- "pleaseLogin": "Please log in to add a new point",
- "zoomInFurther": "Zoom in further to add a point.",
- "stillLoading": "The data is still loading. Please wait a bit before you add a new point.",
- "confirmIntro": "
Add a {title} here?
The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.",
- "confirmButton": "Add a {category} here.
Your addition is visible for everyone
",
- "openLayerControl": "Open the layer control box",
- "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point",
- "hasBeenImported": "This point has already been imported",
- "importTags": "The element will receive {tags}",
- "zoomInMore": "Zoom in more to import this feature",
- "wrongType": "This element is not a point or a way and can not be imported"
- },
- "pickLanguage": "Choose a language: ",
- "about": "Easily edit and add OpenStreetMap for a certain theme",
- "nameInlineQuestion": "The name of this {category} is $$$",
- "noNameCategory": "{category} without a name",
- "questions": {
- "phoneNumberOf": "What is the phone number of {category}?",
- "phoneNumberIs": "The phone number of this {category} is {phone}",
- "websiteOf": "What is the website of {category}?",
- "websiteIs": "Website: {website}",
- "emailOf": "What is the email address of {category}?",
- "emailIs": "The email address of this {category} is {email}"
- },
- "morescreen": {
- "intro": "
More thematic maps?
Do you enjoy collecting geodata? There are more themes available.",
- "requestATheme": "If you want a custom-built theme, request it in the issue tracker",
- "streetcomplete": "Another, similar application is StreetComplete.",
- "createYourOwnTheme": "Create your own MapComplete theme from scratch",
- "previouslyHiddenTitle": "Previously visited hidden themes",
- "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes."
- },
- "sharescreen": {
- "intro": "
Share this map
Share this map by copying the link below and sending it to friends and family:",
- "addToHomeScreen": "
Add to your home screen
You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.",
- "embedIntro": "
Embed on your website
Please, embed this map into your website. We encourage you to do it - you don't even have to ask permission. It is free, and always will be. The more people are using this, the more valuable it becomes.",
- "copiedToClipboard": "Link copied to clipboard",
- "thanksForSharing": "Thanks for sharing!",
- "editThisTheme": "Edit this theme",
- "editThemeDescription": "Add or change questions to this map theme",
- "fsUserbadge": "Enable the login button",
- "fsSearch": "Enable the search bar",
- "fsWelcomeMessage": "Show the welcome message popup and associated tabs",
- "fsLayers": "Enable the layer control",
- "fsLayerControlToggle": "Start with the layer control expanded",
- "fsAddNew": "Enable the 'add new POI' button",
- "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)",
- "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}",
- "fsIncludeCurrentLayers": "Include the current layer choices",
- "fsIncludeCurrentLocation": "Include current location"
- },
- "attribution": {
- "attributionTitle": "Attribution notice",
- "attributionContent": "
",
- "themeBy": "Theme maintained by {author}",
- "iconAttribution": {
- "title": "Used icons"
- },
- "mapContributionsBy": "The current visible data has edits made by {contributors}",
- "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors",
- "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors",
- "openOsmcha": "See latest edits made with {theme}",
- "openMapillary": "Open Mapillary here",
- "openIssueTracker": "File a bug",
- "josmOpened": "JOSM is opened",
- "josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled",
- "editJosm": "Edit here with JOSM",
- "editId": "Open the OpenStreetMap online editor here",
- "donate": "Support MapComplete financially"
- },
- "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.",
- "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.",
- "goToInbox": "Open inbox",
- "removeLocationHistory": "Delete the location history",
- "getStartedLogin": "Log in with OpenStreetMap to get started",
- "getStartedNewAccount": " or create a new account",
- "noTagsSelected": "No tags selected",
- "testing": "Testing - changes won't be saved",
- "customThemeIntro": "
Custom themes
These are previously visited user-generated themes.",
- "aboutMapcomplete": "
About MapComplete
Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.
Find out more
MapComplete always offers the next step to learn more about OpenStreetMap.
When embedded in a website, the iframe links to a full-screen MapComplete
The fullscreen version offers info about OpenStreetMap
Viewing works without login, but editing requires an OSM account.
If you are not logged in, you are asked to do so
Once you answered a single question, you can add new points to the map
After a while, actual OSM-tags are shown, later linking to the wiki
Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.
Want to see your progress? Follow the edit count on OsmCha.
",
- "backgroundMap": "Background map",
- "openTheMap": "Open the map",
- "loginOnlyNeededToEdit": "if you want to edit the map",
- "layerSelection": {
- "zoomInToSeeThisLayer": "Zoom in to see this layer",
- "title": "Select layers"
- },
- "download": {
- "title": "Download visible data",
- "downloadAsPdf": "Download a PDF of the current map",
- "downloadAsPdfHelper": "Ideal to print the current map",
- "downloadGeojson": "Download visible data as GeoJSON",
- "downloadGpx": "Download as GPX-file",
- "downloadGpxHelper": "A GPX-file can be used with most navigation devices and applications",
- "uploadGpx": "Upload your track to OpenStreetMap",
- "exporting": "Exporting…",
- "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …",
- "downloadCSV": "Download visible data as CSV",
- "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …",
- "includeMetaData": "Include metadata (last editor, calculated values, …)",
- "licenseInfo": "
Copyright notice
The provided data is available under ODbL. Reusing it is gratis for any purpose, but
Please read the full copyright notice for details.",
- "noDataLoaded": "No data is loaded yet. Download will be available soon"
- },
- "weekdays": {
- "abbreviations": {
- "monday": "Mon",
- "tuesday": "Tue",
- "wednesday": "Wed",
- "thursday": "Thu",
- "friday": "Fri",
- "saturday": "Sat",
- "sunday": "Sun"
- },
- "monday": "Monday",
- "tuesday": "Tuesday",
- "wednesday": "Wednesday",
- "thursday": "Thursday",
- "friday": "Friday",
- "saturday": "Saturday",
- "sunday": "Sunday"
- },
- "opening_hours": {
- "error_loading": "Error: could not visualize these opening hours.",
- "open_during_ph": "During a public holiday, this is",
- "opensAt": "from",
- "openTill": "till",
- "not_all_rules_parsed": "These opening hours are complicated. The following rules are ignored in the input element:",
- "closed_until": "Closed until {date}",
- "closed_permanently": "Closed for an unkown duration",
- "open_24_7": "Opened around the clock",
- "ph_not_known": " ",
- "ph_closed": "closed",
- "ph_open": "opened",
- "ph_open_as_usual": "opened as usual",
- "loadingCountry": "Determining country…"
- },
- "histogram": {
- "error_loading": "Could not load the histogram"
- },
- "wikipedia": {
- "wikipediaboxTitle": "Wikipedia",
- "failed": "Loading the Wikipedia entry failed",
- "loading": "Loading Wikipedia...",
- "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.",
- "searchWikidata": "Search on Wikidata",
- "noResults": "Nothing found for {search}",
- "doSearch": "Search above to see results",
- "createNewWikidata": "Create a new Wikidata item"
- },
- "apply_button": {
- "isApplied": "The changes are applied",
- "appliedOnAnotherObject": "The object {id} will receive {tags}"
- }
- },
- "favourite": {
- "panelIntro": "
Your personal theme
Activate your favourite layers from all the official themes",
- "loginNeeded": "
Log in
A personal layout is only available for OpenStreetMap users",
- "reload": "Reload the data"
- },
- "reviews": {
- "title": "{count} reviews",
- "title_singular": "One review",
- "name_required": "A name is required in order to display and create reviews",
- "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!",
- "write_a_comment": "Leave a review…",
- "no_rating": "No rating given",
- "posting_as": "Posting as",
- "i_am_affiliated": "I am affiliated with this object Check if you are an owner, creator, employee, …",
- "affiliated_reviewer_warning": "(Affiliated review)",
- "saving_review": "Saving…",
- "saved": "Review saved. Thanks for sharing!",
- "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews",
- "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.",
- "plz_login": "Log in to leave a review"
- },
- "multi_apply": {
- "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too"
- },
- "move": {
- "loginToMove": "You must be logged in to move a point",
- "inviteToMoveAgain": "Move this point again",
- "moveTitle": "Move this point",
- "whyMove": "Why do you want to move this point?",
- "confirmMove": "Move here",
- "pointIsMoved": "The point has been moved",
- "zoomInFurther": "Zoom in further to confirm this move",
- "selectReason": "Why do you move this object?",
- "reasons": {
- "reasonRelocation": "The object has been relocated to a totally different location",
- "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter"
- },
- "inviteToMove": {
- "generic": "Move this point",
- "reasonInaccurate": "Improve the accuracy of this point",
- "reasonRelocation": "Move this object to a another place because it has relocated"
- },
- "cannotBeMoved": "This feature cannot be moved.",
- "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.",
- "isRelation": "This feature is a relation and can not be moved",
- "partOfAWay": "This feature is part of another way. Use another editor to move it.",
- "partOfRelation": "This feature is part of a relation. Use another editor to move it.",
- "cancel": "Cancel move"
- },
- "privacy": {
- "title": "Privacy policy",
- "intro": "Privacy is important - for both the individual and for society. MapComplete tries to respect your privacy as much as possible - up to the point no annoying cookie banner is needed. However, we still would like to inform you which information is gathered and shared, under which circumstances and why these trade-offs are made.",
- "trackingTitle": "Statistical data",
- "tracking": "To gather some insight in whom visits our website, some technical information is collected. This is included the country you visited the webpage from, which website referred you to MapComplete, the type of your device and the screensize. A coockie is placed on your device to indicate that you visited MapComplete earlier today. This data is not detailed enough to personally identify you. These statistics are only available to anyone in aggregate and are publicly available to anyone",
- "geodataTitle": "Your geolocation",
- "geodata": "When MapComplete gets your geolocation, your geolocation and previously visited locations stay on your device. Your location data is never automatically sent to anywhere else - unless some (future) functionality clearly states otherwise.",
- "editingTitle": "When making changes",
- "editing": "When you make a change to the map, this change is recorded on OpenStreetMap and is publicly available to anyone. A changeset made with MapComplete includes the following data:
The changes you made
Your username
When this change is made
The theme you used while making the change
The language of the user interface
An indication of how close you were to changed objects. Other mappers can use this information to determine if a change was made based on survey or on remote research
Please refer to the privacy policy on OpenStreetMap.org for detailed information. We'd like to remind you that you can use a fictional name when signing up.",
- "miscCookiesTitle": "Other cookies",
- "miscCookies": "MapComplete integrates with various other services, especially to load images of features. Images are hosted on various third-party servers, which might set cookies on their own.",
- "whileYoureHere": "Do you care about privacy?",
- "surveillance": "As you are reading the privacy policy, you probably care about privacy - so do we! We even made a theme showing surveillance cameras. Feel free to map them all!"
- },
- "professional": {
- "backToMapcomplete": "Back to the theme overview",
- "title": "Professional support with MapComplete",
- "intro": "The developer of MapComplete offers professional support. This document outlines some of the possibilities, common questions and the boundaries of MapComplete",
- "osmTitle": "What can OpenStreetMap and MapComplete do for your organisation?",
- "text0": "
Maintaining a set of up-to-date geodata is hard, error prone and expensive. To add insult to injury, many organizations end up collecting the same data independently - resulting in duplicated efforts, non-standardized data formats and many incomplete, unmaintained datasets.
At the same time, there is a huge community which gathers a lot of geodata into one shared, global and standardized database - namely OpenStreetMap.org.
",
- "text1": "
MapComplete is the editor to make contributing data to OpenStreetMap easy.
",
- "aboutOsm": {
- "aboutOsm": {
- "title": "What is OpenStreetMap?",
- "intro": "OpenStreetMap is a shared, global database, built by volunteers. All geodata can be contributed to OpenStreetMap, as long as it can be verified on the ground. OpenStreetMap has grown to be a very broad and deep dataset as it contains data over thousands of categories of objects.An individual object might also have a ton of attributes, bringing a lot of nuance, e.g.:",
- "li0": "Streets have geometry, but might also have information about the maxspeed, surface, wether they are lit, their name, a link to Wikipedia, a link to what they are named after, which hiking-, cycle- and busroutes run over theme",
- "li1": "Shops and other amenities might have opening hours, a phone number, a link to the website, which payment methods are supported, what they sell, which services they offer, ...",
- "li2": "Toilets might have information about wheelchair accessibility, a changing table, if payment is needed, ...",
- "li3": "and much, much more..."
- },
- "benefits": {
- "title": "Benefits of the OSM-ecosystem",
- "intro": "It can be very hard to leave your own dataset behind, as building this dataset often took a lot of time and effort. However, the benefits of switching over to OSM are huge:",
- "li0": "You are not alone anymore to gather and maintain this dataset - a whole community is at your side",
- "li1": "Your data will reach a bigger audience then ever via Bing Maps, Apple Maps, Facebook, Instagram, Pokemon Go, OsmAnd, Organic Maps, Maps.me, Mapbox, Komoot, nearly all cycle-applications, ...",
- "li2": "Many governement organisations and municipalities use OpenStreetMap on their websites too"
- },
- "license": {
- "title": "The license",
- "intro": "OpenStreetMap is licensed under the Open Database License. The full copyright text can be summarized as following:",
- "li0": "A product using OpenStreetMap data must give attribution.",
- "li1": "OpenStreetMap-data must remain open. This means that data of a map containing OpenStreetMap data can be copied again.",
- "outro": "The license has a few implications - these are explained below."
- },
- "vandalism": {
- "title": "What about vandalism?",
- "intro": "As anyone can edit the data, it is indeed possible that a malicious change is made. However, this is extremely rare for a few reasons:",
- "li0": "the technical barrier to make changes is high",
- "li1": "a small malicious change has low impact, thus little reward for a vandal",
- "li2": "a high impact change is quickly noticed and reverted since so many people use this data",
- "li3": "all changes are tracked and tied to a single user. A repeating offender is quickly banned",
- "li4": "In Belgium (and some other countries), the first edit by a new contributor is systematically checked and corrected if needed."
- }
- },
- "aboutMc": {
- "title": "Using MapComplete in your organization",
- "text0": "If an existing MapComplete theme is what you, feel free to use it or embed it on your website. Embedding the public themes is free and always will be.",
- "text1": "Do you need some other data, but does the theme not exist yet? The MapComplete-developers can build it for you on a decent budget. Get in touch via email, github or send a message via osm.org",
- "text2": "If you still feel unsure, the possibilities are outlined below. Additionally, some common questions are answered",
- "layers": {
- "title": "What data can be shown with MapComplete?",
- "intro": "
MapComplete has a powerful templating system, which allows to quickly create a map showing precisely those features that you need and showing relevant attributes in the popups.
This data can be fetched from OpenStreetMap directly, but MapComplete can also use external datasets - e.g. to compare OpenStreetMap with another dataset or to show data that is not suited for OpenStreetMap (planned activities, statistics, ...)"
- },
- "survey": {
- "title": "Survey possibilities",
- "intro": "
MapComplete is an easy to use survey tool. It is ideal to collect the necessary in a few clicks, both on desktop and on mobile. This data is contributed directly into OpenStreetMap.
We can setup a custom survey tool, asking precisely the data you need in a future-proof way.
Do you have a dataset that has to be (re)surveyed? This is the perfect moment to make the switch to OpenStreetMap.MapComplete can show your dataset and OpenStreetMap at the same time, making it easier to visit all the locations and to see what the community already contributed.
\n"
- },
- "internalUse": {
- "title": "Using the data in internal processes",
- "intro": "
Once the data is in OpenStreetMap, you'll probably want to use the data as well. Your MapComplete theme can have a convenient export-button, offering to download the data in many open formats usable in QGis, ArcGis, Excel, LibreOffice-calc, ...
Someone with basic spreadsheet-skills can thus easily create graphs and insights about the data, whereas the GIS-experts within your organisation can easily work with this data in their preferred application.
If an automated setup is needed, a free-to-use, community-run API is available.
"
- }
- },
- "services": {
- "title": "MapComplete services",
- "intro": "The developer of MapComplete can help you with the following services:",
- "li0": "Setting up a theme tailored for your need",
- "li1": "Help with setting up the internal data flow to integrate OpenStreetMap",
- "li2": "Training on how to contribute data with MapComplete",
- "li3": "Advanced training (e.g. for the GIS-team) on how to add advanced data to OpenStreetMap",
- "li4": "Training on how to download filtered data from OpenStreetMap",
- "outro": "These services are offered at competitive prices. A simple theme without extra support can be setup for as little €2000, and a small additional yearly hosting cost."
- },
- "drawbacks": {
- "title": "A few drawbacks to keep in mind",
- "intro": "While joining this community has tremendous benefits, there are a few topics to carefully consider.",
- "unsuitedData": {
- "title": "Data not suited for OpenStreetMap",
- "intro": "The basic rule for OpenStreetMap is that all data must be verifiable on the ground and are somewhat permanent. This implies that some data cannot be sent to OpenStreetMap directly - but some workarounds exist.",
- "li0": "Subjective data (such as reviews) are not suited for OpenStreetMap. However, MapComplete has an integration with Mangrove.reviews, an openly licensed review website",
- "li1": "Events of a few days, road works that are planned next month are thus not recorded, neither are road works which only last a few days.",
- "li2": "Temporal data (e.g. statistics of air quality, traffic intensity, ...) can not stored on OpenStreetMap as they are hard to verify by a volunteer. Note that, if this data is available elsewhere, it can still be visualized within MapComplete as extra layer."
- },
- "licenseNuances": {
- "title": "Implications of ODbL: some use cases",
- "intro": "OpenStreetMap is licensed unter the Open Database License which states that:",
- "li0": "All data can be reused for any purpose - including commercial purposes",
- "li1": "Applications or products using OpenStreetMap should give a clear copyright notice",
- "li2": "Any dataset or product which contains OpenStreetMap-data must be republished under ODbL too, including modifications to this dataset and in a usable format.",
- "outro": "This has a few implications which should be considered for some usecases, as explained below",
- "usecaseMapDifferentSources": {
- "title": "Creating a map from different sources",
- "intro": "
For example, one could make a map with all benches in some city, based on the benches known by OpenStreetMap. This printed map needs a clear statement that the map data is based on OpenStreetMap. Selling these maps is permitted.If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap.
This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.
If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap. This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.
Of course, a map with only benches can be boring. The mapmaker might also decide to add in a layer with shops, possibly sourced from another geodata provider under another license. This is permitted to, if the map clearly states that the benches are sourced from OSM (under ODBL) and the shops have a different source (eventually with an all rights reserved).
However, mixing two datasets into one undistinguishible layer might not be permitted. For example, the mapmaker migth find that OSM has excellent data on benches in one part of the city and the closed-source provider might have excellent data on benches in another part of the city, merging these datasets into one could be problematic:
One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.
OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.
Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.
",
+ "search": {
+ "search": "Search a location",
+ "searching": "Searching…",
+ "nothing": "Nothing found…",
+ "error": "Something went wrong…"
+ },
+ "returnToTheMap": "Return to the map",
+ "save": "Save",
+ "cancel": "Cancel",
+ "skip": "Skip this question",
+ "oneSkippedQuestion": "One question is skipped",
+ "skippedQuestions": "Some questions are skipped",
+ "number": "number",
+ "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options",
+ "add": {
+ "addNewMapLabel": "Click here to add a new item",
+ "disableFiltersExplanation": "Some features might be hidden by a filter",
+ "disableFilters": "Disable all filters",
+ "addNew": "Add a new {category} here",
+ "presetInfo": "The new POI will have {tags}",
+ "warnVisibleForEveryone": "Your addition will be visible for everyone",
+ "title": "Add a new point?",
+ "intro": "You clicked somewhere where no data is known yet. ",
+ "pleaseLogin": "Please log in to add a new point",
+ "zoomInFurther": "Zoom in further to add a point.",
+ "stillLoading": "The data is still loading. Please wait a bit before you add a new point.",
+ "confirmIntro": "
Add a {title} here?
The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.",
+ "confirmButton": "Add a {category} here.
Your addition is visible for everyone
",
+ "openLayerControl": "Open the layer control box",
+ "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point",
+ "hasBeenImported": "This point has already been imported",
+ "importTags": "The element will receive {tags}",
+ "zoomInMore": "Zoom in more to import this feature",
+ "wrongType": "This element is not a point or a way and can not be imported"
+ },
+ "pickLanguage": "Choose a language: ",
+ "about": "Easily edit and add OpenStreetMap for a certain theme",
+ "nameInlineQuestion": "The name of this {category} is $$$",
+ "noNameCategory": "{category} without a name",
+ "questions": {
+ "phoneNumberOf": "What is the phone number of {category}?",
+ "phoneNumberIs": "The phone number of this {category} is {phone}",
+ "websiteOf": "What is the website of {category}?",
+ "websiteIs": "Website: {website}",
+ "emailOf": "What is the email address of {category}?",
+ "emailIs": "The email address of this {category} is {email}"
+ },
+ "morescreen": {
+ "intro": "
More thematic maps?
Do you enjoy collecting geodata? There are more themes available.",
+ "requestATheme": "If you want a custom-built theme, request it in the issue tracker",
+ "streetcomplete": "Another, similar application is StreetComplete.",
+ "createYourOwnTheme": "Create your own MapComplete theme from scratch",
+ "previouslyHiddenTitle": "Previously visited hidden themes",
+ "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes."
+ },
+ "sharescreen": {
+ "intro": "
Share this map
Share this map by copying the link below and sending it to friends and family:",
+ "addToHomeScreen": "
Add to your home screen
You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.",
+ "embedIntro": "
Embed on your website
Please, embed this map into your website. We encourage you to do it - you don't even have to ask permission. It is free, and always will be. The more people are using this, the more valuable it becomes.",
+ "copiedToClipboard": "Link copied to clipboard",
+ "thanksForSharing": "Thanks for sharing!",
+ "editThisTheme": "Edit this theme",
+ "editThemeDescription": "Add or change questions to this map theme",
+ "fsUserbadge": "Enable the login button",
+ "fsSearch": "Enable the search bar",
+ "fsWelcomeMessage": "Show the welcome message popup and associated tabs",
+ "fsLayers": "Enable the layer control",
+ "fsLayerControlToggle": "Start with the layer control expanded",
+ "fsAddNew": "Enable the 'add new POI' button",
+ "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)",
+ "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}",
+ "fsIncludeCurrentLayers": "Include the current layer choices",
+ "fsIncludeCurrentLocation": "Include current location"
+ },
+ "attribution": {
+ "attributionTitle": "Attribution notice",
+ "attributionContent": "
",
+ "themeBy": "Theme maintained by {author}",
+ "iconAttribution": {
+ "title": "Used icons"
+ },
+ "mapContributionsBy": "The current visible data has edits made by {contributors}",
+ "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors",
+ "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors",
+ "openOsmcha": "See latest edits made with {theme}",
+ "openMapillary": "Open Mapillary here",
+ "openIssueTracker": "File a bug",
+ "josmOpened": "JOSM is opened",
+ "josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled",
+ "editJosm": "Edit here with JOSM",
+ "editId": "Open the OpenStreetMap online editor here",
+ "donate": "Support MapComplete financially"
+ },
+ "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.",
+ "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.",
+ "goToInbox": "Open inbox",
+ "removeLocationHistory": "Delete the location history",
+ "getStartedLogin": "Log in with OpenStreetMap to get started",
+ "getStartedNewAccount": " or create a new account",
+ "noTagsSelected": "No tags selected",
+ "testing": "Testing - changes won't be saved",
+ "customThemeIntro": "
Custom themes
These are previously visited user-generated themes.",
+ "aboutMapcomplete": "
About MapComplete
Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.
Find out more
MapComplete always offers the next step to learn more about OpenStreetMap.
When embedded in a website, the iframe links to a full-screen MapComplete
The fullscreen version offers info about OpenStreetMap
Viewing works without login, but editing requires an OSM account.
If you are not logged in, you are asked to do so
Once you answered a single question, you can add new points to the map
After a while, actual OSM-tags are shown, later linking to the wiki
Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.
Want to see your progress? Follow the edit count on OsmCha.
",
+ "backgroundMap": "Background map",
+ "openTheMap": "Open the map",
+ "loginOnlyNeededToEdit": "if you want to edit the map",
+ "layerSelection": {
+ "zoomInToSeeThisLayer": "Zoom in to see this layer",
+ "title": "Select layers"
+ },
+ "download": {
+ "title": "Download visible data",
+ "downloadAsPdf": "Download a PDF of the current map",
+ "downloadAsPdfHelper": "Ideal to print the current map",
+ "downloadGeojson": "Download visible data as GeoJSON",
+ "downloadGpx": "Download as GPX-file",
+ "downloadGpxHelper": "A GPX-file can be used with most navigation devices and applications",
+ "uploadGpx": "Upload your track to OpenStreetMap",
+ "exporting": "Exporting…",
+ "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …",
+ "downloadCSV": "Download visible data as CSV",
+ "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …",
+ "includeMetaData": "Include metadata (last editor, calculated values, …)",
+ "licenseInfo": "
Copyright notice
The provided data is available under ODbL. Reusing it is gratis for any purpose, but
Please read the full copyright notice for details.",
+ "noDataLoaded": "No data is loaded yet. Download will be available soon"
+ },
+ "weekdays": {
+ "abbreviations": {
+ "monday": "Mon",
+ "tuesday": "Tue",
+ "wednesday": "Wed",
+ "thursday": "Thu",
+ "friday": "Fri",
+ "saturday": "Sat",
+ "sunday": "Sun"
+ },
+ "monday": "Monday",
+ "tuesday": "Tuesday",
+ "wednesday": "Wednesday",
+ "thursday": "Thursday",
+ "friday": "Friday",
+ "saturday": "Saturday",
+ "sunday": "Sunday"
+ },
+ "opening_hours": {
+ "error_loading": "Error: could not visualize these opening hours.",
+ "open_during_ph": "During a public holiday, this is",
+ "opensAt": "from",
+ "openTill": "till",
+ "not_all_rules_parsed": "These opening hours are complicated. The following rules are ignored in the input element:",
+ "closed_until": "Closed until {date}",
+ "closed_permanently": "Closed for an unkown duration",
+ "open_24_7": "Opened around the clock",
+ "ph_not_known": " ",
+ "ph_closed": "closed",
+ "ph_open": "opened",
+ "ph_open_as_usual": "opened as usual",
+ "loadingCountry": "Determining country…"
+ },
+ "histogram": {
+ "error_loading": "Could not load the histogram"
+ },
+ "wikipedia": {
+ "wikipediaboxTitle": "Wikipedia",
+ "failed": "Loading the Wikipedia entry failed",
+ "loading": "Loading Wikipedia...",
+ "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.",
+ "searchWikidata": "Search on Wikidata",
+ "noResults": "Nothing found for {search}",
+ "doSearch": "Search above to see results",
+ "createNewWikidata": "Create a new Wikidata item"
+ },
+ "apply_button": {
+ "isApplied": "The changes are applied",
+ "appliedOnAnotherObject": "The object {id} will receive {tags}"
+ }
+ },
+ "favourite": {
+ "panelIntro": "
Your personal theme
Activate your favourite layers from all the official themes",
+ "loginNeeded": "
Log in
A personal layout is only available for OpenStreetMap users",
+ "reload": "Reload the data"
+ },
+ "reviews": {
+ "title": "{count} reviews",
+ "title_singular": "One review",
+ "name_required": "A name is required in order to display and create reviews",
+ "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!",
+ "write_a_comment": "Leave a review…",
+ "no_rating": "No rating given",
+ "posting_as": "Posting as",
+ "i_am_affiliated": "I am affiliated with this object Check if you are an owner, creator, employee, …",
+ "affiliated_reviewer_warning": "(Affiliated review)",
+ "saving_review": "Saving…",
+ "saved": "Review saved. Thanks for sharing!",
+ "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews",
+ "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.",
+ "plz_login": "Log in to leave a review"
+ },
+ "multi_apply": {
+ "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too"
+ },
+ "move": {
+ "loginToMove": "You must be logged in to move a point",
+ "inviteToMoveAgain": "Move this point again",
+ "moveTitle": "Move this point",
+ "whyMove": "Why do you want to move this point?",
+ "confirmMove": "Move here",
+ "pointIsMoved": "The point has been moved",
+ "zoomInFurther": "Zoom in further to confirm this move",
+ "selectReason": "Why do you move this object?",
+ "reasons": {
+ "reasonRelocation": "The object has been relocated to a totally different location",
+ "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter"
+ },
+ "inviteToMove": {
+ "generic": "Move this point",
+ "reasonInaccurate": "Improve the accuracy of this point",
+ "reasonRelocation": "Move this object to a another place because it has relocated"
+ },
+ "cannotBeMoved": "This feature cannot be moved.",
+ "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.",
+ "isRelation": "This feature is a relation and can not be moved",
+ "partOfAWay": "This feature is part of another way. Use another editor to move it.",
+ "partOfRelation": "This feature is part of a relation. Use another editor to move it.",
+ "cancel": "Cancel move"
+ },
+ "privacy": {
+ "title": "Privacy policy",
+ "intro": "Privacy is important - for both the individual and for society. MapComplete tries to respect your privacy as much as possible - up to the point no annoying cookie banner is needed. However, we still would like to inform you which information is gathered and shared, under which circumstances and why these trade-offs are made.",
+ "trackingTitle": "Statistical data",
+ "tracking": "To gather some insight in whom visits our website, some technical information is collected. This is included the country you visited the webpage from, which website referred you to MapComplete, the type of your device and the screensize. A coockie is placed on your device to indicate that you visited MapComplete earlier today. This data is not detailed enough to personally identify you. These statistics are only available to anyone in aggregate and are publicly available to anyone",
+ "geodataTitle": "Your geolocation",
+ "geodata": "When MapComplete gets your geolocation, your geolocation and previously visited locations stay on your device. Your location data is never automatically sent to anywhere else - unless some (future) functionality clearly states otherwise.",
+ "editingTitle": "When making changes",
+ "editing": "When you make a change to the map, this change is recorded on OpenStreetMap and is publicly available to anyone. A changeset made with MapComplete includes the following data:
The changes you made
Your username
When this change is made
The theme you used while making the change
The language of the user interface
An indication of how close you were to changed objects. Other mappers can use this information to determine if a change was made based on survey or on remote research
Please refer to the privacy policy on OpenStreetMap.org for detailed information. We'd like to remind you that you can use a fictional name when signing up.",
+ "miscCookiesTitle": "Other cookies",
+ "miscCookies": "MapComplete integrates with various other services, especially to load images of features. Images are hosted on various third-party servers, which might set cookies on their own.",
+ "whileYoureHere": "Do you care about privacy?",
+ "surveillance": "As you are reading the privacy policy, you probably care about privacy - so do we! We even made a theme showing surveillance cameras. Feel free to map them all!"
+ },
+ "professional": {
+ "backToMapcomplete": "Back to the theme overview",
+ "title": "Professional support with MapComplete",
+ "intro": "The developer of MapComplete offers professional support. This document outlines some of the possibilities, common questions and the boundaries of MapComplete",
+ "osmTitle": "What can OpenStreetMap and MapComplete do for your organisation?",
+ "text0": "
Maintaining a set of up-to-date geodata is hard, error prone and expensive. To add insult to injury, many organizations end up collecting the same data independently - resulting in duplicated efforts, non-standardized data formats and many incomplete, unmaintained datasets.
At the same time, there is a huge community which gathers a lot of geodata into one shared, global and standardized database - namely OpenStreetMap.org.
",
+ "text1": "
MapComplete is the editor to make contributing data to OpenStreetMap easy.
",
+ "aboutOsm": {
+ "aboutOsm": {
+ "title": "What is OpenStreetMap?",
+ "intro": "OpenStreetMap is a shared, global database, built by volunteers. All geodata can be contributed to OpenStreetMap, as long as it can be verified on the ground. OpenStreetMap has grown to be a very broad and deep dataset as it contains data over thousands of categories of objects.An individual object might also have a ton of attributes, bringing a lot of nuance, e.g.:",
+ "li0": "Streets have geometry, but might also have information about the maxspeed, surface, wether they are lit, their name, a link to Wikipedia, a link to what they are named after, which hiking-, cycle- and busroutes run over theme",
+ "li1": "Shops and other amenities might have opening hours, a phone number, a link to the website, which payment methods are supported, what they sell, which services they offer, ...",
+ "li2": "Toilets might have information about wheelchair accessibility, a changing table, if payment is needed, ...",
+ "li3": "and much, much more..."
+ },
+ "benefits": {
+ "title": "Benefits of the OSM-ecosystem",
+ "intro": "It can be very hard to leave your own dataset behind, as building this dataset often took a lot of time and effort. However, the benefits of switching over to OSM are huge:",
+ "li0": "You are not alone anymore to gather and maintain this dataset - a whole community is at your side",
+ "li1": "Your data will reach a bigger audience then ever via Bing Maps, Apple Maps, Facebook, Instagram, Pokemon Go, OsmAnd, Organic Maps, Maps.me, Mapbox, Komoot, nearly all cycle-applications, ...",
+ "li2": "Many governement organisations and municipalities use OpenStreetMap on their websites too"
+ },
+ "license": {
+ "title": "The license",
+ "intro": "OpenStreetMap is licensed under the Open Database License. The full copyright text can be summarized as following:",
+ "li0": "A product using OpenStreetMap data must give attribution.",
+ "li1": "OpenStreetMap-data must remain open. This means that data of a map containing OpenStreetMap data can be copied again.",
+ "outro": "The license has a few implications - these are explained below."
+ },
+ "vandalism": {
+ "title": "What about vandalism?",
+ "intro": "As anyone can edit the data, it is indeed possible that a malicious change is made. However, this is extremely rare for a few reasons:",
+ "li0": "the technical barrier to make changes is high",
+ "li1": "a small malicious change has low impact, thus little reward for a vandal",
+ "li2": "a high impact change is quickly noticed and reverted since so many people use this data",
+ "li3": "all changes are tracked and tied to a single user. A repeating offender is quickly banned",
+ "li4": "In Belgium (and some other countries), the first edit by a new contributor is systematically checked and corrected if needed."
+ }
+ },
+ "aboutMc": {
+ "title": "Using MapComplete in your organization",
+ "text0": "If an existing MapComplete theme is what you, feel free to use it or embed it on your website. Embedding the public themes is free and always will be.",
+ "text1": "Do you need some other data, but does the theme not exist yet? The MapComplete-developers can build it for you on a decent budget. Get in touch via email, github or send a message via osm.org",
+ "text2": "If you still feel unsure, the possibilities are outlined below. Additionally, some common questions are answered",
+ "layers": {
+ "title": "What data can be shown with MapComplete?",
+ "intro": "
MapComplete has a powerful templating system, which allows to quickly create a map showing precisely those features that you need and showing relevant attributes in the popups.
This data can be fetched from OpenStreetMap directly, but MapComplete can also use external datasets - e.g. to compare OpenStreetMap with another dataset or to show data that is not suited for OpenStreetMap (planned activities, statistics, ...)"
+ },
+ "survey": {
+ "title": "Survey possibilities",
+ "intro": "
MapComplete is an easy to use survey tool. It is ideal to collect the necessary in a few clicks, both on desktop and on mobile. This data is contributed directly into OpenStreetMap.
We can setup a custom survey tool, asking precisely the data you need in a future-proof way.
Do you have a dataset that has to be (re)surveyed? This is the perfect moment to make the switch to OpenStreetMap.MapComplete can show your dataset and OpenStreetMap at the same time, making it easier to visit all the locations and to see what the community already contributed.
\n"
+ },
+ "internalUse": {
+ "title": "Using the data in internal processes",
+ "intro": "
Once the data is in OpenStreetMap, you'll probably want to use the data as well. Your MapComplete theme can have a convenient export-button, offering to download the data in many open formats usable in QGis, ArcGis, Excel, LibreOffice-calc, ...
Someone with basic spreadsheet-skills can thus easily create graphs and insights about the data, whereas the GIS-experts within your organisation can easily work with this data in their preferred application.
If an automated setup is needed, a free-to-use, community-run API is available.
"
+ }
+ },
+ "services": {
+ "title": "MapComplete services",
+ "intro": "The developer of MapComplete can help you with the following services:",
+ "li0": "Setting up a theme tailored for your need",
+ "li1": "Help with setting up the internal data flow to integrate OpenStreetMap",
+ "li2": "Training on how to contribute data with MapComplete",
+ "li3": "Advanced training (e.g. for the GIS-team) on how to add advanced data to OpenStreetMap",
+ "li4": "Training on how to download filtered data from OpenStreetMap",
+ "outro": "These services are offered at competitive prices. A simple theme without extra support can be setup for as little €2000, and a small additional yearly hosting cost."
+ },
+ "drawbacks": {
+ "title": "A few drawbacks to keep in mind",
+ "intro": "While joining this community has tremendous benefits, there are a few topics to carefully consider.",
+ "unsuitedData": {
+ "title": "Data not suited for OpenStreetMap",
+ "intro": "The basic rule for OpenStreetMap is that all data must be verifiable on the ground and are somewhat permanent. This implies that some data cannot be sent to OpenStreetMap directly - but some workarounds exist.",
+ "li0": "Subjective data (such as reviews) are not suited for OpenStreetMap. However, MapComplete has an integration with Mangrove.reviews, an openly licensed review website",
+ "li1": "Events of a few days, road works that are planned next month are thus not recorded, neither are road works which only last a few days.",
+ "li2": "Temporal data (e.g. statistics of air quality, traffic intensity, ...) can not stored on OpenStreetMap as they are hard to verify by a volunteer. Note that, if this data is available elsewhere, it can still be visualized within MapComplete as extra layer."
+ },
+ "licenseNuances": {
+ "title": "Implications of ODbL: some use cases",
+ "intro": "OpenStreetMap is licensed unter the Open Database License which states that:",
+ "li0": "All data can be reused for any purpose - including commercial purposes",
+ "li1": "Applications or products using OpenStreetMap should give a clear copyright notice",
+ "li2": "Any dataset or product which contains OpenStreetMap-data must be republished under ODbL too, including modifications to this dataset and in a usable format.",
+ "outro": "This has a few implications which should be considered for some usecases, as explained below",
+ "usecaseMapDifferentSources": {
+ "title": "Creating a map from different sources",
+ "intro": "
For example, one could make a map with all benches in some city, based on the benches known by OpenStreetMap. This printed map needs a clear statement that the map data is based on OpenStreetMap. Selling these maps is permitted.If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap.
This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.
If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap. This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.
Of course, a map with only benches can be boring. The mapmaker might also decide to add in a layer with shops, possibly sourced from another geodata provider under another license. This is permitted to, if the map clearly states that the benches are sourced from OSM (under ODBL) and the shops have a different source (eventually with an all rights reserved).
However, mixing two datasets into one undistinguishible layer might not be permitted. For example, the mapmaker migth find that OSM has excellent data on benches in one part of the city and the closed-source provider might have excellent data on benches in another part of the city, merging these datasets into one could be problematic:
",
+ "li0": "the open license would require the modifications to be openly republished...",
+ "li1": "...whereas the all-rights-reserved license would prohibit this.",
+ "outro": "As a result, this kind of mixing is not allowed"
+ },
+ "usecaseGatheringOpenData": {
+ "title": "Gathering open data",
+ "intro": "MapComplete is an excellent way to create Open Data, also for governments. By default, this data will be freely redistributable under the ODbL. However, if there is a requirement to publish the gathered data under a public domain-license (where all rights are granted to the public and no attribution is required), the ODbL is too restrictive. In this case, one can ask the contributors to add data as Public Domain (e.g. by informing them in the mapcomplete theme). "
+ }
+ }
}
- }
}
- }
}
From 9a5c998fbe4b9ad5368f01cf32fd177ff03b6d60 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 15:41:34 +0100
Subject: [PATCH 02/12] Add trivial license
---
assets/svg/license_info.json | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/assets/svg/license_info.json b/assets/svg/license_info.json
index b2e4b5704..c66e82696 100644
--- a/assets/svg/license_info.json
+++ b/assets/svg/license_info.json
@@ -817,6 +817,12 @@
"authors": [],
"sources": []
},
+ {
+ "path": "none.svg",
+ "license": "CC0",
+ "authors": [],
+ "sources": []
+ },
{
"path": "osm-logo-us.svg",
"license": "Logo",
From 686fb29ed392d2d4c969b7bf7ccee2c99972ee0d Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 15:46:21 +0100
Subject: [PATCH 03/12] Fix translations
---
langs/themes/de.json | 2 +-
scripts/generateTranslations.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index f29c4f65a..47f261290 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -841,7 +841,7 @@
},
"grb": {
"layers": {
- "1": {
+ "2": {
"tagRenderings": {
"building type": {
"question": "Was ist das für ein Gebäude?"
diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts
index 9137ca84a..ccb7dffa1 100644
--- a/scripts/generateTranslations.ts
+++ b/scripts/generateTranslations.ts
@@ -36,7 +36,7 @@ class TranslationPart {
}
const v = translations[translationsKey]
if (typeof (v) != "string") {
- console.error("Non-string object in translation while trying to add more translations to '", translationsKey, "': ", v)
+ console.error(`Non-string object at ${context} in translation while trying to add more translations to '` + translationsKey + "': ", v)
throw "Error in an object depicting a translation: a non-string object was found. (" + context + ")\n You probably put some other section accidentally in the translation"
}
this.contents.set(translationsKey, v)
From 7090a5ceb804d417c9ad1a190ba1841fd685fdda Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 18:51:52 +0100
Subject: [PATCH 04/12] Performance hacks
---
Logic/Actors/SelectedFeatureHandler.ts | 14 ---
.../TiledFeatureSource/TiledFeatureSource.ts | 5 +-
Logic/MetaTagging.ts | 40 ++++---
Logic/SimpleMetaTagger.ts | 9 +-
UI/Base/Combine.ts | 8 +-
UI/Base/MinimapImplementation.ts | 18 +++-
UI/Base/ScrollableFullScreen.ts | 29 +++--
UI/Base/VariableUIElement.ts | 9 ++
UI/BaseUIElement.ts | 5 +
UI/BigComponents/LeftControls.ts | 2 +-
UI/Popup/FeatureInfoBox.ts | 1 +
UI/ShowDataLayer/ShowDataLayer.ts | 102 +++++++++++-------
UI/i18n/Translation.ts | 11 +-
assets/layers/etymology/etymology.json | 5 +-
assets/themes/grb_import/grb.json | 2 +-
15 files changed, 167 insertions(+), 93 deletions(-)
diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts
index 204950ed9..c5598f346 100644
--- a/Logic/Actors/SelectedFeatureHandler.ts
+++ b/Logic/Actors/SelectedFeatureHandler.ts
@@ -39,20 +39,6 @@ export default class SelectedFeatureHandler {
hash.addCallback(() => self.setSelectedElementFromHash())
- // IF the selected element changes, set the hash correctly
- state.selectedElement.addCallback(feature => {
- if (feature === undefined) {
- if (!SelectedFeatureHandler._no_trigger_on.has(hash.data)) {
- hash.setData("")
- }
- }
-
- const h = feature?.properties?.id;
- if (h !== undefined) {
- hash.setData(h)
- }
- })
-
state.featurePipeline?.newDataLoadedSignal?.addCallbackAndRunD(_ => {
// New data was loaded. In initial startup, the hash might be set (via the URL) but might not be selected yet
if (hash.data === undefined || SelectedFeatureHandler._no_trigger_on.has(hash.data)) {
diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts
index 60918fbfa..98e904746 100644
--- a/Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts
+++ b/Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts
@@ -201,9 +201,10 @@ export interface TiledFeatureSourceOptions {
readonly minZoomLevel?: number,
/**
* IF minZoomLevel is set, and if a feature runs through a tile boundary, it would normally be duplicated.
- * Setting 'dontEnforceMinZoomLevel' will still allow bigger zoom levels for those features
+ * Setting 'dontEnforceMinZoomLevel' will still allow bigger zoom levels for those features.
+ * If 'pick_first' is set, the feature will not be duplicated but set to some tile
*/
- readonly dontEnforceMinZoom?: boolean,
+ readonly dontEnforceMinZoom?: boolean | "pick_first",
readonly registerTile?: (tile: TiledFeatureSource & FeatureSourceForLayer & Tiled) => void,
readonly layer?: FilteredLayer
}
\ No newline at end of file
diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts
index d1501109c..302762110 100644
--- a/Logic/MetaTagging.ts
+++ b/Logic/MetaTagging.ts
@@ -56,6 +56,7 @@ export default class MetaTagging {
const feature = ff.feature
const freshness = ff.freshness
let somethingChanged = false
+ let definedTags = new Set(Object.getOwnPropertyNames( feature.properties ))
for (const metatag of metatagsToApply) {
try {
if (!metatag.keys.some(key => feature.properties[key] === undefined)) {
@@ -64,8 +65,11 @@ export default class MetaTagging {
}
if (metatag.isLazy) {
+ if(!metatag.keys.some(key => !definedTags.has(key))) {
+ // All keys are defined - lets skip!
+ continue
+ }
somethingChanged = true;
-
metatag.applyMetaTagsOnFeature(feature, freshness, layer, state)
} else {
const newValueAdded = metatag.applyMetaTagsOnFeature(feature, freshness, layer, state)
@@ -84,12 +88,13 @@ export default class MetaTagging {
}
if (layerFuncs !== undefined) {
+ let retaggingChanged = false;
try {
- layerFuncs(params, feature)
+ retaggingChanged = layerFuncs(params, feature)
} catch (e) {
console.error(e)
}
- somethingChanged = true
+ somethingChanged = somethingChanged || retaggingChanged
}
if (somethingChanged) {
@@ -99,8 +104,8 @@ export default class MetaTagging {
}
return atLeastOneFeatureChanged
}
- public static createFunctionsForFeature(layerId: string, calculatedTags: [string, string, boolean][]): ((feature: any) => void)[] {
- const functions: ((feature: any) => void)[] = [];
+ public static createFunctionsForFeature(layerId: string, calculatedTags: [string, string, boolean][]): ((feature: any) => boolean)[] {
+ const functions: ((feature: any) => boolean)[] = [];
for (const entry of calculatedTags) {
const key = entry[0]
@@ -110,10 +115,9 @@ export default class MetaTagging {
continue;
}
- const calculateAndAssign = (feat) => {
-
-
+ const calculateAndAssign: ((feat: any) => boolean) = (feat) => {
try {
+ let oldValue = isStrict ? feat.properties[key] : undefined
let result = new Function("feat", "return " + code + ";")(feat);
if (result === "") {
result === undefined
@@ -124,7 +128,7 @@ export default class MetaTagging {
}
delete feat.properties[key]
feat.properties[key] = result;
- return result;
+ return result === oldValue;
}catch(e){
if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) {
console.warn("Could not calculate a " + (isStrict ? "strict " : "") + " calculated tag for key " + key + " defined by " + code + " (in layer" + layerId + ") due to \n" + e + "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack)
@@ -133,6 +137,7 @@ export default class MetaTagging {
console.error("Got ", MetaTagging.stopErrorOutputAt, " errors calculating this metatagging - stopping output now")
}
}
+ return false;
}
}
@@ -149,9 +154,11 @@ export default class MetaTagging {
configurable: true,
enumerable: false, // By setting this as not enumerable, the localTileSaver will _not_ calculate this
get: function () {
- return calculateAndAssign(feature)
+ calculateAndAssign(feature)
+ return feature.properties[key]
}
})
+ return true
}
@@ -160,17 +167,23 @@ export default class MetaTagging {
return functions;
}
- private static retaggingFuncCache = new Map void)[]>()
+ private static retaggingFuncCache = new Map boolean)[]>()
+ /**
+ * Creates the function which adds all the calculated tags to a feature. Called once per layer
+ * @param layer
+ * @param state
+ * @private
+ */
private static createRetaggingFunc(layer: LayerConfig, state):
- ((params: ExtraFuncParams, feature: any) => void) {
+ ((params: ExtraFuncParams, feature: any) => boolean) {
const calculatedTags: [string, string, boolean][] = layer.calculatedTags;
if (calculatedTags === undefined || calculatedTags.length === 0) {
return undefined;
}
- let functions = MetaTagging.retaggingFuncCache.get(layer.id);
+ let functions :((feature: any) => boolean)[] = MetaTagging.retaggingFuncCache.get(layer.id);
if (functions === undefined) {
functions = MetaTagging.createFunctionsForFeature(layer.id, calculatedTags)
MetaTagging.retaggingFuncCache.set(layer.id, functions)
@@ -192,6 +205,7 @@ export default class MetaTagging {
} catch (e) {
console.error("Invalid syntax in calculated tags or some other error: ", e)
}
+ return true; // Something changed
}
}
diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts
index db422827f..67be6a5af 100644
--- a/Logic/SimpleMetaTagger.ts
+++ b/Logic/SimpleMetaTagger.ts
@@ -272,7 +272,7 @@ export default class SimpleMetaTaggers {
public static country = new CountryTagger()
private static isOpen = new SimpleMetaTagger(
{
- keys: ["_isOpen", "_isOpen:description"],
+ keys: ["_isOpen"],
doc: "If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no')",
includesDates: true,
isLazy: true
@@ -283,7 +283,7 @@ export default class SimpleMetaTaggers {
// isOpen is irrelevant
return false
}
-
+
Object.defineProperty(feature.properties, "_isOpen", {
enumerable: false,
configurable: true,
@@ -291,7 +291,8 @@ export default class SimpleMetaTaggers {
delete feature.properties._isOpen
feature.properties._isOpen = undefined
const tagsSource = state.allElements.getEventSourceById(feature.properties.id);
- tagsSource.addCallbackAndRunD(tags => {
+ tagsSource
+ .addCallbackAndRunD(tags => {
if (tags.opening_hours === undefined || tags._country === undefined) {
return;
}
@@ -341,7 +342,6 @@ export default class SimpleMetaTaggers {
}
}
updateTags();
- return true; // Our job is done, lets unregister!
} catch (e) {
console.warn("Error while parsing opening hours of ", tags.id, e);
delete tags._isOpen
@@ -352,6 +352,7 @@ export default class SimpleMetaTaggers {
return undefined
}
})
+ return true;
})
)
diff --git a/UI/Base/Combine.ts b/UI/Base/Combine.ts
index 434644b6a..3c3cb0c7f 100644
--- a/UI/Base/Combine.ts
+++ b/UI/Base/Combine.ts
@@ -1,7 +1,6 @@
import {FixedUiElement} from "./FixedUiElement";
import {Utils} from "../../Utils";
import BaseUIElement from "../BaseUIElement";
-import Title from "./Title";
export default class Combine extends BaseUIElement {
private readonly uiElements: BaseUIElement[];
@@ -21,6 +20,13 @@ export default class Combine extends BaseUIElement {
return this.uiElements.map(el => el.AsMarkdown()).join(this.HasClass("flex-col") ? "\n\n" : " ");
}
+ Destroy() {
+ super.Destroy();
+ for (const uiElement of this.uiElements) {
+ uiElement.Destroy()
+ }
+ }
+
protected InnerConstructElement(): HTMLElement {
const el = document.createElement("span")
try {
diff --git a/UI/Base/MinimapImplementation.ts b/UI/Base/MinimapImplementation.ts
index 4d93c4fae..e5aa7f8ef 100644
--- a/UI/Base/MinimapImplementation.ts
+++ b/UI/Base/MinimapImplementation.ts
@@ -48,7 +48,7 @@ export default class MinimapImplementation extends BaseUIElement implements Mini
public static initialize() {
Minimap.createMiniMap = options => new MinimapImplementation(options)
}
-
+
public installBounds(factor: number | BBox, showRange?: boolean) {
this.leafletMap.addCallbackD(leaflet => {
let bounds;
@@ -105,6 +105,15 @@ export default class MinimapImplementation extends BaseUIElement implements Mini
}
})
}
+
+ Destroy() {
+ super.Destroy();
+ console.warn("Decomissioning minimap", this._id)
+ const mp = this.leafletMap.data
+ this.leafletMap.setData(null)
+ mp.off()
+ mp.remove()
+ }
public async TakeScreenshot() {
const screenshotter = new SimpleMapScreenshoter();
@@ -125,6 +134,13 @@ export default class MinimapImplementation extends BaseUIElement implements Mini
const self = this;
// @ts-ignore
const resizeObserver = new ResizeObserver(_ => {
+ if(wrapper.clientHeight === 0 || wrapper.clientWidth === 0){
+ return;
+ }
+ if(wrapper.offsetParent === null || window.getComputedStyle(wrapper).display === 'none'){
+ // Not visible
+ return;
+ }
try {
self.InitMap();
self.leafletMap?.data?.invalidateSize()
diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts
index 686649ed8..c3dd39caa 100644
--- a/UI/Base/ScrollableFullScreen.ts
+++ b/UI/Base/ScrollableFullScreen.ts
@@ -49,24 +49,26 @@ export default class ScrollableFullScreen extends UIElement {
Hash.hash.setData(hashToShow)
self.Activate();
} else {
- self.clear();
+ // Some cleanup...
+ ScrollableFullScreen.empty.AttachTo("fullscreen")
+ const fs = document.getElementById("fullscreen");
+ ScrollableFullScreen._currentlyOpen?.isShown?.setData(false);
+ fs.classList.add("hidden")
}
})
- Hash.hash.addCallback(hash => {
- if (!isShown.data) {
- return;
- }
- if (hash === undefined || hash === "" || hash !== hashToShow) {
- isShown.setData(false)
- }
- })
}
InnerRender(): BaseUIElement {
return this._component;
}
+ Destroy() {
+ super.Destroy();
+ this._component.Destroy()
+ this._fullscreencomponent.Destroy()
+ }
+
Activate(): void {
this.isShown.setData(true)
this._fullscreencomponent.AttachTo("fullscreen");
@@ -74,14 +76,6 @@ export default class ScrollableFullScreen extends UIElement {
ScrollableFullScreen._currentlyOpen = this;
fs.classList.remove("hidden")
}
-
- private clear() {
- ScrollableFullScreen.empty.AttachTo("fullscreen")
- const fs = document.getElementById("fullscreen");
- ScrollableFullScreen._currentlyOpen?.isShown?.setData(false);
- fs.classList.add("hidden")
- }
-
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) {
const returnToTheMap =
new Combine([
@@ -93,6 +87,7 @@ export default class ScrollableFullScreen extends UIElement {
returnToTheMap.onClick(() => {
isShown.setData(false)
+ Hash.hash.setData(undefined)
})
title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-0 max-h-20vh overflow-y-auto")
diff --git a/UI/Base/VariableUIElement.ts b/UI/Base/VariableUIElement.ts
index 6ee720627..6798a11f2 100644
--- a/UI/Base/VariableUIElement.ts
+++ b/UI/Base/VariableUIElement.ts
@@ -8,10 +8,19 @@ export class VariableUiElement extends BaseUIElement {
super();
this._contents = contents;
}
+
+ Destroy() {
+ super.Destroy();
+ this.isDestroyed = true;
+ }
protected InnerConstructElement(): HTMLElement {
const el = document.createElement("span");
+ const self = this;
this._contents.addCallbackAndRun((contents) => {
+ if(self.isDestroyed){
+ return true;
+ }
while (el.firstChild) {
el.removeChild(el.lastChild);
}
diff --git a/UI/BaseUIElement.ts b/UI/BaseUIElement.ts
index eaac95b4b..eb33637a8 100644
--- a/UI/BaseUIElement.ts
+++ b/UI/BaseUIElement.ts
@@ -11,6 +11,7 @@ export default abstract class BaseUIElement {
private clss: Set = new Set();
private style: string;
private _onClick: () => void;
+ protected isDestroyed = false;
public onClick(f: (() => void)) {
this._onClick = f;
@@ -149,6 +150,10 @@ export default abstract class BaseUIElement {
public AsMarkdown(): string {
throw "AsMarkdown is not implemented by " + this.constructor.name+"; implement it in the subclass"
}
+
+ public Destroy(){
+ this.isDestroyed = true;
+ }
protected abstract InnerConstructElement(): HTMLElement;
}
diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts
index a669b856c..a996416f5 100644
--- a/UI/BigComponents/LeftControls.ts
+++ b/UI/BigComponents/LeftControls.ts
@@ -121,7 +121,7 @@ export default class LeftControls extends Combine {
"filters",
guiState.filterViewIsOpened
).SetClass("rounded-lg md:floating-element-width"),
- new MapControlButton(Svg.filter_svg())
+ new MapControlButton(Svg.layers_svg())
.onClick(() => guiState.filterViewIsOpened.setData(true)),
guiState.filterViewIsOpened
)
diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts
index 9d637f7da..5d1d5baf1 100644
--- a/UI/Popup/FeatureInfoBox.ts
+++ b/UI/Popup/FeatureInfoBox.ts
@@ -235,4 +235,5 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
return false;
}
+
}
diff --git a/UI/ShowDataLayer/ShowDataLayer.ts b/UI/ShowDataLayer/ShowDataLayer.ts
index d1af72001..7e372e7a7 100644
--- a/UI/ShowDataLayer/ShowDataLayer.ts
+++ b/UI/ShowDataLayer/ShowDataLayer.ts
@@ -29,6 +29,11 @@ export default class ShowDataLayer {
// Used to generate a fresh ID when needed
private _cleanCount = 0;
private geoLayer = undefined;
+
+ /**
+ * A collection of functions to call when the current geolayer is unregistered
+ */
+ private unregister: (() => void)[] = [];
private isDirty = false;
/**
* If the selected element triggers, this is used to lookup the correct layer and to open the popup
@@ -56,25 +61,32 @@ export default class ShowDataLayer {
const self = this;
options.leafletMap.addCallback(_ => {
- self.update(options)
+ return self.update(options)
}
);
this._features.features.addCallback(_ => self.update(options));
options.doShowLayer?.addCallback(doShow => {
const mp = options.leafletMap.data;
+ if(mp === null){
+ self.Destroy()
+ return true;
+ }
if (mp == undefined) {
return;
}
+
if (doShow) {
if (self.isDirty) {
- self.update(options)
+ return self.update(options)
} else {
mp.addLayer(this.geoLayer)
}
} else {
if (this.geoLayer !== undefined) {
mp.removeLayer(this.geoLayer)
+ this.unregister.forEach(f => f())
+ this.unregister = []
}
}
@@ -82,40 +94,50 @@ export default class ShowDataLayer {
this._selectedElement?.addCallbackAndRunD(selected => {
- if (self._leafletMap.data === undefined) {
- return;
- }
- const v = self.leafletLayersPerId.get(selected.properties.id + selected.geometry.type)
- if (v === undefined) {
- return;
- }
- const leafletLayer = v.leafletlayer
- const feature = v.feature
- if (leafletLayer.getPopup().isOpen()) {
- return;
- }
- if (selected.properties.id !== feature.properties.id) {
- return;
- }
-
- if (feature.id !== feature.properties.id) {
- // Probably a feature which has renamed
- // the feature might have as id 'node/-1' and as 'feature.properties.id' = 'the newly assigned id'. That is no good too
- console.log("Not opening the popup for", feature, "as probably renamed")
- return;
- }
- if (selected.geometry.type === feature.geometry.type // If a feature is rendered both as way and as point, opening one popup might trigger the other to open, which might trigger the one to open again
- ) {
- console.log("Opening popup of feature", feature)
- leafletLayer.openPopup()
- }
+ self.openPopupOfSelectedElement(selected)
})
this.update(options)
}
- private update(options: ShowDataLayerOptions) {
+ private Destroy() {
+ this.unregister.forEach(f => f())
+ }
+
+ private openPopupOfSelectedElement(selected) {
+ if (selected === undefined) {
+ return
+ }
+ if (this._leafletMap.data === undefined) {
+ return;
+ }
+ const v = this.leafletLayersPerId.get(selected.properties.id + selected.geometry.type)
+ if (v === undefined) {
+ return;
+ }
+ const leafletLayer = v.leafletlayer
+ const feature = v.feature
+ if (leafletLayer.getPopup().isOpen()) {
+ return;
+ }
+ if (selected.properties.id !== feature.properties.id) {
+ return;
+ }
+
+ if (feature.id !== feature.properties.id) {
+ // Probably a feature which has renamed
+ // the feature might have as id 'node/-1' and as 'feature.properties.id' = 'the newly assigned id'. That is no good too
+ console.log("Not opening the popup for", feature, "as probably renamed")
+ return;
+ }
+ if (selected.geometry.type === feature.geometry.type // If a feature is rendered both as way and as point, opening one popup might trigger the other to open, which might trigger the one to open again
+ ) {
+ leafletLayer.openPopup()
+ }
+ }
+
+ private update(options: ShowDataLayerOptions) : boolean{
if (this._features.features.data === undefined) {
return;
}
@@ -125,9 +147,13 @@ export default class ShowDataLayer {
}
const mp = options.leafletMap.data;
+ if(mp === null){
+ return true; // Unregister as the map is destroyed
+ }
if (mp === undefined) {
return;
}
+ console.trace("Updating... " + mp["_container"]?.id +" for layer "+this._layerToShow.id)
this._cleanCount++
// clean all the old stuff away, if any
if (this.geoLayer !== undefined) {
@@ -145,7 +171,7 @@ export default class ShowDataLayer {
pointToLayer: (feature, latLng) => self.pointToLayer(feature, latLng),
onEachFeature: (feature, leafletLayer) => self.postProcessFeature(feature, leafletLayer)
});
-
+
const selfLayer = this.geoLayer;
const allFeats = this._features.features.data;
for (const feat of allFeats) {
@@ -176,20 +202,20 @@ export default class ShowDataLayer {
offsettedLine = L.polyline(coords, lineStyle);
this.postProcessFeature(feat, offsettedLine)
offsettedLine.addTo(this.geoLayer)
-
+
// If 'self.geoLayer' is not the same as the layer the feature is added to, we can safely remove this callback
return self.geoLayer !== selfLayer
})
} else {
this.geoLayer.addData(feat);
- }
+ }
} catch (e) {
console.error("Could not add ", feat, "to the geojson layer in leaflet due to", e, e.stack)
}
}
if (options.zoomToFeatures ?? false) {
- if(this.geoLayer.getLayers().length > 0){
+ if (this.geoLayer.getLayers().length > 0) {
try {
const bounds = this.geoLayer.getBounds()
mp.fitBounds(bounds, {animate: false})
@@ -203,6 +229,7 @@ export default class ShowDataLayer {
mp.addLayer(this.geoLayer)
}
this.isDirty = false;
+ this.openPopupOfSelectedElement(this._selectedElement?.data)
}
@@ -250,7 +277,7 @@ export default class ShowDataLayer {
}
/**
- * POst processing - basically adding the popup
+ * Post processing - basically adding the popup
* @param feature
* @param leafletLayer
* @private
@@ -290,6 +317,10 @@ export default class ShowDataLayer {
}
infobox.AttachTo(id)
infobox.Activate();
+ this.unregister.push(() => {
+ console.log("Destroying infobox")
+ infobox.Destroy();
+ })
if (this._selectedElement?.data?.properties?.id !== feature.properties.id) {
this._selectedElement?.setData(feature)
}
@@ -303,7 +334,6 @@ export default class ShowDataLayer {
leafletlayer: leafletLayer
})
-
}
}
\ No newline at end of file
diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts
index c11bc4b0a..d914425a2 100644
--- a/UI/i18n/Translation.ts
+++ b/UI/i18n/Translation.ts
@@ -7,7 +7,7 @@ export class Translation extends BaseUIElement {
public static forcedLanguage = undefined;
public readonly translations: object
-
+
constructor(translations: object, context?: string) {
super()
if (translations === undefined) {
@@ -33,6 +33,11 @@ export class Translation extends BaseUIElement {
get txt(): string {
return this.textFor(Translation.forcedLanguage ?? Locale.language.data)
}
+
+ Destroy() {
+ super.Destroy();
+ this.isDestroyed = true;
+ }
static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] {
const allTranslations: { context: string, tr: Translation }[] = []
@@ -90,7 +95,11 @@ export class Translation extends BaseUIElement {
InnerConstructElement(): HTMLElement {
const el = document.createElement("span")
+ const self = this
Locale.language.addCallbackAndRun(_ => {
+ if(self.isDestroyed){
+ return true
+ }
el.innerHTML = this.txt
})
return el;
diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json
index b0087cf8d..1c0f96c41 100644
--- a/assets/layers/etymology/etymology.json
+++ b/assets/layers/etymology/etymology.json
@@ -140,6 +140,7 @@
},
{
"id": "wikipedia",
+ "#": "Note that this is a _read_only_ option, to prevent people entering a 'wikidata'-link instead of 'name:etymology:wikidata'",
"render": {
"en": "A Wikipedia article about this street exists: {wikipedia():max-height:25rem}"
},
@@ -149,7 +150,7 @@
"mapRendering": [
{
"icon": {
- "render": "pin:#05d7fcaa;./assets/layers/etymology/logo.svg",
+ "render": "pin:#05d7fcaa",
"mappings": [
{
"if": {
@@ -158,7 +159,7 @@
"name:etymology:wikidata="
]
},
- "then": "pin:#fcca05aa;./assets/layers/etymology/logo.svg"
+ "then": "pin:#fcca05aa"
}
]
},
diff --git a/assets/themes/grb_import/grb.json b/assets/themes/grb_import/grb.json
index 2b9bbfac6..77bda9e99 100644
--- a/assets/themes/grb_import/grb.json
+++ b/assets/themes/grb_import/grb.json
@@ -16,7 +16,7 @@
"de"
],
"maintainer": "",
- "icon": "./assets/svg/bug.svg",
+ "icon": "./assets/themes/grb_import/grb.svg",
"version": "0",
"startLat": 51.0249,
"startLon": 4.026489,
From d4f5e1d2388ac13893079fcab8bc992406a0ce3f Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 20:39:59 +0100
Subject: [PATCH 05/12] Add script to automatically rescale SVG images -
important to export them to PNGs
---
assets/layers/binocular/telescope.svg | 30 +--
assets/layers/cafe_pub/cafe.svg | 31 +--
assets/layers/cafe_pub/pub.svg | 32 +--
.../charging_station/charging_station.json | 32 +--
assets/themes/grb_import/grb.json | 2 +-
package-lock.json | 208 ++++++++++++++++++
package.json | 1 +
scripts/resizeSvg.sh | 15 ++
8 files changed, 261 insertions(+), 90 deletions(-)
create mode 100755 scripts/resizeSvg.sh
diff --git a/assets/layers/binocular/telescope.svg b/assets/layers/binocular/telescope.svg
index b33456606..72872cd08 100644
--- a/assets/layers/binocular/telescope.svg
+++ b/assets/layers/binocular/telescope.svg
@@ -1,22 +1,8 @@
-
-
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/cafe_pub/cafe.svg b/assets/layers/cafe_pub/cafe.svg
index 3a7d27538..8c5c3e4e1 100644
--- a/assets/layers/cafe_pub/cafe.svg
+++ b/assets/layers/cafe_pub/cafe.svg
@@ -1,25 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/cafe_pub/pub.svg b/assets/layers/cafe_pub/pub.svg
index 616bd520b..d0716db50 100644
--- a/assets/layers/cafe_pub/pub.svg
+++ b/assets/layers/cafe_pub/pub.svg
@@ -1,26 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index 96dd6f11a..6a40ffd8f 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -3009,8 +3009,8 @@
"question": {
"en": "What kind of authentication is available at the charging station?",
"nl": "Hoe kan men zich aanmelden aan dit oplaadstation?",
- "fr": "Quelle sorte d'authentification est disponible à cette station de charge ?",
- "de": "Welche Art der Authentifizierung ist an der Ladestation möglich?"
+ "de": "Welche Art der Authentifizierung ist an der Ladestation möglich?",
+ "fr": "Quelle sorte d'authentification est disponible à cette station de charge ?"
},
"multiAnswer": true,
"mappings": [
@@ -3020,8 +3020,8 @@
"then": {
"en": "Authentication by a membership card",
"nl": "Aanmelden met een lidkaart is mogelijk",
- "fr": "Authentification par carte de membre",
- "de": "Authentifizierung per Mitgliedskarte"
+ "de": "Authentifizierung per Mitgliedskarte",
+ "fr": "Authentification par carte de membre"
}
},
{
@@ -3030,8 +3030,8 @@
"then": {
"en": "Authentication by an app",
"nl": "Aanmelden via een applicatie is mogelijk",
- "fr": "Authentification par une app",
- "de": "Authentifizierung per App"
+ "de": "Authentifizierung per App",
+ "fr": "Authentification par une app"
}
},
{
@@ -3040,8 +3040,8 @@
"then": {
"en": "Authentication via phone call is available",
"nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk",
- "fr": "Authentification par appel téléphonique est disponible",
- "de": "Authentifizierung per Anruf ist möglich"
+ "de": "Authentifizierung per Anruf ist möglich",
+ "fr": "Authentification par appel téléphonique est disponible"
}
},
{
@@ -3050,8 +3050,8 @@
"then": {
"en": "Authentication via SMS is available",
"nl": "Aanmelden via SMS is mogelijk",
- "fr": "Authentification par SMS est disponible",
- "de": "Authentifizierung per SMS ist möglich"
+ "de": "Authentifizierung per SMS ist möglich",
+ "fr": "Authentification par SMS est disponible"
}
},
{
@@ -3060,8 +3060,8 @@
"then": {
"en": "Authentication via NFC is available",
"nl": "Aanmelden via NFC is mogelijk",
- "fr": "Authentification par NFC est disponible",
- "de": "Authentifizierung per NFC ist möglich"
+ "de": "Authentifizierung per NFC ist möglich",
+ "fr": "Authentification par NFC est disponible"
}
},
{
@@ -3079,8 +3079,8 @@
"then": {
"en": "Authentication via debit card is available",
"nl": "Aanmelden met een betaalkaart is mogelijk",
- "fr": "Authentification par carte de débit est disponible",
- "de": "Authentifizierung per Kreditkarte ist möglich"
+ "de": "Authentifizierung per Kreditkarte ist möglich",
+ "fr": "Authentification par carte de débit est disponible"
}
},
{
@@ -3089,8 +3089,8 @@
"then": {
"en": "Charging here is (also) possible without authentication",
"nl": "Hier opladen is (ook) mogelijk zonder aan te melden",
- "fr": "Charger ici est (aussi) possible sans authentification",
- "de": "Das Laden ist hier (auch) ohne Authentifizierung möglich"
+ "de": "Das Laden ist hier (auch) ohne Authentifizierung möglich",
+ "fr": "Charger ici est (aussi) possible sans authentification"
}
}
],
diff --git a/assets/themes/grb_import/grb.json b/assets/themes/grb_import/grb.json
index 77bda9e99..46cafc6ce 100644
--- a/assets/themes/grb_import/grb.json
+++ b/assets/themes/grb_import/grb.json
@@ -16,7 +16,7 @@
"de"
],
"maintainer": "",
- "icon": "./assets/themes/grb_import/grb.svg",
+ "icon": "./assets/themes/grb_import/housenumber_blank.svg",
"version": "0",
"startLat": 51.0249,
"startLon": 4.026489,
diff --git a/package-lock.json b/package-lock.json
index 375d926f0..5ec926bd9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -46,6 +46,7 @@
"osmtogeojson": "^3.0.0-beta.4",
"parcel": "^1.2.4",
"prompt-sync": "^4.2.0",
+ "svg-resizer": "github:vieron/svg-resizer",
"tailwindcss": "^2.2.15",
"togpx": "^0.5.4",
"tslint": "^6.1.3",
@@ -4670,6 +4671,14 @@
"simple-swizzle": "^0.2.2"
}
},
+ "node_modules/colors": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -6843,6 +6852,36 @@
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
+ "node_modules/fs-extra": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.8.1.tgz",
+ "integrity": "sha1-Dld5/7/t9RG8dVWVx/A8BtS0Po0=",
+ "dependencies": {
+ "jsonfile": "~1.1.0",
+ "mkdirp": "0.3.x",
+ "ncp": "~0.4.2",
+ "rimraf": "~2.2.0"
+ }
+ },
+ "node_modules/fs-extra/node_modules/jsonfile": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz",
+ "integrity": "sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM="
+ },
+ "node_modules/fs-extra/node_modules/mkdirp": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
+ "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=",
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)"
+ },
+ "node_modules/fs-extra/node_modules/rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -9566,6 +9605,14 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
},
+ "node_modules/ncp": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz",
+ "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=",
+ "bin": {
+ "ncp": "bin/ncp"
+ }
+ },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -9678,6 +9725,21 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz",
"integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA=="
},
+ "node_modules/nomnom": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz",
+ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=",
+ "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.",
+ "dependencies": {
+ "colors": "0.5.x",
+ "underscore": "~1.4.4"
+ }
+ },
+ "node_modules/nomnom/node_modules/underscore": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
+ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ="
+ },
"node_modules/normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -13493,6 +13555,17 @@
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
},
+ "node_modules/shelljs": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz",
+ "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g=",
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/sigmund": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
@@ -14229,6 +14302,30 @@
"node": ">=6.9.5"
}
},
+ "node_modules/svg-resizer": {
+ "version": "0.0.1",
+ "resolved": "git+ssh://git@github.com/vieron/svg-resizer.git#00968cb3e7248533ab9451ce7dffa8af288e4f4a",
+ "license": "MIT",
+ "dependencies": {
+ "fs-extra": "~0.8.1",
+ "lodash": "~2.4.1",
+ "nomnom": "~1.6.2",
+ "shelljs": "~0.2.6",
+ "xml2js": "~0.4.2"
+ },
+ "bin": {
+ "svg-resizer": "svg-resizer.js"
+ }
+ },
+ "node_modules/svg-resizer/node_modules/lodash": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
+ "engines": [
+ "node",
+ "rhino"
+ ]
+ },
"node_modules/svgo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
@@ -16563,6 +16660,26 @@
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
},
+ "node_modules/xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -20410,6 +20527,11 @@
"simple-swizzle": "^0.2.2"
}
},
+ "colors": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q="
+ },
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -22135,6 +22257,34 @@
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
+ "fs-extra": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.8.1.tgz",
+ "integrity": "sha1-Dld5/7/t9RG8dVWVx/A8BtS0Po0=",
+ "requires": {
+ "jsonfile": "~1.1.0",
+ "mkdirp": "0.3.x",
+ "ncp": "~0.4.2",
+ "rimraf": "~2.2.0"
+ },
+ "dependencies": {
+ "jsonfile": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz",
+ "integrity": "sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM="
+ },
+ "mkdirp": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
+ "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc="
+ },
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI="
+ }
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -24231,6 +24381,11 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
},
+ "ncp": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz",
+ "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ="
+ },
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -24343,6 +24498,22 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz",
"integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA=="
},
+ "nomnom": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz",
+ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=",
+ "requires": {
+ "colors": "0.5.x",
+ "underscore": "~1.4.4"
+ },
+ "dependencies": {
+ "underscore": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
+ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ="
+ }
+ }
+ },
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -27279,6 +27450,11 @@
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
},
+ "shelljs": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz",
+ "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g="
+ },
"sigmund": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
@@ -27861,6 +28037,24 @@
"integrity": "sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==",
"optional": true
},
+ "svg-resizer": {
+ "version": "git+ssh://git@github.com/vieron/svg-resizer.git#00968cb3e7248533ab9451ce7dffa8af288e4f4a",
+ "from": "svg-resizer@git+https://github.com/vieron/svg-resizer.git",
+ "requires": {
+ "fs-extra": "~0.8.1",
+ "lodash": "~2.4.1",
+ "nomnom": "~1.6.2",
+ "shelljs": "~0.2.6",
+ "xml2js": "~0.4.2"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4="
+ }
+ }
+ },
"svgo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
@@ -29728,6 +29922,20 @@
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
},
+ "xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "requires": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ }
+ },
+ "xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
+ },
"xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
diff --git a/package.json b/package.json
index 380fc3f9f..fc157041a 100644
--- a/package.json
+++ b/package.json
@@ -95,6 +95,7 @@
"osmtogeojson": "^3.0.0-beta.4",
"parcel": "^1.2.4",
"prompt-sync": "^4.2.0",
+ "svg-resizer": "github:vieron/svg-resizer",
"tailwindcss": "^2.2.15",
"togpx": "^0.5.4",
"tslint": "^6.1.3",
diff --git a/scripts/resizeSvg.sh b/scripts/resizeSvg.sh
new file mode 100755
index 000000000..605ee7e6f
--- /dev/null
+++ b/scripts/resizeSvg.sh
@@ -0,0 +1,15 @@
+#! /bin/bash
+
+# Requires `sudo apt-get install librsvg2-bin`
+# $1 should be the file
+
+resizeFile(){
+ PTH="$(dirname "${1}")"
+ FILE="$(basename "${1}")"
+ echo "Path is $PTH, name is $FILE"
+ svg-resizer -f -x 500 -y 500 -o /tmp/resized $1
+ # mv "/tmp/resized/$FILE" "$PTH"
+}
+
+export -f resizeFile
+find . -name "*.svg" -exec bash -c 'resizeFile "$0"' {} \;
From 8435fb883f8c87ae0c56e547ee68683d89ea1d00 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 20:40:05 +0100
Subject: [PATCH 06/12] Add script to automatically rescale SVG images -
important to export them to PNGs
---
scripts/resizeSvg.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/resizeSvg.sh b/scripts/resizeSvg.sh
index 605ee7e6f..87c70971c 100755
--- a/scripts/resizeSvg.sh
+++ b/scripts/resizeSvg.sh
@@ -8,7 +8,7 @@ resizeFile(){
FILE="$(basename "${1}")"
echo "Path is $PTH, name is $FILE"
svg-resizer -f -x 500 -y 500 -o /tmp/resized $1
- # mv "/tmp/resized/$FILE" "$PTH"
+ mv "/tmp/resized/$FILE" "$PTH"
}
export -f resizeFile
From c998cc5c7fe300072be3fbb829eb20c8c03abff3 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Thu, 6 Jan 2022 20:54:00 +0100
Subject: [PATCH 07/12] Resize all SVG images
---
Docs/Misc/geolocation_button.gv.svg | 511 +-
assets/layers/address/housenumber_blank.svg | 70 +-
assets/layers/barrier/barrier.svg | 28 +-
assets/layers/bench/bench.svg | 35 +-
.../bicycle_library/bicycle_library.svg | 186 +-
.../bicycle_tube_vending_machine/pinIcon.svg | 203 +-
.../bicycle_tube_vending_machine/tube.svg | 137 +-
assets/layers/bike_cafe/bike_cafe.svg | 62 +-
assets/layers/bike_cleaning/bike_cleaning.svg | 228 +-
.../bike_cleaning/bike_cleaning_icon.svg | 221 +-
assets/layers/bike_parking/bollard.svg | 89 +-
.../layers/bike_parking/handlebar_holder.svg | 38 +-
assets/layers/bike_parking/parking.svg | 42 +-
assets/layers/bike_parking/parking_old.svg | 200 +-
assets/layers/bike_parking/rack.svg | 311 +-
assets/layers/bike_parking/shed.svg | 43 +-
assets/layers/bike_parking/staple.svg | 49 +-
assets/layers/bike_parking/two_tier.svg | 66 +-
assets/layers/bike_parking/wall_loops.svg | 56 +-
.../layers/bike_repair_station/bike_pump.svg | 158 +-
.../bike_repair_station/broken_pump.svg | 55 +-
.../bike_repair_station/broken_pump_2.svg | 238 +-
assets/layers/bike_repair_station/pump.svg | 49 +-
.../bike_repair_station/repair_station.svg | 90 +-
.../repair_station_pump.svg | 123 +-
assets/layers/bike_shop/pump.svg | 190 +-
assets/layers/bike_shop/repair_shop.svg | 47 +-
assets/layers/bike_shop/shop.svg | 346 +-
assets/layers/bike_shop/tools.svg | 268 +-
.../bike_themed_object/other_services.svg | 15 +-
assets/layers/birdhide/birdhide.svg | 71 +-
assets/layers/birdhide/birdshelter.svg | 75 +-
assets/layers/charging_station/CEE7_4F.svg | 69 +-
.../layers/charging_station/Chademo_type4.svg | 192 +-
.../charging_station/Tesla-hpwc-model-s.svg | 186 +-
assets/layers/charging_station/Type1-ccs.svg | 264 +-
.../layers/charging_station/Type1_J1772.svg | 225 +-
assets/layers/charging_station/Type2_CCS.svg | 161 +-
.../layers/charging_station/Type2_socket.svg | 130 +-
.../charging_station/Type2_tethered.svg | 143 +-
assets/layers/charging_station/Type3c.svg | 135 +-
assets/layers/charging_station/TypeE.svg | 100 +-
assets/layers/charging_station/bosch-3pin.svg | 123 +-
assets/layers/charging_station/bosch-5pin.svg | 141 +-
.../charging_station/under_construction.svg | 66 +-
assets/layers/charging_station/usb_port.svg | 94 +-
.../layers/crab_address/housenumber_blank.svg | 70 +-
.../crossings/Belgian_road_sign_B22.svg | 134 +-
.../crossings/Belgian_road_sign_B23.svg | 135 +-
.../layers/crossings/pedestrian_crossing.svg | 34 +-
assets/layers/crossings/traffic_lights.svg | 53 +-
assets/layers/defibrillator/aed_checked.svg | 16 +-
assets/layers/drinking_water/drips.svg | 128 +-
assets/layers/entrance/door.svg | 73 +-
assets/layers/entrance/emergency_door.svg | 98 +-
assets/layers/etymology/logo.svg | 121 +-
assets/layers/food/Vegetarian-mark.svg | 36 +-
assets/layers/food/fastfood.svg | 31 +-
assets/layers/food/fries.svg | 43 +-
assets/layers/food/restaurant.svg | 36 +-
assets/layers/ghost_bike/ghost_bike.svg | 84 +-
assets/layers/information_board/board.svg | 78 +-
assets/layers/nature_reserve/groen_logo.svg | 12 +-
.../layers/nature_reserve/nature_reserve.svg | 14 +-
.../observation_tower/Tower_observation.svg | 41 +-
assets/layers/parking/parking.svg | 73 +-
assets/layers/picnic_table/picnic_table.svg | 55 +-
assets/layers/play_forest/icon.svg | 67 +-
assets/layers/slow_roads/slow_road.svg | 24 +-
assets/layers/slow_roads/woonerf.svg | 112 +-
assets/layers/sport_pitch/baseball.svg | 79 +-
assets/layers/sport_pitch/basketball.svg | 79 +-
assets/layers/sport_pitch/beachvolleyball.svg | 79 +-
assets/layers/sport_pitch/boules.svg | 93 +-
assets/layers/sport_pitch/lock.svg | 17 +-
assets/layers/sport_pitch/skateboard.svg | 86 +-
assets/layers/sport_pitch/soccer.svg | 79 +-
assets/layers/sport_pitch/sport_pitch.svg | 24 +-
assets/layers/sport_pitch/table_tennis.svg | 86 +-
assets/layers/sport_pitch/tennis.svg | 86 +-
assets/layers/sport_pitch/volleyball.svg | 79 +-
assets/layers/street_lamps/bent_pole_1.svg | 107 +-
assets/layers/street_lamps/bent_pole_2.svg | 147 +-
assets/layers/street_lamps/straight_pole.svg | 174 +-
assets/layers/street_lamps/street_lamp.svg | 29 +-
assets/layers/toilet/toilets.svg | 88 +-
assets/layers/toilet/urinal.svg | 74 +-
assets/layers/toilet/wheelchair.svg | 79 +-
assets/layers/trail/pushchair.svg | 73 +-
assets/layers/trail/trail.svg | 66 +-
assets/layers/trail/wheelchair.svg | 86 +-
.../Onroerend_Erfgoed_logo_without_text.svg | 34 +-
assets/layers/viewpoint/viewpoint.svg | 88 +-
assets/layers/watermill/watermill.svg | 15 +-
assets/svg/add.svg | 297 +-
assets/svg/addSmall.svg | 289 +-
assets/svg/add_pin.svg | 275 +-
assets/svg/ampersand.svg | 58 +-
assets/svg/back.svg | 83 +-
assets/svg/blocked.svg | 1024 +-
assets/svg/bug.svg | 7 +-
assets/svg/camera-plus.svg | 87 +-
assets/svg/checkbox-empty.svg | 9 +-
assets/svg/checkbox-filled.svg | 11 +-
assets/svg/checkmark.svg | 8 +-
assets/svg/circle.svg | 20 +-
assets/svg/clock.svg | 42 +-
assets/svg/close.svg | 87 +-
assets/svg/compass.svg | 282 +-
assets/svg/copyright.svg | 59 +-
assets/svg/cross_bottom_right.svg | 91 +-
assets/svg/crosshair-blue-center.svg | 110 +-
assets/svg/crosshair-blue.svg | 113 +-
assets/svg/crosshair-empty.svg | 89 +-
assets/svg/crosshair-locked.svg | 116 +-
assets/svg/crosshair.svg | 69 +-
assets/svg/delete_icon.svg | 60 +-
assets/svg/delete_not_allowed.svg | 95 +-
assets/svg/direction_stroke.svg | 113 +-
assets/svg/download.svg | 72 +-
assets/svg/envelope.svg | 56 +-
assets/svg/eye.svg | 63 +-
assets/svg/filter.svg | 61 +-
assets/svg/gear.svg | 10 +-
assets/svg/gender_bi.svg | 18 +-
assets/svg/gender_female.svg | 18 +-
assets/svg/gender_inter.svg | 18 +-
assets/svg/gender_male.svg | 18 +-
assets/svg/gender_queer.svg | 18 +-
assets/svg/gender_trans.svg | 18 +-
assets/svg/generic_map.svg | 65 +-
assets/svg/hand.svg | 35 +-
assets/svg/help.svg | 22 +-
assets/svg/home.svg | 11 +-
assets/svg/layers.svg | 74 +-
assets/svg/length-crosshair.svg | 126 +-
assets/svg/liberapay.svg | 18 +-
assets/svg/loading.svg | 85 +-
assets/svg/location-empty.svg | 13 +-
assets/svg/location-refused.svg | 47 +-
assets/svg/location.svg | 66 +-
assets/svg/location_locked.svg | 67 +-
assets/svg/location_unlocked.svg | 65 +-
assets/svg/logo.svg | 305 +-
assets/svg/logout.svg | 102 +-
assets/svg/mapillary.svg | 9 +-
assets/svg/mapillary_black.svg | 63 +-
assets/svg/min.svg | 244 +-
assets/svg/move-arrows.svg | 125 +-
assets/svg/move.svg | 13 +-
assets/svg/move_confirm.svg | 288 +-
assets/svg/move_not_allowed.svg | 293 +-
assets/svg/no_checkmark.svg | 4 +-
assets/svg/none.svg | 83 +-
assets/svg/osm-logo-us.svg | 13 +-
assets/svg/pencil.svg | 7 +-
assets/svg/phone.svg | 64 +-
assets/svg/pin.svg | 108 +-
assets/svg/plus.svg | 65 +-
assets/svg/pop-out.svg | 12 +-
assets/svg/reload.svg | 61 +-
assets/svg/relocation.svg | 73 +-
assets/svg/ring.svg | 39 +-
assets/svg/robot.svg | 11 +-
assets/svg/satellite.svg | 320 +-
assets/svg/scissors.svg | 16 +-
assets/svg/search.svg | 11 +-
assets/svg/send_email.svg | 97 +-
assets/svg/share.svg | 61 +-
assets/svg/square.svg | 40 +-
assets/svg/star.svg | 15 +-
assets/svg/star_half.svg | 68 +-
assets/svg/star_outline.svg | 62 +-
assets/svg/star_outline_half.svg | 69 +-
assets/svg/statistics.svg | 12 +-
assets/svg/teardrop.svg | 110 +-
assets/svg/teardrop_with_hole_green.svg | 138 +-
assets/svg/translate.svg | 17 +-
assets/svg/up.svg | 17 +-
assets/svg/upload.svg | 77 +-
assets/svg/wikidata.svg | 17 +-
assets/svg/wikimedia-commons-white.svg | 188 +-
assets/themes/aed/aed.svg | 16 +-
assets/themes/artwork/artwork.svg | 78 +-
assets/themes/benches/bench_poi.svg | 35 +-
.../themes/benches/bench_public_transport.svg | 35 +-
assets/themes/bicyclelib/logo.svg | 172 +-
assets/themes/bookcases/bookcase.svg | 79 +-
assets/themes/buurtnatuur/forest.svg | 16 +-
assets/themes/buurtnatuur/groen_logo.svg | 12 +-
assets/themes/buurtnatuur/nature_reserve.svg | 14 +-
assets/themes/buurtnatuur/park.svg | 12 +-
assets/themes/campersite/caravan.svg | 10 +-
assets/themes/campersite/caravan_green.svg | 10 +-
.../campersite/sanitary_dump_station.svg | 23 +-
assets/themes/charging_stations/bicycle.svg | 59 +-
assets/themes/charging_stations/car.svg | 53 +-
assets/themes/charging_stations/logo.svg | 71 +-
assets/themes/charging_stations/plug.svg | 52 +-
assets/themes/climbing/carabiner.svg | 78 +-
assets/themes/climbing/climbing_gym.svg | 97 +-
assets/themes/climbing/climbing_icon.svg | 88 +-
assets/themes/climbing/climbing_no_rope.svg | 80 +-
assets/themes/climbing/climbing_rope.svg | 92 +-
assets/themes/climbing/climbing_route.svg | 97 +-
assets/themes/climbing/climbing_unknown.svg | 108 +-
assets/themes/climbing/club.svg | 86 +-
assets/themes/climbing/height.svg | 92 +-
.../cycle_highways/fietssnelwegen-logo.svg | 71 +-
.../cycle_infra/Belgian_road_sign_D07.svg | 105 +-
.../cycle_infra/Belgian_road_sign_D09.svg | 103 +-
.../cycle_infra/Belgian_road_sign_D10.svg | 97 +-
.../cycle_infra/Belgian_traffic_sign_M13.svg | 204 +-
.../cycle_infra/Belgian_traffic_sign_M14.svg | 236 +-
.../cycle_infra/Belgian_traffic_sign_M15.svg | 207 +-
.../cycle_infra/Belgian_traffic_sign_M16.svg | 244 +-
.../cycle_infra/Belgian_traffic_sign_M6.svg | 222 +-
.../cycle_infra/Belgian_traffic_sign_M7.svg | 225 +-
.../cycle_infra/Cycle_barrier_double.svg | 233 +-
.../Cycle_barrier_double_length.svg | 241 +-
.../Cycle_barrier_double_overlap.svg | 253 +-
.../Cycle_barrier_double_template.svg | 269 +-
.../Cycle_barrier_double_width.svg | 241 +-
assets/themes/cycle_infra/bicycleway.svg | 29 +-
assets/themes/cycle_infra/cycle-infra.svg | 460 +-
assets/themes/cycle_infra/street.svg | 33 +-
assets/themes/cyclenodes/logo.svg | 143 +-
assets/themes/cyclestreets/F111.svg | 832 +-
.../cyclofix/fietsambassade_gent_logo.svg | 23 +-
.../fietsambassade_gent_logo_small.svg | 90 +-
assets/themes/cyclofix/logo.svg | 172 +-
.../unused_assets/non_bike_repair_shop.svg | 37 +-
.../cyclofix/unused_assets/non_bike_shop.svg | 226 +-
.../unused_assets/place_with_pump.svg | 51 +-
assets/themes/drinking_water/logo.svg | 115 +-
assets/themes/facadegardens/bloei.svg | 101 +-
assets/themes/facadegardens/bodembedekker.svg | 106 +-
assets/themes/facadegardens/eetbaar.svg | 41 +-
assets/themes/facadegardens/gevelton.svg | 49 +-
assets/themes/facadegardens/geveltuin.svg | 94 +-
assets/themes/facadegardens/halfzon.svg | 44 +-
assets/themes/facadegardens/klimplant.svg | 92 +-
assets/themes/facadegardens/schaduw.svg | 39 +-
assets/themes/facadegardens/struik.svg | 49 +-
assets/themes/facadegardens/zon.svg | 55 +-
assets/themes/fritures/Vegetarian-mark.svg | 36 +-
assets/themes/fritures/fries.svg | 43 +-
assets/themes/fritures/logo.svg | 138 +-
assets/themes/fruit_trees/fruit_tree.svg | 14 +-
assets/themes/ghostbikes/logo.svg | 84 +-
.../themes/grb_import/housenumber_blank.svg | 70 +-
assets/themes/grb_import/warning.svg | 52 +-
assets/themes/hackerspaces/glider.svg | 44 +-
assets/themes/hailhydrant/Twemoji12_1f692.svg | 27 +-
assets/themes/hailhydrant/Twemoji12_1f9ef.svg | 35 +-
assets/themes/hailhydrant/Twemoji12_26d1.svg | 21 +-
assets/themes/hailhydrant/Twemoji_1f691.svg | 32 +-
assets/themes/hailhydrant/hydrant_pillar.svg | 14 +-
.../hailhydrant/hydrant_underground.svg | 14 +-
assets/themes/hailhydrant/hydrant_unknown.svg | 12 +-
assets/themes/hailhydrant/logo.svg | 97 +-
assets/themes/maps/logo.svg | 22 +-
assets/themes/nature/logo.svg | 71 +-
assets/themes/natuurpunt/bench.svg | 15 +-
assets/themes/natuurpunt/birdhide.svg | 15 +-
assets/themes/natuurpunt/drips.svg | 15 +-
assets/themes/natuurpunt/information.svg | 15 +-
.../themes/natuurpunt/information_board.svg | 19 +-
assets/themes/natuurpunt/nature_reserve.svg | 15 +-
assets/themes/natuurpunt/parking.svg | 15 +-
assets/themes/natuurpunt/parkingbike.svg | 27 +-
assets/themes/natuurpunt/parkingmotor.svg | 17 +-
assets/themes/natuurpunt/parkingwheels.svg | 17 +-
assets/themes/natuurpunt/picnic_table.svg | 18 +-
assets/themes/natuurpunt/pushchair.svg | 15 +-
assets/themes/natuurpunt/toilets.svg | 18 +-
assets/themes/natuurpunt/trail.svg | 20 +-
assets/themes/natuurpunt/urinal.svg | 23 +-
assets/themes/natuurpunt/walk_wheelchair.svg | 25 +-
assets/themes/natuurpunt/watermill.svg | 15 +-
assets/themes/natuurpunt/wheelchair.svg | 19 +-
.../themes/openwindpowermap/wind_turbine.svg | 21 +-
assets/themes/parkings/parkings.svg | 73 +-
assets/themes/playgrounds/playground.svg | 8 +-
assets/themes/postal_codes/townhall.svg | 31 +-
assets/themes/postboxes/post_office.svg | 57 +-
assets/themes/postboxes/postbox.svg | 185 +-
assets/themes/shops/shop.svg | 140 +-
assets/themes/speelplekken/logo.svg | 136 +-
assets/themes/speelplekken/speelbos.svg | 24 +-
assets/themes/speelplekken/speeltuin.svg | 86 +-
assets/themes/speelplekken/speelweide.svg | 79 +-
assets/themes/speelplekken/youtube.svg | 70 +-
assets/themes/surveillance/cam_left.svg | 68 +-
assets/themes/surveillance/cam_right.svg | 73 +-
assets/themes/surveillance/dome.svg | 101 +-
assets/themes/surveillance/logo.svg | 68 +-
assets/themes/toilets/toilets.svg | 88 +-
assets/themes/trees/broadleaved.svg | 43 +-
assets/themes/trees/leafless.svg | 56 +-
assets/themes/trees/logo.svg | 69 +-
assets/themes/trees/needleleaved.svg | 39 +-
assets/themes/trees/unknown.svg | 44 +-
.../themes/uk_addresses/housenumber_add.svg | 297 +-
assets/themes/uk_addresses/housenumber_ok.svg | 83 +-
.../themes/uk_addresses/housenumber_text.svg | 80 +-
.../uk_addresses/housenumber_unknown.svg | 77 +-
.../housenumber_unknown_small.svg | 72 +-
assets/themes/waste_basket/waste_basket.svg | 31 +-
dependencies.svg | 15583 ++++++++--------
scripts/resizeSvg.sh | 18 +-
311 files changed, 12176 insertions(+), 31789 deletions(-)
diff --git a/Docs/Misc/geolocation_button.gv.svg b/Docs/Misc/geolocation_button.gv.svg
index 5fd2710d0..fed1344bf 100644
--- a/Docs/Misc/geolocation_button.gv.svg
+++ b/Docs/Misc/geolocation_button.gv.svg
@@ -1,181 +1,330 @@
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/address/housenumber_blank.svg b/assets/layers/address/housenumber_blank.svg
index 3cc6a0b2e..403b819d6 100644
--- a/assets/layers/address/housenumber_blank.svg
+++ b/assets/layers/address/housenumber_blank.svg
@@ -1,63 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/barrier/barrier.svg b/assets/layers/barrier/barrier.svg
index f73d81450..479316583 100644
--- a/assets/layers/barrier/barrier.svg
+++ b/assets/layers/barrier/barrier.svg
@@ -1,16 +1,12 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/layers/bench/bench.svg b/assets/layers/bench/bench.svg
index 7df1d1aa4..a26380a4b 100644
--- a/assets/layers/bench/bench.svg
+++ b/assets/layers/bench/bench.svg
@@ -1,21 +1,16 @@
-
-