feat: add temporal Mol explorer
This commit is contained in:
@@ -77,6 +77,7 @@ from .operations import (
|
||||
VectorSelectionDeriveRequest,
|
||||
VectorSelectionRequest,
|
||||
VectorSelectionResponse,
|
||||
VectorSelectionSummary,
|
||||
VectorStatsRequest,
|
||||
VectorStatsResponse,
|
||||
)
|
||||
@@ -134,6 +135,7 @@ __all__ = [
|
||||
"VectorSelectionDeriveRequest",
|
||||
"VectorSelectionRequest",
|
||||
"VectorSelectionResponse",
|
||||
"VectorSelectionSummary",
|
||||
"RasterClipRequest",
|
||||
"RasterStatsResponse",
|
||||
"RasterReprojectRequest",
|
||||
|
||||
@@ -36,6 +36,12 @@ class DatasetCreateResponse(BaseModel):
|
||||
source_metadata: dict | None = None
|
||||
provenance_metadata: dict | None = None
|
||||
imported_at: datetime | None = None
|
||||
temporal_series_key: str | None = None
|
||||
observed_at: datetime | None = None
|
||||
valid_from: datetime | None = None
|
||||
valid_to: datetime | None = None
|
||||
temporal_granularity: str | None = None
|
||||
source_version: str | None = None
|
||||
project_id: UUID
|
||||
area_id: UUID | None = None
|
||||
storage_path: str | None = None
|
||||
@@ -70,6 +76,32 @@ class DatasetMetadataRefresh(BaseModel):
|
||||
crs: str | None = None
|
||||
|
||||
|
||||
class DatasetTemporalUpdate(BaseModel):
|
||||
temporal_series_key: str
|
||||
observed_at: datetime
|
||||
valid_from: datetime | None = None
|
||||
valid_to: datetime | None = None
|
||||
temporal_granularity: str = "snapshot"
|
||||
source_version: str | None = None
|
||||
|
||||
|
||||
class DatasetVersionRead(BaseModel):
|
||||
id: UUID
|
||||
dataset_id: UUID
|
||||
version: int
|
||||
storage_path: str | None = None
|
||||
source_version: str | None = None
|
||||
observed_at: datetime | None = None
|
||||
valid_from: datetime | None = None
|
||||
valid_to: datetime | None = None
|
||||
checksum_sha256: str | None = None
|
||||
source_metadata: dict | None = None
|
||||
provenance_metadata: dict | None = None
|
||||
created_at: datetime | None = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class ExportRequest(BaseModel):
|
||||
dataset_id: UUID
|
||||
name: str | None = None
|
||||
|
||||
@@ -217,6 +217,16 @@ class VectorSelectionDeriveRequest(VectorSelectionRequest):
|
||||
output_name: str | None = None
|
||||
|
||||
|
||||
class VectorSelectionSummary(BaseModel):
|
||||
metric_label: str
|
||||
metric_value: float
|
||||
metric_unit: str
|
||||
aggregation_method: str
|
||||
feature_count: int
|
||||
is_estimate: bool = False
|
||||
warning: str | None = None
|
||||
|
||||
|
||||
class VectorSelectionResponse(BaseModel):
|
||||
selection_bbox: VectorSelectionBBox
|
||||
feature_count: int
|
||||
@@ -224,3 +234,4 @@ class VectorSelectionResponse(BaseModel):
|
||||
limit: int
|
||||
truncated: bool
|
||||
geojson: dict
|
||||
summary: VectorSelectionSummary | None = None
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.schemas.operations import VectorSelectionBBox
|
||||
|
||||
|
||||
class TemporalComparisonRequest(BaseModel):
|
||||
earlier_dataset_id: UUID
|
||||
later_dataset_id: UUID
|
||||
bbox: VectorSelectionBBox
|
||||
preview_limit: int = Field(default=500, ge=1, le=1000)
|
||||
|
||||
|
||||
class TemporalDatasetRef(BaseModel):
|
||||
id: UUID
|
||||
name: str
|
||||
observed_at: datetime
|
||||
source_version: str | None = None
|
||||
|
||||
|
||||
class TemporalMetricComparison(BaseModel):
|
||||
label: str
|
||||
unit: str
|
||||
aggregation_method: str
|
||||
earlier_value: float
|
||||
later_value: float
|
||||
absolute_change: float
|
||||
percent_change: float | None = None
|
||||
is_estimate: bool = False
|
||||
|
||||
|
||||
class TemporalObjectChanges(BaseModel):
|
||||
available: bool
|
||||
added_count: int | None = None
|
||||
removed_count: int | None = None
|
||||
modified_count: int | None = None
|
||||
unchanged_count: int | None = None
|
||||
|
||||
|
||||
class TemporalComparisonResponse(BaseModel):
|
||||
temporal_series_key: str
|
||||
earlier: TemporalDatasetRef
|
||||
later: TemporalDatasetRef
|
||||
selection_bbox: VectorSelectionBBox
|
||||
metric: TemporalMetricComparison
|
||||
object_changes: TemporalObjectChanges
|
||||
geojson: dict
|
||||
warnings: list[str]
|
||||
generated_at: datetime
|
||||
|
||||
|
||||
class TemporalSeriesDataset(BaseModel):
|
||||
id: UUID
|
||||
name: str
|
||||
observed_at: datetime
|
||||
source_version: str | None = None
|
||||
feature_count: int | None = None
|
||||
|
||||
|
||||
class TemporalSeriesRead(BaseModel):
|
||||
temporal_series_key: str
|
||||
source_name: str | None = None
|
||||
reference_layer_name: str | None = None
|
||||
dataset_count: int
|
||||
first_observed_at: datetime
|
||||
last_observed_at: datetime
|
||||
datasets: list[TemporalSeriesDataset]
|
||||
Reference in New Issue
Block a user