fix(map): honor raster coverage and temporal dates
This commit is contained in:
@@ -32,6 +32,37 @@ class TemporalAnalysisService:
|
||||
"provision_regional_grb_context.py",
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _canonical_observation_snapshots(datasets: list[Dataset]) -> list[Dataset]:
|
||||
by_observation: dict[datetime, Dataset] = {}
|
||||
for dataset in datasets:
|
||||
if dataset.observed_at is None:
|
||||
continue
|
||||
current = by_observation.get(dataset.observed_at)
|
||||
dataset_recency = max(
|
||||
(
|
||||
value.timestamp()
|
||||
for value in (dataset.imported_at, dataset.updated_at, dataset.created_at)
|
||||
if value is not None
|
||||
),
|
||||
default=0.0,
|
||||
)
|
||||
current_recency = max(
|
||||
(
|
||||
value.timestamp()
|
||||
for value in (
|
||||
getattr(current, "imported_at", None),
|
||||
getattr(current, "updated_at", None),
|
||||
getattr(current, "created_at", None),
|
||||
)
|
||||
if value is not None
|
||||
),
|
||||
default=0.0,
|
||||
)
|
||||
if current is None or (dataset_recency, str(dataset.id)) > (current_recency, str(current.id)):
|
||||
by_observation[dataset.observed_at] = dataset
|
||||
return sorted(by_observation.values(), key=lambda item: item.observed_at)
|
||||
|
||||
@staticmethod
|
||||
def list_series(db: Session, project_id: UUID) -> list[TemporalSeriesRead]:
|
||||
rows = (
|
||||
@@ -49,6 +80,7 @@ class TemporalAnalysisService:
|
||||
|
||||
result: list[TemporalSeriesRead] = []
|
||||
for key, datasets in grouped.items():
|
||||
datasets = TemporalAnalysisService._canonical_observation_snapshots(datasets)
|
||||
observed = [item.observed_at for item in datasets if item.observed_at is not None]
|
||||
if not observed:
|
||||
continue
|
||||
@@ -118,6 +150,13 @@ class TemporalAnalysisService:
|
||||
bbox,
|
||||
selection_area.geometry,
|
||||
)
|
||||
|
||||
def is_preclipped_to_selection_area(dataset: Dataset) -> bool:
|
||||
return bool(
|
||||
selection_area
|
||||
and VectorFeatureService.can_use_full_area_fast_path(dataset, selection_area.id)
|
||||
)
|
||||
|
||||
summaries: dict[UUID, dict[str, Any]] = {}
|
||||
|
||||
def summarize(dataset: Dataset) -> dict[str, Any]:
|
||||
@@ -126,14 +165,9 @@ class TemporalAnalysisService:
|
||||
return cached
|
||||
kwargs: dict[str, Any] = {"dataset": dataset, "bbox": bbox}
|
||||
if selection_area is not None:
|
||||
kwargs["selection_geometry"] = selection_geometry
|
||||
kwargs["full_dataset_area"] = (
|
||||
selection_covers_full_area
|
||||
and VectorFeatureService.can_use_full_area_fast_path(
|
||||
dataset,
|
||||
selection_area.id,
|
||||
)
|
||||
)
|
||||
dataset_is_preclipped = is_preclipped_to_selection_area(dataset)
|
||||
kwargs["selection_geometry"] = None if dataset_is_preclipped else selection_geometry
|
||||
kwargs["full_dataset_area"] = selection_covers_full_area and dataset_is_preclipped
|
||||
summary = VectorFeatureService.summarize_features_by_bbox(db, **kwargs)
|
||||
summaries[dataset.id] = summary
|
||||
return summary
|
||||
@@ -164,16 +198,20 @@ class TemporalAnalysisService:
|
||||
later=later,
|
||||
bbox=bbox,
|
||||
preview_limit=payload.preview_limit,
|
||||
selection_geometry=selection_geometry,
|
||||
selection_geometry=(
|
||||
None
|
||||
if is_preclipped_to_selection_area(earlier) and is_preclipped_to_selection_area(later)
|
||||
else selection_geometry
|
||||
),
|
||||
earlier_full_dataset_area=(
|
||||
selection_covers_full_area
|
||||
and VectorFeatureService.can_use_full_area_fast_path(earlier, selection_area.id)
|
||||
and is_preclipped_to_selection_area(earlier)
|
||||
if selection_area is not None
|
||||
else False
|
||||
),
|
||||
later_full_dataset_area=(
|
||||
selection_covers_full_area
|
||||
and VectorFeatureService.can_use_full_area_fast_path(later, selection_area.id)
|
||||
and is_preclipped_to_selection_area(later)
|
||||
if selection_area is not None
|
||||
else False
|
||||
),
|
||||
@@ -298,8 +336,7 @@ class TemporalAnalysisService:
|
||||
)
|
||||
else:
|
||||
datasets = fallback_datasets
|
||||
unique = {dataset.id: dataset for dataset in datasets}
|
||||
ordered = sorted(unique.values(), key=lambda item: item.observed_at or datetime.min.replace(tzinfo=timezone.utc))
|
||||
ordered = TemporalAnalysisService._canonical_observation_snapshots(datasets)
|
||||
observations: list[TemporalObservation] = []
|
||||
for dataset in ordered:
|
||||
if dataset.observed_at is None:
|
||||
|
||||
Reference in New Issue
Block a user