self.update(features.features))
}
- private addSymbolLayer(sourceId: string, url: string = "./assets/png/oneway.png"){
+ private async addSymbolLayer(sourceId: string, url: string = "./assets/png/oneway.png") {
const map = this._map
const imgId = url.replaceAll(/[/.-]/g, "_")
- map.loadImage(url, (err, image) => {
- if (err) {
- console.error("Could not add symbol layer to line due to", err);
- return
- }
- map.addImage(imgId, image);
- map.addLayer({
- 'id': "symbol-layer"+imgId,
+
+ if (map.getImage(imgId) === undefined) {
+ await new Promise
((resolve, reject) => {
+ map.loadImage(url, (err, image) => {
+ if (err) {
+ console.error("Could not add symbol layer to line due to", err)
+ reject(err)
+ return
+ }
+ map.addImage(imgId, image)
+ resolve()
+ })
+ })
+ }
+
+ map.addLayer({
+ "id": "symbol-layer_" + this._layername + "-" + imgId,
'type': 'symbol',
'source': sourceId,
'layout': {
'symbol-placement': 'line',
- 'symbol-spacing': 1,
+ 'symbol-spacing': 10,
'icon-allow-overlap': true,
'icon-rotation-alignment':'map',
'icon-pitch-alignment':'map',
'icon-image': imgId,
- 'icon-size': 0.045,
+ 'icon-size': 0.055,
'visibility': 'visible'
}
});
- });
+
}
public destruct(): void {
@@ -347,7 +356,13 @@ class LineRenderingLayer {
"line-cap": "round",
},
})
- this.addSymbolLayer(this._layername)
+
+ if(this._layername.startsWith("mapcomplete_ski_piste") || this._layername.startsWith("mapcomplete_aerialway")){
+ // TODO FIXME properly enable this so that more layers can use this if appropriate
+ this.addSymbolLayer(this._layername)
+ }else{
+ console.log("No oneway arrow for", this._layername)
+ }
for (const feature of features) {
diff --git a/src/UI/StatisticsGUI.ts b/src/UI/StatisticsGUI.ts
index 9d27dc5805..8949b715e8 100644
--- a/src/UI/StatisticsGUI.ts
+++ b/src/UI/StatisticsGUI.ts
@@ -16,6 +16,11 @@ import mcChanges from "../../src/assets/generated/themes/mapcomplete-changes.jso
import SvelteUIElement from "./Base/SvelteUIElement"
import Filterview from "./BigComponents/Filterview.svelte"
import FilteredLayer from "../Models/FilteredLayer"
+import DownloadButton from "./DownloadFlow/DownloadButton.svelte"
+import { SubtleButton } from "./Base/SubtleButton"
+import { GeoOperations } from "../Logic/GeoOperations"
+import { Polygon } from "geojson"
+import { Feature } from "geojson"
class StatsticsForOverviewFile extends Combine {
constructor(homeUrl: string, paths: string[]) {
@@ -185,6 +190,17 @@ class StatsticsForOverviewFile extends Combine {
}
}
+
+ elements.push(new SubtleButton(
+ undefined, "Download as csv"
+ ).onClick(() => {
+ const data = GeoOperations.toCSV(overview._meta,
+ {
+ ignoreTags: /^((deletion:node)|(import:node)|(move:node)|(soft-delete:))/
+ })
+ Utils.offerContentsAsDownloadableFile(data , "statistics.csv", {mimetype: "text/csv"})
+ }))
+
return new Combine(elements)
},
[filteredLayer.currentFilter]
@@ -249,7 +265,7 @@ class ChangesetsOverview {
this._meta = Utils.NoNull(meta)
}
- public static fromDirtyData(meta: ChangeSetData[]) {
+ public static fromDirtyData(meta: ChangeSetData[]): ChangesetsOverview {
return new ChangesetsOverview(meta?.map((cs) => ChangesetsOverview.cleanChangesetData(cs)))
}
@@ -301,7 +317,7 @@ class ChangesetsOverview {
}
}
-interface ChangeSetData {
+interface ChangeSetData extends Feature {
id: number
type: "Feature"
geometry: {