Add QA evidence map overlay
This commit is contained in:
@@ -176,6 +176,11 @@ interface MapWorkspaceProps {
|
||||
selectedMapAreaId: string
|
||||
areaFeatureCollection: GeoJSON.FeatureCollection | null
|
||||
mapFeatureCollection: GeoJSON.FeatureCollection | null
|
||||
qualityEvidenceGeoJson?: GeoJSON.FeatureCollection | null
|
||||
qualityEvidenceFeatureCount?: number
|
||||
qualityEvidenceLoading?: boolean
|
||||
qualityEvidenceError?: string | null
|
||||
qualityEvidenceWarnings?: string[]
|
||||
mapLayerLabel: string
|
||||
mapLayerSourceLabel: string
|
||||
mapLayerProvenance: string
|
||||
@@ -219,6 +224,7 @@ interface MapWorkspaceProps {
|
||||
onSelectMapQaReferenceDataset: (datasetId: string) => void
|
||||
onRunMapSelectionQa: () => void
|
||||
onOpenMapSelectionQualityEvidence: () => void
|
||||
onClearQualityEvidence?: () => void
|
||||
}
|
||||
|
||||
export function MapWorkspace({
|
||||
@@ -226,6 +232,11 @@ export function MapWorkspace({
|
||||
selectedMapAreaId,
|
||||
areaFeatureCollection,
|
||||
mapFeatureCollection,
|
||||
qualityEvidenceGeoJson = null,
|
||||
qualityEvidenceFeatureCount = 0,
|
||||
qualityEvidenceLoading = false,
|
||||
qualityEvidenceError = null,
|
||||
qualityEvidenceWarnings = [],
|
||||
mapLayerLabel,
|
||||
mapLayerSourceLabel,
|
||||
mapLayerProvenance,
|
||||
@@ -269,6 +280,7 @@ export function MapWorkspace({
|
||||
onSelectMapQaReferenceDataset,
|
||||
onRunMapSelectionQa,
|
||||
onOpenMapSelectionQualityEvidence,
|
||||
onClearQualityEvidence,
|
||||
}: MapWorkspaceProps): JSX.Element {
|
||||
const [bboxSelectionMode, setBboxSelectionMode] = useState(false)
|
||||
const [firstSelectionCorner, setFirstSelectionCorner] = useState<[number, number] | null>(null)
|
||||
@@ -398,6 +410,11 @@ export function MapWorkspace({
|
||||
<strong>{mapFeatureCollection ? `${mapFeatureCount} rendered features` : 'No layer rendered'}</strong>
|
||||
<small>{mapLayerProvenance}</small>
|
||||
</div>
|
||||
<div>
|
||||
<span>QA/QC evidence</span>
|
||||
<strong>{qualityEvidenceGeoJson ? `${qualityEvidenceFeatureCount} evidence features` : 'No evidence overlay'}</strong>
|
||||
<small>{qualityEvidenceLoading ? 'Loading persisted evidence' : 'Matches, false positives and false negatives'}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="map-control-surface" aria-label="Map workspace controls">
|
||||
@@ -483,9 +500,37 @@ export function MapWorkspace({
|
||||
<span>Draw state</span>
|
||||
<strong>{mapFeatureCollection ? `${mapFeatureCount} rendered features` : 'No active vector or result layer'}</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>QA evidence overlay</span>
|
||||
<strong>{qualityEvidenceGeoJson ? `${qualityEvidenceFeatureCount} rendered` : 'off'}</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{qualityEvidenceGeoJson || qualityEvidenceError || qualityEvidenceWarnings.length > 0 ? (
|
||||
<div className="qa-evidence-map-status" aria-label="QA/QC evidence map overlay status">
|
||||
<div>
|
||||
<span>QA/QC evidence overlay</span>
|
||||
<strong>{qualityEvidenceGeoJson ? `${qualityEvidenceFeatureCount} persisted features` : 'Not loaded'}</strong>
|
||||
{qualityEvidenceError ? <p className="error">{qualityEvidenceError}</p> : null}
|
||||
{qualityEvidenceWarnings.length > 0 ? (
|
||||
<p className="muted">{qualityEvidenceWarnings.length} evidence id{qualityEvidenceWarnings.length === 1 ? '' : 's'} could not be resolved.</p>
|
||||
) : null}
|
||||
</div>
|
||||
<div className="qa-evidence-legend" aria-label="QA/QC evidence overlay legend">
|
||||
<span><i className="qa-evidence-swatch qa-evidence-swatch-match-candidate" /> Match candidate</span>
|
||||
<span><i className="qa-evidence-swatch qa-evidence-swatch-match-reference" /> Match reference</span>
|
||||
<span><i className="qa-evidence-swatch qa-evidence-swatch-false-positive" /> False positive</span>
|
||||
<span><i className="qa-evidence-swatch qa-evidence-swatch-false-negative" /> False negative</span>
|
||||
</div>
|
||||
{onClearQualityEvidence ? (
|
||||
<button className="secondary-action" type="button" onClick={onClearQualityEvidence}>
|
||||
Clear QA evidence
|
||||
</button>
|
||||
) : null}
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{!mapFeatureCollection ? (
|
||||
<div className="empty-state map-empty-state">
|
||||
<strong>No active vector or result layer</strong>
|
||||
@@ -514,6 +559,7 @@ export function MapWorkspace({
|
||||
areaData={areaFeatureCollection}
|
||||
selectedFeature={selectedFeature}
|
||||
selectionData={mapSelectionResult?.geojson ?? null}
|
||||
qaEvidenceData={qualityEvidenceGeoJson}
|
||||
selectionBbox={mapSelectionBbox}
|
||||
bboxSelectionMode={bboxSelectionMode}
|
||||
visible={mapLayerVisible}
|
||||
|
||||
Reference in New Issue
Block a user