Skip to content

Commit

Permalink
Merge pull request #758 from kbevers/udtræk-obs
Browse files Browse the repository at this point in the history
Forbedringer af `fire niv udtræk-observationer`
  • Loading branch information
kbevers authored Jun 17, 2024
2 parents 0d2798c + 9a08644 commit 881007c
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 37 deletions.
30 changes: 29 additions & 1 deletion fire/api/firedb/hent.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,32 @@ def hent_punkter(self, ident: str) -> List[Punkt]:

return result

def hent_punkter_fra_uuid_liste(self, uuids: List[str]):
"""
Hent alle punkter med punkt ID'er matchende listen `uuids`.
Metoden tilbyder en hurtig måde at hente mange punkter ud af databasen på,
når punkternes UUID'er er kendte, fx fra en observationsliste.
"""

def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i : i + n]

punkter = []
# Oracle er begrænset til IN-udtryk med 1000 elementer,
# derfor hentes 1000 punkter ad gangen
for subset in chunks(list(uuids), 1000):
punkter.extend(
self.session.query(Punkt)
.filter(
Punkt.id.in_(subset),
).all()
)

return punkter

def hent_alle_punkter(self) -> List[Punkt]:
return self.session.query(Punkt).all()

Expand Down Expand Up @@ -332,7 +358,9 @@ def hent_srid(self, sridid: str) -> Srid:
SRID ikke findes i databasen.
"""
srid_filter = str(sridid).upper()
return self.session.query(Srid).filter(func.upper(Srid.name) == srid_filter).one()
return (
self.session.query(Srid).filter(func.upper(Srid.name) == srid_filter).one()
)

def hent_srider(self, namespace: Optional[str] = None) -> List[Srid]:
"""
Expand Down
10 changes: 0 additions & 10 deletions fire/api/niv/udtræk_observationer.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,16 +120,6 @@ def klargør_geometrifiler(geometrifiler: Iterable[str]) -> List[Geometry]:
return klargjorte_geometrier


def opstillingspunkter(observationer: Iterable[Observation]) -> List[Punkt]:
"""Returnerer unikke opstillingspunkter for observationerne."""
return list(set(o.opstillingspunkt for o in observationer))


def sigtepunkter(observationer: Iterable[Observation]) -> List[Punkt]:
"""Returnerer unikke sigtepunkter for observationerne."""
return list(set(o.sigtepunkt for o in observationer))


