Skip to content

Commit fb498e7

Browse files
committed
Add download button and impl
1 parent fa5ae80 commit fb498e7

9 files changed

+99
-75
lines changed

popgetter-browser/rust_backend/pkg/rust_backend.d.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ export class Backend {
3030
downloadGeoms(params_js_value: any): Promise<string>;
3131
/**
3232
* @param {any} data_request_spec_js_value
33+
* @param {string} output_format
3334
* @returns {Promise<string>}
3435
*/
35-
downloadDataRequest(data_request_spec_js_value: any): Promise<string>;
36+
downloadDataRequest(data_request_spec_js_value: any, output_format: string): Promise<string>;
3637
/**
3738
* @param {any} data_request_spec_js_value
3839
* @returns {Promise<string>}
@@ -73,7 +74,7 @@ export interface InitOutput {
7374
readonly backend_downloadMetrics: (a: number, b: number) => number;
7475
readonly backend_downloadMetricsSql: (a: number, b: number) => number;
7576
readonly backend_downloadGeoms: (a: number, b: number) => number;
76-
readonly backend_downloadDataRequest: (a: number, b: number) => number;
77+
readonly backend_downloadDataRequest: (a: number, b: number, c: number, d: number) => number;
7778
readonly backend_downloadDataRequestMetrics: (a: number, b: number) => number;
7879
readonly backend_downloadDataRequestMetricsSql: (a: number, b: number) => number;
7980
readonly backend_downloadDataRequestGeoms: (a: number, b: number) => number;

popgetter-browser/rust_backend/pkg/rust_backend.js

+17-14
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,13 @@ export class Backend {
301301
}
302302
/**
303303
* @param {any} data_request_spec_js_value
304+
* @param {string} output_format
304305
* @returns {Promise<string>}
305306
*/
306-
downloadDataRequest(data_request_spec_js_value) {
307-
const ret = wasm.backend_downloadDataRequest(this.__wbg_ptr, addHeapObject(data_request_spec_js_value));
307+
downloadDataRequest(data_request_spec_js_value, output_format) {
308+
const ptr0 = passStringToWasm0(output_format, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
309+
const len0 = WASM_VECTOR_LEN;
310+
const ret = wasm.backend_downloadDataRequest(this.__wbg_ptr, addHeapObject(data_request_spec_js_value), ptr0, len0);
308311
return takeObject(ret);
309312
}
310313
/**
@@ -405,6 +408,9 @@ async function __wbg_load(module, imports) {
405408
function __wbg_get_imports() {
406409
const imports = {};
407410
imports.wbg = {};
411+
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
412+
takeObject(arg0);
413+
};
408414
imports.wbg.__wbindgen_cb_drop = function(arg0) {
409415
const obj = takeObject(arg0).original;
410416
if (obj.cnt-- == 1) {
@@ -414,8 +420,13 @@ function __wbg_get_imports() {
414420
const ret = false;
415421
return ret;
416422
};
417-
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
418-
takeObject(arg0);
423+
imports.wbg.__wbg_backend_new = function(arg0) {
424+
const ret = Backend.__wrap(arg0);
425+
return addHeapObject(ret);
426+
};
427+
imports.wbg.__wbindgen_error_new = function(arg0, arg1) {
428+
const ret = new Error(getStringFromWasm0(arg0, arg1));
429+
return addHeapObject(ret);
419430
};
420431
imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
421432
const ret = getStringFromWasm0(arg0, arg1);
@@ -429,14 +440,6 @@ function __wbg_get_imports() {
429440
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
430441
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
431442
};
432-
imports.wbg.__wbg_backend_new = function(arg0) {
433-
const ret = Backend.__wrap(arg0);
434-
return addHeapObject(ret);
435-
};
436-
imports.wbg.__wbindgen_error_new = function(arg0, arg1) {
437-
const ret = new Error(getStringFromWasm0(arg0, arg1));
438-
return addHeapObject(ret);
439-
};
440443
imports.wbg.__wbindgen_boolean_get = function(arg0) {
441444
const v = getObject(arg0);
442445
const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2;
@@ -847,8 +850,8 @@ function __wbg_get_imports() {
847850
const ret = wasm.memory;
848851
return addHeapObject(ret);
849852
};
850-
imports.wbg.__wbindgen_closure_wrapper2245 = function(arg0, arg1, arg2) {
851-
const ret = makeMutClosure(arg0, arg1, 955, __wbg_adapter_48);
853+
imports.wbg.__wbindgen_closure_wrapper2497 = function(arg0, arg1, arg2) {
854+
const ret = makeMutClosure(arg0, arg1, 1058, __wbg_adapter_48);
852855
return addHeapObject(ret);
853856
};
854857

Binary file not shown.

popgetter-browser/rust_backend/pkg/rust_backend_bg.wasm.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function backend_search(a: number, b: number, c: number): number;
88
export function backend_downloadMetrics(a: number, b: number): number;
99
export function backend_downloadMetricsSql(a: number, b: number): number;
1010
export function backend_downloadGeoms(a: number, b: number): number;
11-
export function backend_downloadDataRequest(a: number, b: number): number;
11+
export function backend_downloadDataRequest(a: number, b: number, c: number, d: number): number;
1212
export function backend_downloadDataRequestMetrics(a: number, b: number): number;
1313
export function backend_downloadDataRequestMetricsSql(a: number, b: number): number;
1414
export function backend_downloadDataRequestGeoms(a: number, b: number): number;

popgetter-browser/rust_backend/src/lib.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ use wasm_bindgen::prelude::*;
1515
use popgetter::{
1616
config::Config,
1717
data_request_spec::DataRequestSpec,
18-
formatters::{GeoJSONFormatter, OutputGenerator},
18+
formatters::{
19+
CSVFormatter, GeoJSONFormatter, GeoJSONSeqFormatter, OutputFormatter, OutputGenerator,
20+
},
1921
metadata::ExpandedMetadata,
2022
search::{Params, SearchParams, SearchResults},
2123
Popgetter, COL,
@@ -141,7 +143,11 @@ impl Backend {
141143
}
142144

143145
#[wasm_bindgen(js_name = downloadDataRequest)]
144-
pub async fn download_data_request(&mut self, data_request_spec_js_value: JsValue) -> String {
146+
pub async fn download_data_request(
147+
&mut self,
148+
data_request_spec_js_value: JsValue,
149+
output_format: String,
150+
) -> String {
145151
let data_request_spec =
146152
serde_wasm_bindgen::from_value::<DataRequestSpec>(data_request_spec_js_value).unwrap();
147153

@@ -150,7 +156,13 @@ impl Backend {
150156
.download_data_request_spec(&data_request_spec)
151157
.await
152158
.unwrap();
153-
let output_formatter = GeoJSONFormatter;
159+
160+
let output_formatter = match output_format.to_lowercase() {
161+
s if s == "geojson" => OutputFormatter::GeoJSON(GeoJSONFormatter),
162+
s if s == "csv" => OutputFormatter::Csv(CSVFormatter::default()),
163+
s if s == "geojsonseq" => OutputFormatter::GeoJSONSeq(GeoJSONSeqFormatter),
164+
s => panic!("Output formatter ({s}) not supported. Choose one of: 'csv', 'geojson' or 'geojsonseq'")
165+
};
154166
output_formatter.format(&mut geo_df).unwrap()
155167
}
156168

@@ -333,7 +345,7 @@ mod tests {
333345
serde_json::from_str::<DataRequestSpec>(EXAMPLE_DATA_REQUEST_SPEC).unwrap();
334346
let data_request_spec_js_value = serde_wasm_bindgen::to_value(&data_request_spec).unwrap();
335347
let results = backend
336-
.download_data_request(data_request_spec_js_value)
348+
.download_data_request(data_request_spec_js_value, "geojson".to_string())
337349
.await;
338350
info!("{}", results);
339351
}

popgetter-browser/web/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
"flowbite-svelte-icons": "^1.6.2",
6363
"isomorphic-fetch": "^3",
6464
"maplibre-gl": "^4.3.1",
65-
"svelte-maplibre": "git+https://github.com/dabreegster/svelte-maplibre.git#svelte5"
65+
"svelte-maplibre": "git+https://github.com/dabreegster/svelte-maplibre.git#svelte5",
66+
"uuid": "^11.0.3"
6667
},
6768
"type": "module"
6869
}

popgetter-browser/web/pnpm-lock.yaml

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

popgetter-browser/web/src/lib/rust_worker.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,11 @@ export class RustBackend {
113113
return result;
114114
}
115115

116-
async downloadDataRequest(data_request_spec: {}): Promise<String> {
116+
async downloadDataRequest(data_request_spec: {}, outputFormat: string = "geojson"): Promise<String> {
117117
if (!this.inner) {
118118
throw new Error("RustBackend not initialised");
119119
}
120-
const result = JSON.parse(
121-
await this.inner!.downloadDataRequest(data_request_spec),
122-
);
120+
const result = await this.inner!.downloadDataRequest(data_request_spec, outputFormat);
123121
// console.log("RustBackend.getCountries result", result);
124122
return result;
125123
}

popgetter-browser/web/src/routes/DownloadMode.svelte

+49-49
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import { mode } from "./globals";
1515
import Search from "../lib/search.svelte";
1616
import { GeoJSON, FillLayer, LineLayer } from "svelte-maplibre";
17+
import { v4 as uuidv4 } from "uuid";
1718
import {
1819
Button,
1920
Table,
@@ -199,23 +200,37 @@
199200
}
200201
}
201202
202-
async function download(dataRequestSpec: {}): Promise<Array<{}>> {
203+
async function download(dataRequestSpec: {}): Promise<String> {
203204
const loaded = await $rustBackend!.isLoaded();
204205
if (!loaded) {
205206
await $rustBackend!.initialise();
206207
}
207208
try {
208209
// Download directly with backend without range requests as not impl for wasm
209210
console.log(dataRequestSpec);
210-
let metricsAndGeoms =
211-
await $rustBackend!.downloadDataRequest(dataRequestSpec);
211+
let metricsAndGeoms = await $rustBackend!.downloadDataRequest(
212+
dataRequestSpec,
213+
selectedOutputFormat,
214+
);
212215
console.log(metricsAndGeoms);
213216
return metricsAndGeoms;
214217
} catch (err) {
215218
window.alert(`Failed to download: ${err}`);
216219
}
217220
}
218221
222+
function downloadAsFile(content: string) {
223+
let filename = uuidv4() + "." + selectedOutputFormat.toLowerCase();
224+
const blob = new Blob([content], { type: "text/plain" });
225+
const link = document.createElement("a");
226+
link.download = filename;
227+
link.href = URL.createObjectURL(blob);
228+
document.body.appendChild(link);
229+
link.click();
230+
document.body.removeChild(link);
231+
URL.revokeObjectURL(link.href);
232+
}
233+
219234
// For search input
220235
let searchTerm = "";
221236
@@ -279,51 +294,27 @@
279294
280295
async function handleClick() {
281296
// let bboxForRequest = bbox.map((el) => Number(el.toFixed(6)));
282-
// console.log("Bbox", bboxForRequest);
283-
// let dataRequestSpec = {
284-
// region: [{ BoundingBox: bboxForRequest }],
285-
// metrics: [{ MetricId: { id: $previewMetricMap.metric_id } }],
286-
// };
287-
// console.log(dataRequestSpec);
288-
// let gj_out = await download(dataRequestSpec);
289-
// setMinMax(gj_out);
290-
// gj = gj_out;
291-
// console.log($previewMetricMap.metric_parquet_column_name);
292-
// console.log(gj);
293-
// console.log(min);
294-
// console.log(max);
295-
// removeSource();
296-
// // TODO: update to use svelte component
297-
// $map.addSource(sourceData, {
298-
// type: "geojson",
299-
// data: gj,
300-
// });
301-
// $map.addLayer({
302-
// id: sourceFillLayer,
303-
// type: "fill",
304-
// source: sourceData,
305-
// paint: {
306-
// "fill-color": [
307-
// "interpolate",
308-
// ["linear"],
309-
// ["get", String($previewMetricMap.metric_parquet_column_name)],
310-
// 0,
311-
// "#0a0",
312-
// max,
313-
// "#a00",
314-
// ],
315-
// "fill-opacity": 0.5,
316-
// },
317-
// });
318-
// $map.addLayer({
319-
// id: sourceLineLayer,
320-
// type: "line",
321-
// source: sourceData,
322-
// paint: {
323-
// "line-color": "black",
324-
// "line-width": 0.5,
325-
// },
326-
// });
297+
let bboxForRequest = bboxValue;
298+
console.log("Bbox", bboxForRequest);
299+
300+
let dataRequestSpec = {
301+
region: [
302+
{
303+
BoundingBox: bboxForRequest
304+
.split(",")
305+
.map((el) => Number(Number(el).toFixed(6))),
306+
},
307+
],
308+
// metrics: [{ MetricId: { id: $previewMetricMap.metric_id } }],
309+
metrics: $selectedMetricsList.map((metric) => ({
310+
MetricId: {
311+
id: metric.metric_id,
312+
},
313+
})),
314+
};
315+
console.log("DataRequestSpec");
316+
console.log(dataRequestSpec);
317+
downloadAsFile(await download(dataRequestSpec));
327318
}
328319
</script>
329320

@@ -528,7 +519,16 @@
528519
</ButtonGroup>
529520
</Label>
530521
</div>
531-
<!-- TODO: add download button -->
522+
<div
523+
style="text-align: left; margin-top: 0.5%; margin-bottom: 0.5%; "
524+
>
525+
<Button
526+
color="light"
527+
on:click={() => {
528+
handleClick();
529+
}}>Download</Button
530+
>
531+
</div>
532532
</TabItem>
533533
</Tabs>
534534
</Drawer>

0 commit comments

Comments
 (0)