pwaLUPMIS2/LUPMIS2_Workflow_DEAfrica.svg
ekke da6f968725 Zonal-statistics Excel export, COG layer entry point, DE Africa ETL
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>
2026-07-23 16:28:45 +02:00

73 lines
4.7 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: 1680 px across ~11.7 in (~144 px/in), so
40 px = 20 pt. Labels kept terse for legibility from the back of a room. -->
<defs>
<marker id="b1" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 Z" fill="#1E1A4B"/></marker>
<marker id="b2" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 Z" fill="#16A34A"/></marker>
</defs>
<rect width="1680" height="1010" fill="#FFFFFF"/>
<text x="60" y="66" font-size="60" font-weight="bold" fill="#1E1A4B">Digital Earth Africa integration</text>
<text x="60" y="118" font-size="36" fill="#6B7280">One route is live today; the other is a batch step</text>
<!-- CATALOGUE -->
<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">Digital Earth Africa · open and free</text>
<text x="90" y="255" font-size="40" fill="#333333">DEM · slope · imagery · land cover · water · rainfall</text>
<line x1="420" y1="282" x2="420" y2="332" stroke="#16A34A" stroke-width="4" marker-end="url(#b2)"/>
<line x1="1240" y1="282" x2="1240" y2="332" stroke="#1E1A4B" stroke-width="4" marker-end="url(#b1)"/>
<!-- LANE 1 — live WMS -->
<rect x="60" y="332" width="720" height="452" rx="14" fill="#FFFFFF" stroke="#16A34A" stroke-width="3"/>
<rect x="60" y="332" width="720" height="66" rx="14" fill="#16A34A"/>
<text x="90" y="379" font-size="44" font-weight="bold" fill="#FFFFFF">1 — Live WMS</text>
<rect x="92" y="418" width="656" height="78" rx="10" fill="#F0FDF4" stroke="#86EFAC" stroke-width="2"/>
<text x="120" y="470" font-size="40" fill="#166534">DE Africa web service</text>
<line x1="420" y1="496" x2="420" y2="522" stroke="#16A34A" stroke-width="3" marker-end="url(#b2)"/>
<rect x="92" y="522" width="656" height="78" rx="10" fill="#F0FDF4" stroke="#86EFAC" stroke-width="2"/>
<text x="120" y="574" font-size="40" fill="#166534">Added as a map layer</text>
<rect x="92" y="626" width="656" height="78" rx="10" fill="#DCFCE7" stroke="#16A34A" stroke-width="3"/>
<text x="120" y="678" font-size="40" font-weight="bold" fill="#166534">✓ Live in LUPMIS2 today</text>
<text x="120" y="748" font-size="32" fill="#991B1B">A picture only — no pixel values</text>
<!-- LANE 2 — batch ETL -->
<rect x="820" y="332" width="800" height="452" rx="14" fill="#FFFFFF" stroke="#1E1A4B" stroke-width="3"/>
<rect x="820" y="332" width="800" height="66" rx="14" fill="#1E1A4B"/>
<text x="850" y="379" font-size="44" font-weight="bold" fill="#FFFFFF">2 — Batch export</text>
<rect x="852" y="418" width="736" height="70" rx="10" fill="#EEF2FF" stroke="#C7D2FE" stroke-width="2"/>
<text x="880" y="465" font-size="38" fill="#1E1A4B">1. Load in the Sandbox</text>
<line x1="1220" y1="488" x2="1220" y2="510" stroke="#1E1A4B" stroke-width="3" marker-end="url(#b1)"/>
<rect x="852" y="510" width="736" height="70" rx="10" fill="#EEF2FF" stroke="#C7D2FE" stroke-width="2"/>
<text x="880" y="557" font-size="38" fill="#1E1A4B">2. write_cog()</text>
<line x1="1220" y1="580" x2="1220" y2="602" stroke="#1E1A4B" stroke-width="3" marker-end="url(#b1)"/>
<rect x="852" y="602" width="736" height="70" rx="10" fill="#E7F6EF" stroke="#16A34A" stroke-width="3"/>
<text x="880" y="649" font-size="38" font-weight="bold" fill="#0E7A50">3. Upload to MinIO</text>
<line x1="1220" y1="672" x2="1220" y2="694" stroke="#1E1A4B" stroke-width="3" marker-end="url(#b1)"/>
<rect x="852" y="694" width="736" height="70" rx="10" fill="#EEF2FF" stroke="#C7D2FE" stroke-width="2"/>
<text x="880" y="741" font-size="38" fill="#1E1A4B">4. Load as COG</text>
<!-- CONVERGE -->
<line x1="420" y1="784" x2="420" y2="818" stroke="#16A34A" stroke-width="4"/>
<line x1="1220" y1="784" x2="1220" y2="818" stroke="#1E1A4B" stroke-width="4"/>
<line x1="420" y1="818" x2="1220" y2="818" stroke="#1E1A4B" stroke-width="4"/>
<line x1="820" y1="818" x2="820" y2="852" stroke="#16A34A" stroke-width="5" marker-end="url(#b2)"/>
<rect x="310" y="852" width="1020" height="106" rx="14" fill="#1E1A4B"/>
<text x="346" y="905" font-size="46" font-weight="bold" fill="#FFFFFF">LUPMIS2 PWA</text>
<text x="346" y="943" font-size="34" fill="#CADCFC">WMS to view · COG to view and analyse</text>
<text x="60" y="995" font-size="30" fill="#166534" font-weight="bold">Why:</text>
<text x="146" y="995" font-size="30" fill="#6B7280">open, African, no commercial licence question · Sandbox needs no local setup</text>
</svg>