def punkter_til_geojson(data: pd.DataFrame) -> dict:
"""Konvertér punkter til geojson-tekststreng."""
return {
Expand Down
1 change: 1 addition & 0 deletions fire/cli/niv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,7 @@ def obs_feature(
"Målinger": antal_målinger[tuple(sorted([fra, til]))],
"Afstand": observationer.at[i, "L"],
"ΔH": observationer.at[i, "ΔH"],
"Observationstidspunkt": str(observationer.at[i, "Hvornår"]),
# konvertering, da json.dump ikke uderstøtter int64
"Opstillinger": int(observationer.at[i, "Opst"]),
"Journal": observationer.at[i, "Journal"],
Expand Down
33 changes: 16 additions & 17 deletions fire/cli/niv/_udtræk_observationer.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,15 @@
søgefunktioner_med_valgte_metoder,
brug_alle_på_alle,
observationer_inden_for_spredning,
opstillingspunkter,
sigtepunkter,
timestamp,
punkter_til_geojson,
ResultatSæt,
)
import fire.cli
from fire.cli.niv import (
niv as niv_command_group,
er_projekt_okay,
skriv_observationer_geojson,
skriv_punkter_geojson,
)
from fire.typologi import (
adskil_filnavne,
Expand Down Expand Up @@ -309,10 +308,13 @@ def udtræk_observationer(
observationer = list(observationer_inden_for_spredning(resultatsæt, spredning))

fire.cli.print("Indsaml opstillings- og sigtepunkter fra observationer")
opstillings_punkter = opstillingspunkter(observationer)
sigte_punkter = sigtepunkter(observationer)
opstillings_punkter = db.hent_punkter_fra_uuid_liste(
o.opstillingspunktid for o in observationer
)
sigte_punkter = db.hent_punkter_fra_uuid_liste(
o.sigtepunktid for o in observationer
)
punkter = list(set(opstillings_punkter) | set(sigte_punkter))

# Gem resultatet
# --------------

Expand All @@ -334,14 +336,11 @@ def udtræk_observationer(
skriv_data(output, faner)

# GeoJSON primært til hurtig kontrolcheck af resultaternes placering
fire.cli.print(f"Gem punkter som .geojson-fil...")
kolonner = ["Punkt", "Type", "Nord", "Øst"]
flettet = ark_observationer.merge(
ark_punktoversigt[["Punkt", "Nord", "Øst"]],
left_on="Fra",
right_on="Punkt",
)[kolonner]
ofname = f"{projektnavn}-{timestamp()}.geojson"
fire.cli.print(f"Skriver punkter til {ofname} ...")
with open(ofname, "w+") as f:
json.dump(punkter_til_geojson(flettet), f, indent=2)
fire.cli.print(f"Gem punkter og observationer som .geojson-fil...")
skriv_punkter_geojson(projektnavn, ark_punktoversigt, infiks=f"-{timestamp()}")
skriv_observationer_geojson(
projektnavn,
ark_punktoversigt.set_index("Punkt"),
ark_observationer,
infiks=f"-{timestamp()}",
)
9 changes: 0 additions & 9 deletions test/api/niv/test_udtræk_observationer.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
søgefunktioner_med_valgte_metoder,
brug_alle_på_alle,
observationer_inden_for_spredning,
opstillingspunkter,
timestamp,
punkter_til_geojson,
)
Expand Down Expand Up @@ -178,14 +177,6 @@ def test_observationer_inden_for_spredning():
assert result == expected, f"Forventede, at {result!r} var {expected!r}."


def test_opstillingspunkter():
punkter = [Punkt() for _ in range(10)]
observationer = [GK(opstillingspunkt=punkt) for punkt in punkter]
result = set(opstillingspunkter(observationer))
expected = set(punkter)
assert result == expected, f"Forventede, at {result!r} var {expected!r}."


@pytest.mark.freeze_time("2021-11-01T21:21:00")
def test_timestamp_string():
fmt = "%Y-%m-%dT%H%M%S"
Expand Down
28 changes: 28 additions & 0 deletions test/test_punkt.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ def test_hent_punkt(firedb: FireDb, punkt: Punkt):
s = p.sagsevent
assert isinstance(s, Sagsevent)


def test_hent_punkt(firedb: FireDb):
"""
Test at `hent_punkt()` returnerer det eksakte match i tilfælde af der
Expand Down Expand Up @@ -197,6 +198,33 @@ def test_hent_punkt_liste(firedb: FireDb):
assert len(punkter) == 2


def test_hent_punkter_fra_uuid_liste(firedb: FireDb):

identer = ["RDIO", "RDO1", "G.I.1234"]

punkter = firedb.hent_punkter_fra_uuid_liste(
[
"301b8578-8cc8-48a8-8446-541f31482f86", # RDIO
"4b4c5c17-32e8-495d-a598-cdf42e0892de", # RDO1
"4871c57b-d325-45fa-a03a-fdcff49273c0", # G.I.1234
]
)

for punkt in punkter:
assert punkt.ident in identer

# Tjek håndtering af opslag på ikke-eksisterende punkter
punkter = firedb.hent_punkter_fra_uuid_liste(
[
"et-uuid-der-ikke-findes",
"et-andet-uuid-der-ikke-findes",
]
)

# Vi forventer en tom liste her
assert not punkter


def test_soeg_punkter(firedb: FireDb):
punkter = firedb.soeg_punkter("%rd%")

Expand Down

0 comments on commit 881007c

Please sign in to comment.