site-intelligence-studio / src /earth_reference.py
Eishaan's picture
Prepare submission-ready Space build
c590d67
Raw
History Blame Contribute Delete
4.65 kB
from __future__ import annotations
from typing import Any
from urllib.parse import quote
from .evidence import make_evidence
from .models import EvidenceItem, SiteSelection
def build_earth_reference(
selection: SiteSelection,
observation_notes: str,
) -> tuple[dict[str, Any], list[EvidenceItem]]:
"""Create safe external satellite/map reference links without using Google as evidence."""
links: dict[str, str] = {}
evidence: list[EvidenceItem] = []
if selection.anchor_lat is not None and selection.anchor_lon is not None:
lat = f"{selection.anchor_lat:.6f}"
lon = f"{selection.anchor_lon:.6f}"
query = quote(f"{lat},{lon}")
links = {
"Google Maps reference": f"https://www.google.com/maps/search/?api=1&query={query}",
"Google Earth reference": f"https://earth.google.com/web/search/{query}",
"OpenStreetMap reference": f"https://www.openstreetmap.org/?mlat={lat}&mlon={lon}#map=17/{lat}/{lon}",
}
evidence.append(
make_evidence(
category="Satellite / Earth reference",
finding="External map and earth-imagery links were generated for visual reference only.",
source_name="Google Maps / Google Earth / OpenStreetMap links",
source_url=links["OpenStreetMap reference"],
source_type="external visual reference",
resolution_or_scope="anchor coordinate link; no imagery was processed by the app",
confidence="low",
limitation="External imagery may be outdated, cloud affected, differently aligned, or too coarse for plot-level evidence.",
design_implication="Use only to guide manual checking of visible roads, water, vegetation, built forms, and site edges.",
verification_needed="Confirm all visible satellite/map observations through site visit or uploaded KML/CAD/GeoJSON.",
output_label="site_visit_required",
)
)
if observation_notes.strip():
evidence.append(
make_evidence(
category="Satellite / Earth reference",
finding="User supplied satellite/Earth/site-observation notes.",
source_name="User observation",
source_url="",
source_type="user-provided",
resolution_or_scope="editable field/reference note",
confidence="medium",
limitation="Not independently verified by the app.",
design_implication="Use as a draft observation layer and verify with photos, site visit, or source drawings.",
verification_needed="Mark which notes came from Google Earth, site visit, faculty drawing, or local observation.",
output_label="user_input",
)
)
return {
"markdown": earth_reference_markdown(links, observation_notes),
"links": links,
}, evidence
def earth_reference_markdown(links: dict[str, str], observation_notes: str) -> str:
lines = [
"### Satellite / Earth Reference",
"",
"This section is a visual-reference workflow, not a satellite-analysis engine. The app does not extract facts from Google imagery. Use these links and notes to check visible site context, then verify on site.",
"",
]
if links:
lines.append("**External references**")
lines.extend(f"- [{label}]({url})" for label, url in links.items())
lines.append("")
else:
lines.append("- External reference links unavailable because no anchor coordinate is available.")
lines.append("")
lines.extend(
[
"**What to inspect manually**",
"",
"- visible trees and canopy",
"- water bodies, drainage lines, and wet edges",
"- existing structures, compound walls, and open ground",
"- access roads, informal paths, and construction nearby",
"- possible slope/drainage signs, shadowed areas, and surrounding heights",
"",
"**Safety note**",
"",
"- Satellite imagery may be outdated or too coarse for small plots.",
"- Google Earth/Maps references are not legal, cadastral, survey, or engineering evidence.",
"- Use KML/KMZ, CAD/DXF, GeoJSON, survey drawings, photos, and site visit to confirm observations.",
]
)
if observation_notes.strip():
lines.extend(["", "**User observation notes**", "", observation_notes.strip()])
return "\n".join(lines)