diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
index 2274fc3f6f..43c13c03f9 100644
--- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json
+++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
@@ -46,6 +46,12 @@
"en": "Shows all MapComplete changes"
},
"tagRenderings": [
+ {
+ "id": "render_id",
+ "render": {
+ "en": "Changeset {id}"
+ }
+ },
{
"id": "contributor",
"render": {
@@ -73,9 +79,230 @@
"point",
"centroid"
],
- "icon": {"render":"teardrop:#00cc00",
- "mappings": [{"if":"theme=aed","then":"./assets/themes/aed/logo.svg"},{"if":"theme=aed_brugge","then":"./assets/themes/aed/logo.svg"},{"if":"theme=artwork","then":"./assets/themes/artwork/artwork.svg"},{"if":"theme=benches","then":"./assets/themes/benches/bench_poi.svg"},{"if":"theme=bicyclelib","then":"./assets/themes/bicyclelib/logo.svg"},{"if":"theme=binoculars","then":"./assets/layers/binocular/telescope.svg"},{"if":"theme=bookcases","then":"./assets/themes/bookcases/bookcase.svg"},{"if":"theme=buurtnatuur","then":"./assets/themes/buurtnatuur/groen_logo.svg"},{"if":"theme=cafes_and_pubs","then":"./assets/layers/cafe_pub/pub.svg"},{"if":"theme=campersite","then":"./assets/themes/campersite/caravan.svg"},{"if":"theme=charging_stations","then":"./assets/themes/charging_stations/logo.svg"},{"if":"theme=climbing","then":"./assets/themes/climbing/climbing_icon.svg"},{"if":"theme=cycle_highways","then":"./assets/themes/cycle_highways/fietssnelwegen-logo.svg"},{"if":"theme=cycle_infra","then":"./assets/themes/cycle_infra/cycle-infra.svg"},{"if":"theme=cyclenodes","then":"./assets/themes/cyclenodes/logo.svg"},{"if":"theme=cyclestreets","then":"./assets/themes/cyclestreets/F111.svg"},{"if":"theme=cyclofix","then":"./assets/themes/cyclofix/logo.svg"},{"if":"theme=drinking_water","then":"./assets/themes/drinking_water/logo.svg"},{"if":"theme=entrances","then":"./assets/layers/entrance/door.svg"},{"if":"theme=etymology","then":"./assets/layers/etymology/logo.svg"},{"if":"theme=facadegardens","then":"./assets/themes/facadegardens/geveltuin.svg"},{"if":"theme=food","then":"./assets/layers/food/restaurant.svg"},{"if":"theme=fritures","then":"./assets/themes/fritures/logo.svg"},{"if":"theme=fruit_trees","then":"./assets/themes/fruit_trees/fruit_tree.svg"},{"if":"theme=ghostbikes","then":"./assets/themes/ghostbikes/logo.svg"},{"if":"theme=grb","then":"./assets/themes/grb_import/housenumber_blank.svg"},{"if":"theme=grb_fixme","then":"./assets/svg/bug.svg"},{"if":"theme=missing_streets","then":"./assets/svg/robot.svg"},{"if":"theme=hackerspaces","then":"./assets/themes/hackerspaces/glider.svg"},{"if":"theme=hailhydrant","then":"./assets/themes/hailhydrant/logo.svg"},{"if":"theme=mapcomplete-changes","then":"./assets/svg/logo.svg"},{"if":"theme=maps","then":"./assets/themes/maps/logo.svg"},{"if":"theme=nature","then":"./assets/themes/nature/logo.svg"},{"if":"theme=natuurpunt","then":"./assets/themes/natuurpunt/natuurpunt.png"},{"if":"theme=notes","then":"./assets/svg/resolved.svg"},{"if":"theme=observation_towers","then":"./assets/layers/observation_tower/Tower_observation.svg"},{"if":"theme=openwindpowermap","then":"./assets/themes/openwindpowermap/wind_turbine.svg"},{"if":"theme=parkings","then":"./assets/themes/parkings/parkings.svg"},{"if":"theme=personal","then":"./assets/svg/addSmall.svg"},{"if":"theme=play_forests","then":"./assets/layers/play_forest/icon.svg"},{"if":"theme=playgrounds","then":"./assets/themes/playgrounds/playground.svg"},{"if":"theme=postal_codes","then":"./assets/themes/postal_codes/townhall.svg"},{"if":"theme=postboxes","then":"./assets/themes/postboxes/postbox.svg"},{"if":"theme=shops","then":"./assets/themes/shops/shop.svg"},{"if":"theme=sidewalks","then":"./assets/svg/bug.svg"},{"if":"theme=speelplekken","then":"./assets/themes/speelplekken/logo.svg"},{"if":"theme=sport_pitches","then":"./assets/layers/sport_pitch/table_tennis.svg"},{"if":"theme=street_lighting","then":"./assets/layers/street_lamps/street_lamp.svg"},{"if":"theme=street_lighting_assen","then":"./assets/layers/street_lamps/street_lamp.svg"},{"if":"theme=surveillance","then":"./assets/themes/surveillance/logo.svg"},{"if":"theme=toerisme_vlaanderen","then":"./assets/svg/teardrop_with_hole_green.svg"},{"if":"theme=toilets","then":"./assets/themes/toilets/toilets.svg"},{"if":"theme=trees","then":"./assets/themes/trees/logo.svg"},{"if":"theme=uk_addresses","then":"./assets/themes/uk_addresses/housenumber_unknown.svg"},{"if":"theme=waste_basket","then":"./assets/themes/waste_basket/waste_basket.svg"}]
-
+ "icon": {
+ "render": "teardrop:#00cc00",
+ "mappings": [
+ {
+ "if": "theme=aed",
+ "then": "./assets/themes/aed/logo.svg"
+ },
+ {
+ "if": "theme=aed_brugge",
+ "then": "./assets/themes/aed/logo.svg"
+ },
+ {
+ "if": "theme=artwork",
+ "then": "./assets/themes/artwork/artwork.svg"
+ },
+ {
+ "if": "theme=benches",
+ "then": "./assets/themes/benches/bench_poi.svg"
+ },
+ {
+ "if": "theme=bicyclelib",
+ "then": "./assets/themes/bicyclelib/logo.svg"
+ },
+ {
+ "if": "theme=binoculars",
+ "then": "./assets/layers/binocular/telescope.svg"
+ },
+ {
+ "if": "theme=bookcases",
+ "then": "./assets/themes/bookcases/bookcase.svg"
+ },
+ {
+ "if": "theme=buurtnatuur",
+ "then": "./assets/themes/buurtnatuur/groen_logo.svg"
+ },
+ {
+ "if": "theme=cafes_and_pubs",
+ "then": "./assets/layers/cafe_pub/pub.svg"
+ },
+ {
+ "if": "theme=campersite",
+ "then": "./assets/themes/campersite/caravan.svg"
+ },
+ {
+ "if": "theme=charging_stations",
+ "then": "./assets/themes/charging_stations/logo.svg"
+ },
+ {
+ "if": "theme=climbing",
+ "then": "./assets/themes/climbing/climbing_icon.svg"
+ },
+ {
+ "if": "theme=cycle_highways",
+ "then": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg"
+ },
+ {
+ "if": "theme=cycle_infra",
+ "then": "./assets/themes/cycle_infra/cycle-infra.svg"
+ },
+ {
+ "if": "theme=cyclenodes",
+ "then": "./assets/themes/cyclenodes/logo.svg"
+ },
+ {
+ "if": "theme=cyclestreets",
+ "then": "./assets/themes/cyclestreets/F111.svg"
+ },
+ {
+ "if": "theme=cyclofix",
+ "then": "./assets/themes/cyclofix/logo.svg"
+ },
+ {
+ "if": "theme=drinking_water",
+ "then": "./assets/themes/drinking_water/logo.svg"
+ },
+ {
+ "if": "theme=entrances",
+ "then": "./assets/layers/entrance/door.svg"
+ },
+ {
+ "if": "theme=etymology",
+ "then": "./assets/layers/etymology/logo.svg"
+ },
+ {
+ "if": "theme=facadegardens",
+ "then": "./assets/themes/facadegardens/geveltuin.svg"
+ },
+ {
+ "if": "theme=food",
+ "then": "./assets/layers/food/restaurant.svg"
+ },
+ {
+ "if": "theme=fritures",
+ "then": "./assets/themes/fritures/logo.svg"
+ },
+ {
+ "if": "theme=fruit_trees",
+ "then": "./assets/themes/fruit_trees/fruit_tree.svg"
+ },
+ {
+ "if": "theme=ghostbikes",
+ "then": "./assets/themes/ghostbikes/logo.svg"
+ },
+ {
+ "if": "theme=grb",
+ "then": "./assets/themes/grb_import/housenumber_blank.svg"
+ },
+ {
+ "if": "theme=grb_fixme",
+ "then": "./assets/svg/bug.svg"
+ },
+ {
+ "if": "theme=missing_streets",
+ "then": "./assets/svg/robot.svg"
+ },
+ {
+ "if": "theme=hackerspaces",
+ "then": "./assets/themes/hackerspaces/glider.svg"
+ },
+ {
+ "if": "theme=hailhydrant",
+ "then": "./assets/themes/hailhydrant/logo.svg"
+ },
+ {
+ "if": "theme=mapcomplete-changes",
+ "then": "./assets/svg/logo.svg"
+ },
+ {
+ "if": "theme=maps",
+ "then": "./assets/themes/maps/logo.svg"
+ },
+ {
+ "if": "theme=nature",
+ "then": "./assets/themes/nature/logo.svg"
+ },
+ {
+ "if": "theme=natuurpunt",
+ "then": "./assets/themes/natuurpunt/natuurpunt.png"
+ },
+ {
+ "if": "theme=notes",
+ "then": "./assets/svg/resolved.svg"
+ },
+ {
+ "if": "theme=observation_towers",
+ "then": "./assets/layers/observation_tower/Tower_observation.svg"
+ },
+ {
+ "if": "theme=openwindpowermap",
+ "then": "./assets/themes/openwindpowermap/wind_turbine.svg"
+ },
+ {
+ "if": "theme=parkings",
+ "then": "./assets/themes/parkings/parkings.svg"
+ },
+ {
+ "if": "theme=personal",
+ "then": "./assets/svg/addSmall.svg"
+ },
+ {
+ "if": "theme=play_forests",
+ "then": "./assets/layers/play_forest/icon.svg"
+ },
+ {
+ "if": "theme=playgrounds",
+ "then": "./assets/themes/playgrounds/playground.svg"
+ },
+ {
+ "if": "theme=postal_codes",
+ "then": "./assets/themes/postal_codes/townhall.svg"
+ },
+ {
+ "if": "theme=postboxes",
+ "then": "./assets/themes/postboxes/postbox.svg"
+ },
+ {
+ "if": "theme=shops",
+ "then": "./assets/themes/shops/shop.svg"
+ },
+ {
+ "if": "theme=sidewalks",
+ "then": "./assets/svg/bug.svg"
+ },
+ {
+ "if": "theme=speelplekken",
+ "then": "./assets/themes/speelplekken/logo.svg"
+ },
+ {
+ "if": "theme=sport_pitches",
+ "then": "./assets/layers/sport_pitch/table_tennis.svg"
+ },
+ {
+ "if": "theme=street_lighting",
+ "then": "./assets/layers/street_lamps/street_lamp.svg"
+ },
+ {
+ "if": "theme=street_lighting_assen",
+ "then": "./assets/layers/street_lamps/street_lamp.svg"
+ },
+ {
+ "if": "theme=surveillance",
+ "then": "./assets/themes/surveillance/logo.svg"
+ },
+ {
+ "if": "theme=toerisme_vlaanderen",
+ "then": "./assets/svg/teardrop_with_hole_green.svg"
+ },
+ {
+ "if": "theme=toilets",
+ "then": "./assets/themes/toilets/toilets.svg"
+ },
+ {
+ "if": "theme=trees",
+ "then": "./assets/themes/trees/logo.svg"
+ },
+ {
+ "if": "theme=uk_addresses",
+ "then": "./assets/themes/uk_addresses/housenumber_unknown.svg"
+ },
+ {
+ "if": "theme=waste_basket",
+ "then": "./assets/themes/waste_basket/waste_basket.svg"
+ }
+ ]
},
"iconSize": "30,30,bottom"
}
@@ -156,15 +383,16 @@
"_embedded_cs:themes=feat.get('_embedded_cs').map(cs => cs.theme)",
"_embedded_cs:users=feat.get('_embedded_cs').map(cs => cs['_last_edit:contributor'])"
],
- "+mapRendering": [{
- "location": [
- "point"
- ],
- "icon":"statistics:black",
- "iconSize": "30,30,center"
- }]
-
+ "+mapRendering": [
+ {
+ "location": [
+ "point"
+ ],
+ "icon": "statistics:black",
+ "iconSize": "30,30,center"
+ }
+ ]
}
}
]
-}
+}
\ No newline at end of file
diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json
new file mode 100644
index 0000000000..290fd14169
--- /dev/null
+++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json
@@ -0,0 +1,176 @@
+{
+ "id": "mapcomplete-changes",
+ "title": {
+ "en": "Changes made with MapComplete"
+ },
+ "shortDescription": {
+ "en": "Shows changes made by MapComplete"
+ },
+ "description": {
+ "en": "This maps shows all the changes made with MapComplete"
+ },
+ "language": [
+ "en"
+ ],
+ "maintainer": "",
+ "icon": "./assets/svg/logo.svg",
+ "hideFromOverview": true,
+ "version": "0",
+ "startLat": 0,
+ "startLon": 0,
+ "startZoom": 1,
+ "widenFactor": 0.05,
+ "clustering": false,
+ "layers": [
+ {
+ "id": "mapcomplete-changes",
+ "name": {
+ "en": "Changeset centers"
+ },
+ "minzoom": 0,
+ "source": {
+ "osmTags": "editor~*",
+ "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/mapcomplete-changes/tile_{z}_{x}_{y}.geojson",
+ "geoJsonZoomLevel": 8,
+ "maxCacheAge": 0
+ },
+ "calculatedTags": [
+ "_last_edit:contributor:lc:=feat.properties['_last_edit:contributor'].toLowerCase()"
+ ],
+ "title": {
+ "render": {
+ "en": "Changeset for {theme}"
+ }
+ },
+ "description": {
+ "en": "Shows all MapComplete changes"
+ },
+ "tagRenderings": [
+ {
+ "id": "render_id",
+ "render": {
+ "en": "Changeset {id}"
+ }
+ },
+ {
+ "id": "contributor",
+ "render": {
+ "en": "Change made by {_last_edit:contributor}"
+ }
+ },
+ {
+ "id": "theme",
+ "render": {
+ "en": "Change with theme {theme}"
+ },
+ "mappings": [
+ {
+ "if": "theme~http.*",
+ "then": {
+ "en": "Change with unofficial theme {theme}"
+ }
+ }
+ ]
+ }
+ ],
+ "mapRendering": [
+ {
+ "location": [
+ "point",
+ "centroid"
+ ],
+ "icon": {
+ "render": "teardrop:#00cc00"
+ },
+ "iconSize": "30,30,center"
+ }
+ ],
+ "filter": [
+ {
+ "id": "theme-search",
+ "options": [
+ {
+ "osmTags": "theme~.*{search}.*",
+ "fields": [
+ {
+ "name": "search"
+ }
+ ],
+ "question": {
+ "en": "Themename contains {search}"
+ }
+ }
+ ]
+ },
+ {
+ "id": "created_by",
+ "options": [
+ {
+ "osmTags": "_last_edit:contributor:lc~.*{search}.*",
+ "fields": [
+ {
+ "name": "search"
+ }
+ ],
+ "question": {
+ "en": "Made by contributor {search}"
+ }
+ }
+ ]
+ },
+ {
+ "id": "not_created_by",
+ "options": [
+ {
+ "osmTags": "_last_edit:contributor:lc!~.*{search}.*",
+ "fields": [
+ {
+ "name": "search"
+ }
+ ],
+ "question": {
+ "en": "Not made by contributor {search}"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "builtin": "current_view",
+ "override": {
+ "title": "Statistics on changesets in the current view",
+ "tagRenderings": [
+ {
+ "id": "link_to_more",
+ "render": {
+ "en": "More statistics can be found here"
+ }
+ },
+ {
+ "id": "hist_themes",
+ "render": "{histogram(_embedded_cs:themes, Themename, Number of changesets)}"
+ },
+ {
+ "id": "hist_themes",
+ "render": "{histogram(_embedded_cs:users, Contributor, Number of changesets)}"
+ }
+ ],
+ "calculatedTags": [
+ "_embedded_cs=feat.overlapWith('mapcomplete-changes').map(f => f.feat.properties)",
+ "_embedded_cs:themes=feat.get('_embedded_cs').map(cs => cs.theme)",
+ "_embedded_cs:users=feat.get('_embedded_cs').map(cs => cs['_last_edit:contributor'])"
+ ],
+ "+mapRendering": [
+ {
+ "location": [
+ "point"
+ ],
+ "icon": "statistics:black",
+ "iconSize": "30,30,center"
+ }
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/langs/themes/en.json b/langs/themes/en.json
index 488cf5ac7a..9d45eeca75 100644
--- a/langs/themes/en.json
+++ b/langs/themes/en.json
@@ -934,6 +934,65 @@
"shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.",
"title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations."
},
+ "mapcomplete-changes": {
+ "description": "This maps shows all the changes made with MapComplete",
+ "layers": {
+ "0": {
+ "description": "Shows all MapComplete changes",
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Themename contains {search}"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Made by contributor {search}"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Not made by contributor {search}"
+ }
+ }
+ }
+ },
+ "name": "Changeset centers",
+ "tagRenderings": {
+ "contributor": {
+ "render": "Change made by {_last_edit:contributor}"
+ },
+ "theme": {
+ "mappings": {
+ "0": {
+ "then": "Change with unofficial theme {theme}"
+ }
+ },
+ "render": "Change with theme {theme}"
+ }
+ },
+ "title": {
+ "render": "Changeset for {theme}"
+ }
+ },
+ "1": {
+ "override": {
+ "tagRenderings": {
+ "link_to_more": {
+ "render": "More statistics can be found here"
+ }
+ }
+ }
+ }
+ },
+ "shortDescription": "Shows changes made by MapComplete",
+ "title": "Changes made with MapComplete"
+ },
"maps": {
"description": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)
If a map is missing, you can easily map this map on OpenStreetMap.",
"shortDescription": "This theme shows all (touristic) maps that OpenStreetMap knows of",
diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts
index 62923d2bfc..817e32d6c2 100644
--- a/scripts/ScriptUtils.ts
+++ b/scripts/ScriptUtils.ts
@@ -121,7 +121,7 @@ export default class ScriptUtils {
public static getThemeFiles(): { parsed: LayoutConfigJson, path: string }[] {
return ScriptUtils.readDirRecSync("./assets/themes")
- .filter(path => path.endsWith(".json"))
+ .filter(path => path.endsWith(".json") && !path.endsWith(".proto.json"))
.filter(path => path.indexOf("license_info.json") < 0)
.map(path => {
try {
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index 1be2cb556f..f0b63f47fb 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -1,5 +1,5 @@
import ScriptUtils from "./ScriptUtils";
-import {existsSync, mkdirSync, writeFileSync} from "fs";
+import {existsSync, mkdirSync, readFileSync, writeFileSync} from "fs";
import * as licenses from "../assets/generated/license_info.json"
import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson";
import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
@@ -15,16 +15,11 @@ import {Translation} from "../UI/i18n/Translation";
import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson";
import * as questions from "../assets/tagRenderings/questions.json";
import * as icons from "../assets/tagRenderings/icons.json";
+import PointRenderingConfigJson from "../Models/ThemeConfig/Json/PointRenderingConfigJson";
// This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
// It spits out an overview of those to be used to load them
-interface LayersAndThemes {
- themes: LayoutConfigJson[],
- layers: { parsed: LayerConfigJson, path: string }[]
-}
-
-
class LayerOverviewUtils {
writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean }[]) {
@@ -112,15 +107,21 @@ class LayerOverviewUtils {
writeFileSync("./assets/generated/known_layers.json", JSON.stringify(Array.from(sharedLayers.values())))
- /*
- writeFileSync('./assets/themes/mapcomplete-changes/icons-mapping.txt', JSON.stringify(
- Array.from(sharedThemes.values()).map(th => ({
- if: "theme=" + th.id,
- then: th.icon
- }))
- )) //*/
+ {
+ // mapcomplete-changes shows an icon for each corresponding mapcomplete-theme
+ const iconsPerTheme =
+ Array.from(sharedThemes.values()).map(th => ({
+ if: "theme=" + th.id,
+ then: th.icon
+ }))
+ const proto: LayoutConfigJson = JSON.parse(readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", "UTF8"));
+ const protolayer = (proto.layers.filter(l => l["id"] === "mapcomplete-changes")[0])
+ const rendering = (protolayer.mapRendering[0])
+ rendering.icon["mappings"] = iconsPerTheme
+ writeFileSync('./assets/themes/mapcomplete-changes/mapcomplete-changes.json', JSON.stringify(proto, null, " "))
+ }
}
private buildLayerIndex(knownImagePaths: Set): Map {
diff --git a/test/CreateNoteImportLayer.spec.ts b/test/CreateNoteImportLayer.spec.ts
index 9624637b5d..0d98811e6b 100644
--- a/test/CreateNoteImportLayer.spec.ts
+++ b/test/CreateNoteImportLayer.spec.ts
@@ -21,7 +21,7 @@ export default class CreateNoteImportLayerSpec extends T {
const layer = new LayerConfig(layerPrepare.convertStrict(desugaringState, bookcases, "ImportLayerGeneratorTest:Parse bookcases"), "ImportLayerGeneratorTest: init bookcases-layer")
const generator = new CreateNoteImportLayer()
const generatedLayer = generator.convertStrict(desugaringState, layer, "ImportLayerGeneratorTest: convert")
- fs.writeFileSync("bookcases-import-layer.generated.json", JSON.stringify(generatedLayer, null, " "), "utf8")
+ // fs.writeFileSync("bookcases-import-layer.generated.json", JSON.stringify(generatedLayer, null, " "), "utf8")
console.log(JSON.stringify(generatedLayer, null, " "))
}]
]);