Excel export (from TWG feedback) - src/analysis/xlsx.js: a dependency-free XLSX writer — an .xlsx is a ZIP of XML, so this packs the required parts with a small stored-ZIP writer. Avoids SheetJS (stale npm package with advisories) and ExcelJS (heavy for an offline-first field app), and does not rely on the JSZip that only reaches us transitively via shp-write. Lazy-loaded as a ~5.6 kB chunk. - After a zonal run the Analysis panel offers "Export table (Excel)", writing a two-sheet workbook: Results (figures as real numbers) and Parameters (zone and input layers with feature counts, the "Apply to" scope, membership rule, statistics, numeric field and export time) — so a table can be verified or reproduced later rather than being an unattributed set of numbers. The button is hidden for overlay runs and cleared when the mode changes. - Verified against two independent readers: openpyxl loads it with zero warnings and correct numeric types, and LibreOffice Calc opens it as a spreadsheet. Also exercised end-to-end through the real zonal pipeline. COG raster entry point - Add External Layer gains a COG type alongside WMS/WFS/XYZ, with a URL pre-flight check that distinguishes a web page, a 404, a CORS block and a server without byte-range support — geotiff.js otherwise reports these only as an opaque "AggregateError: Request failed". Digital Earth Africa ETL - etl/deafrica_dem_to_minio.py exports a DE Africa DEM for a district as a COG and uploads it to the LUSPA MinIO bucket raster-objects, then verifies the object is anonymously readable and range-capable. Credentials come from the environment; the existing PHP integration hardcodes them and an earlier key pair reached Gitea. NOTE: not yet run against the Sandbox — start with --list-products to confirm the DEM product name. Documents - Concept note: Digital Earth Africa added as a raster source (§6.3), separating the live WMS route from the batch Sandbox export; corrected the in-house contour table's provenance to OpenTopography (gdal_contour over an SRTM 30 m / Copernicus 30 m DEM), and added the ToR §2.4.2 / FS §2 alignment chapter. - TWG presentation, architecture and two integration workflow charts (SVG sources kept in the repo so they stay editable), and a user guide for the Analyse tools. Service worker v13 -> v14. .gitignore: exclude Python bytecode from etl/. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
75 lines
4.8 KiB
XML
75 lines
4.8 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1680" height="1010" viewBox="0 0 1680 1010" font-family="Calibri, Arial, sans-serif">
|
|
<!-- Sized for projection: rendered at 1680 px across ~11.7 in of slide
|
|
(~144 px/in), so 40 px = 20 pt, 48 px = 24 pt, 60 px = 30 pt.
|
|
Labels are deliberately terse — detail belongs in the spoken commentary. -->
|
|
<defs>
|
|
<marker id="a1" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
|
|
<path d="M0,0 L8,4 L0,8 Z" fill="#1E1A4B"/></marker>
|
|
<marker id="a2" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
|
|
<path d="M0,0 L8,4 L0,8 Z" fill="#16A34A"/></marker>
|
|
<marker id="a3" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
|
|
<path d="M0,0 L8,4 L0,8 Z" fill="#D97706"/></marker>
|
|
</defs>
|
|
<rect width="1680" height="1010" fill="#FFFFFF"/>
|
|
|
|
<text x="60" y="66" font-size="60" font-weight="bold" fill="#1E1A4B">Google Earth Engine integration</text>
|
|
<text x="60" y="118" font-size="36" fill="#6B7280">A cloud catalogue that can also compute</text>
|
|
|
|
<!-- SOURCE -->
|
|
<rect x="60" y="150" width="1560" height="132" rx="14" fill="#F5F7FF" stroke="#1E1A4B" stroke-width="3"/>
|
|
<text x="90" y="205" font-size="46" font-weight="bold" fill="#1E1A4B">Earth Engine · LUSPA service account</text>
|
|
<text x="90" y="255" font-size="40" fill="#333333">DEM · imagery · land cover · water · rainfall</text>
|
|
|
|
<line x1="440" y1="282" x2="440" y2="332" stroke="#1E1A4B" stroke-width="4" marker-end="url(#a1)"/>
|
|
<line x1="1240" y1="282" x2="1240" y2="332" stroke="#D97706" stroke-width="4" marker-end="url(#a3)"/>
|
|
|
|
<!-- LANE A -->
|
|
<rect x="60" y="332" width="760" height="452" rx="14" fill="#FFFFFF" stroke="#1E1A4B" stroke-width="3"/>
|
|
<rect x="60" y="332" width="760" height="66" rx="14" fill="#1E1A4B"/>
|
|
<text x="90" y="379" font-size="44" font-weight="bold" fill="#FFFFFF">A — Data source</text>
|
|
|
|
<rect x="92" y="418" width="696" height="78" rx="10" fill="#EEF2FF" stroke="#C7D2FE" stroke-width="2"/>
|
|
<text x="120" y="470" font-size="40" fill="#1E1A4B">1. Clip to district</text>
|
|
<line x1="440" y1="496" x2="440" y2="522" stroke="#1E1A4B" stroke-width="3" marker-end="url(#a1)"/>
|
|
|
|
<rect x="92" y="522" width="696" height="78" rx="10" fill="#EEF2FF" stroke="#C7D2FE" stroke-width="2"/>
|
|
<text x="120" y="574" font-size="40" fill="#1E1A4B">2. Export as COG</text>
|
|
<line x1="440" y1="600" x2="440" y2="626" stroke="#1E1A4B" stroke-width="3" marker-end="url(#a1)"/>
|
|
|
|
<rect x="92" y="626" width="696" height="78" rx="10" fill="#E7F6EF" stroke="#16A34A" stroke-width="3"/>
|
|
<text x="120" y="678" font-size="40" font-weight="bold" fill="#0E7A50">3. Publish to MinIO</text>
|
|
|
|
<text x="120" y="748" font-size="32" fill="#6B7280">Or stream tiles directly</text>
|
|
|
|
<!-- LANE B -->
|
|
<rect x="860" y="332" width="760" height="452" rx="14" fill="#FFFFFF" stroke="#D97706" stroke-width="3"/>
|
|
<rect x="860" y="332" width="760" height="66" rx="14" fill="#D97706"/>
|
|
<text x="890" y="379" font-size="44" font-weight="bold" fill="#FFFFFF">B — Compute offload</text>
|
|
|
|
<rect x="892" y="418" width="696" height="78" rx="10" fill="#FFF7ED" stroke="#FDBA74" stroke-width="2"/>
|
|
<text x="920" y="470" font-size="40" fill="#9A3412">1. Send the operation</text>
|
|
<line x1="1240" y1="496" x2="1240" y2="522" stroke="#D97706" stroke-width="3" marker-end="url(#a3)"/>
|
|
|
|
<rect x="892" y="522" width="696" height="78" rx="10" fill="#FFF7ED" stroke="#FDBA74" stroke-width="2"/>
|
|
<text x="920" y="574" font-size="40" fill="#9A3412">2. Google computes it</text>
|
|
<line x1="1240" y1="600" x2="1240" y2="626" stroke="#D97706" stroke-width="3" marker-end="url(#a3)"/>
|
|
|
|
<rect x="892" y="626" width="696" height="78" rx="10" fill="#FFF7ED" stroke="#FDBA74" stroke-width="2"/>
|
|
<text x="920" y="678" font-size="40" fill="#9A3412">3. Return result only</text>
|
|
|
|
<text x="920" y="748" font-size="32" font-weight="bold" fill="#166534">Less load on our server</text>
|
|
|
|
<!-- CONVERGE -->
|
|
<line x1="440" y1="784" x2="440" y2="818" stroke="#1E1A4B" stroke-width="4"/>
|
|
<line x1="1240" y1="784" x2="1240" y2="818" stroke="#D97706" stroke-width="4"/>
|
|
<line x1="440" y1="818" x2="1240" y2="818" stroke="#1E1A4B" stroke-width="4"/>
|
|
<line x1="840" y1="818" x2="840" y2="852" stroke="#16A34A" stroke-width="5" marker-end="url(#a2)"/>
|
|
|
|
<rect x="330" y="852" width="1020" height="106" rx="14" fill="#1E1A4B"/>
|
|
<text x="366" y="905" font-size="46" font-weight="bold" fill="#FFFFFF">LUPMIS2 PWA</text>
|
|
<text x="366" y="943" font-size="34" fill="#CADCFC">Display · analysis · cached offline</text>
|
|
|
|
<text x="60" y="995" font-size="30" fill="#DC2626" font-weight="bold">Needs:</text>
|
|
<text x="172" y="995" font-size="30" fill="#6B7280">connectivity · Google quotas · licence check for government use</text>
|
|
</svg>
|