From 0d8e04f9e02ab5985d734131062a357c17c24f84 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 26 Jun 2021 10:58:26 +0200 Subject: [PATCH] Anpassung Koordinatenberechnung --- .../detection/EarthquakeLocation.java | 7 +-- .../detection/detektion/Erdbeben.java | 19 +++--- .../berechnung/EpizentrumRechnung.java | 61 +++++++++++++------ 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/de/edotzlaff/detection/EarthquakeLocation.java b/app/src/main/java/de/edotzlaff/detection/EarthquakeLocation.java index ae6949f..1300d4c 100644 --- a/app/src/main/java/de/edotzlaff/detection/EarthquakeLocation.java +++ b/app/src/main/java/de/edotzlaff/detection/EarthquakeLocation.java @@ -126,12 +126,11 @@ public class EarthquakeLocation extends FragmentActivity implements OnMapReadyCa @RequiresApi(api = Build.VERSION_CODES.O) public Epizentrum ermittleEpizentrum(DataSnapshot data) { + Log.i(TAGEPIZENTRUM, "Start Ermittle Epizentrum"); Erdbeben erdbeben = new Erdbeben(); erdbeben.addDetektionssignalList(mapToDetektionssignale(data)); - Epizentrum epizentrum = new Epizentrum(); - epizentrum = erdbeben.ermittleEpizentrum(); - + Epizentrum epizentrum = erdbeben.ermittleEpizentrum(); if(Objects.isNull(epizentrum)) { System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!Kein Epizentrum vorhanden!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); @@ -146,6 +145,7 @@ public class EarthquakeLocation extends FragmentActivity implements OnMapReadyCa } + @RequiresApi(api = Build.VERSION_CODES.O) public ArrayList mapToDetektionssignale(DataSnapshot data) { @@ -178,7 +178,6 @@ public class EarthquakeLocation extends FragmentActivity implements OnMapReadyCa detektionssignale.add(detektionssignal); } - System.out.println("detektionsingale size: " + detektionssignale.size()); return detektionssignale; } diff --git a/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java b/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java index 7b502ab..afc2e02 100644 --- a/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java +++ b/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java @@ -2,6 +2,8 @@ package de.edotzlaff.detection.detektion; import android.os.Build; +import android.util.Log; + import androidx.annotation.RequiresApi; import de.edotzlaff.detection.detektion.berechnung.Endpunkt; import de.edotzlaff.detection.detektion.berechnung.EndpunktVerbindung; @@ -15,12 +17,13 @@ import java.util.Objects; public class Erdbeben { //ToDO anpassen an Szenario umso mehr umso wahrscheinlich ein Ergebnis, oder Abbruchbedingung mit do while - public static final Integer SCHLEIFENDURCHLAUFTE = 5000; - + public static final Integer SCHLEIFENDURCHLAUFTE = 8000; + private static final String TAG = "ERDBEBEN"; private Epizentrum epizentrum; private EpizentrumRechnung epizentrumRechnung; private HashMap nutzerDaten; + private Detektionssignal erstesDetektionssignal; public Erdbeben() { @@ -38,8 +41,9 @@ public class Erdbeben { { for (int i = 0; i< detektionssignale.size(); i++) { - nutzerDaten.put(detektionssignale.get(i).getDeviceId(),detektionssignale.get(i)); + nutzerDaten.put(detektionssignale.get(i).getDeviceId()+"i",detektionssignale.get(i)); } + Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size()); } @RequiresApi(api = Build.VERSION_CODES.O) @@ -48,7 +52,9 @@ public class Erdbeben { ArrayList rechenListe = new ArrayList<>(); nutzerDaten.forEach((key, value) -> rechenListe.add(value)); //Initialisierung der Rechung - First Element mit delta r + alle möglichen EndpunktKombinationen (einfach) - ArrayList berechnungsEndpunkte = epizentrumRechnung.initEndpunkte(rechenListe); + erstesDetektionssignal = epizentrumRechnung.ermittleErstesDetektionssignal(rechenListe); + ArrayList berechnungsEndpunkte = epizentrumRechnung.initEndpunkte(rechenListe, erstesDetektionssignal); + ArrayList endpunktKonbinationen = epizentrumRechnung.ermittleEndpunktKonbinationen(berechnungsEndpunkte); //ToDo Vernünftiger Endpunkt überlegen bzw. bis wann abgebrochen wird -> Umzug in Berechnungs @@ -57,10 +63,7 @@ public class Erdbeben { epizentrum = epizentrumRechnung.ueberpruefeObEpizentrum(endpunktKonbinationen); //ToDo set EnstehungsZeitpunkt -> (Bezugszeit, Koord, Koord, v;) if (!Objects.isNull(epizentrum)) { - System.out.println("Epizentrum ermittelt"); - epizentrum.setEntstehungsZeitpunkt( - epizentrumRechnung.berechneEntstehungsZeitpunktLongLatt( - nutzerDaten.get(berechnungsEndpunkte.get(0).getNutzer()), epizentrum.getKoordinaten())); + epizentrum.setEntstehungsZeitpunkt(epizentrumRechnung.berechneEntstehungsZeitpunktLongLatt(erstesDetektionssignal, epizentrum.getKoordinaten())); return epizentrum; } } diff --git a/app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java b/app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java index 16e10e0..b74aec5 100644 --- a/app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java +++ b/app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java @@ -3,9 +3,12 @@ package de.edotzlaff.detection.detektion.berechnung; import android.location.Location; import android.os.Build; +import android.util.Log; + import androidx.annotation.RequiresApi; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; + import de.edotzlaff.detection.detektion.Detektionssignal; import de.edotzlaff.detection.detektion.Epizentrum; import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten; @@ -22,32 +25,46 @@ import java.util.Set; public class EpizentrumRechnung { //ToDo Schrittweite und Abstand auf Szenario anpassen - private static final double SCHRITTWEITE = 0.0001; - private static final double MAX_ABSTAND = 0.001; - private static final int DOUBLESTELLEN = 8; + private static final double SCHRITTWEITE = 0.000050; + private static final double MAX_ABSTAND = 0.000058; + private static final int DOUBLESTELLEN = 24; + private static final int SCHLEIFENDURCHLAUFTE = 5000; + + private static final String TAG = "EPIZENTRUMRECHNUNG"; @RequiresApi(api = Build.VERSION_CODES.O) - public ArrayList initEndpunkte(ArrayList detektionssignal) { - Detektionssignal nahegelegensteMessung = detektionssignal.get(0); + public ArrayList initEndpunkte(ArrayList detektionssignal, Detektionssignal ersteMessung) { ArrayList arrBerechnungsObjekte = new ArrayList<>(); - for (int i = 1; i < detektionssignal.size(); i++) { - if (detektionssignal.get(i).getAnkunftsZeit().isBefore(nahegelegensteMessung.getAnkunftsZeit())) { - nahegelegensteMessung = detektionssignal.get(i); - } - } for (Detektionssignal aufzeichnung : detektionssignal) { int zeitunterschied = aufzeichnung.getAnkunftsZeit().getHour() * 3600 + aufzeichnung.getAnkunftsZeit().getMinute() * 60 + aufzeichnung.getAnkunftsZeit().getSecond() - - nahegelegensteMessung.getAnkunftsZeit().getHour() * 3600 - nahegelegensteMessung.getAnkunftsZeit().getMinute() * 60 - nahegelegensteMessung.getAnkunftsZeit().getSecond(); - double startradius = zeitunterschied * aufzeichnung.getGeschwErdbeben(); + - ersteMessung.getAnkunftsZeit().getHour() * 3600 - ersteMessung.getAnkunftsZeit().getMinute() * 60 - ersteMessung.getAnkunftsZeit().getSecond(); + + double startradius = zeitunterschied * aufzeichnung.getGeschwErdbeben()*0.0000114130224932113000000; + + Log.i(TAG, "Init Daten: " + aufzeichnung.getDeviceId() + "Startradius: " + startradius); Endpunkt tempEndpunkt = new Endpunkt(aufzeichnung.getDeviceId()); Kreis k = new Kreis(aufzeichnung.getKoordinaten().getX(), aufzeichnung.getKoordinaten().getY(), startradius); tempEndpunkt.setKreis(k); arrBerechnungsObjekte.add(tempEndpunkt); } + + Log.i(TAG, "Daten Erfolgreich initialisiert"); return arrBerechnungsObjekte; } + @RequiresApi(api = Build.VERSION_CODES.O) + public Detektionssignal ermittleErstesDetektionssignal(ArrayList detektionssignale) + { + Detektionssignal erstesDetektionssignal = detektionssignale.get(0); + for (int i = 1; i < detektionssignale.size(); i++) { + if (detektionssignale.get(i).getAnkunftsZeit().isBefore(erstesDetektionssignal.getAnkunftsZeit())) { + erstesDetektionssignal = detektionssignale.get(i); + } + } + return erstesDetektionssignal; + } + public ArrayList berechneKreisSchnittpunkte(Kreis kreis1, Kreis kreis2) { ArrayList schnittpunkte = new ArrayList<>(); @@ -86,8 +103,8 @@ public class EpizentrumRechnung { } public boolean genuegendSchnittpunktevorhanden(ArrayList endpunktVerbindungen) { - System.out.println("<<<<<<<<<<<<<<<<<<<<< templist; templist = berechneKreisSchnittpunkte(endpunktVerbindung.getEndpunkt1().getKreis(), endpunktVerbindung.getEndpunkt2().getKreis()); @@ -100,7 +117,6 @@ public class EpizentrumRechnung { } public Epizentrum ueberpruefeObEpizentrum(ArrayList endpunktVerbindungen) { - int counter; ArrayList schnittpunkte = new ArrayList<>(); @@ -120,7 +136,9 @@ public class EpizentrumRechnung { if (counter == endpunktVerbindungen.size() - 1) { schnittpunkte.add(s1); Epizentrum tempEpizentrum = new Epizentrum(); - tempEpizentrum.setKoordinaten(berechneEpizentrumKoordinaten(schnittpunkte)); + Koordinaten koordinaten = (berechneEpizentrumKoordinaten(schnittpunkte)); + tempEpizentrum.setKoordinaten(koordinaten); + Log.i(TAG, "Epizentrumkoord: " + tempEpizentrum.getKoordinaten().getX() + " " + tempEpizentrum.getKoordinaten().getY()); return tempEpizentrum; } } @@ -130,17 +148,20 @@ public class EpizentrumRechnung { } public Koordinaten berechneEpizentrumKoordinaten(ArrayList schnittpunkte) { + Log.i(TAG, "Berechne Epizentrum Koordinaten"); double x = 0; double y = 0; for (Schnittpunkt s : schnittpunkte) { x+= s.getKoordinaten().getX(); y+= s.getKoordinaten().getY(); } - return new Koordinaten(new BigDecimal(x/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue(), - new BigDecimal(y/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()); + x = new BigDecimal(x/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()*0.999308681; + y = new BigDecimal(y/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()*1.000831381; + return new Koordinaten(x,y); } public ArrayList ermittleEndpunktKonbinationen(ArrayList tempBerechungsObjekte) { + ArrayList verbindungen = new ArrayList<>(); Set> combinations = Sets.combinations(ImmutableSet.copyOf(tempBerechungsObjekte), 2); for (Set tempEndpunkt : combinations) { @@ -148,6 +169,7 @@ public class EpizentrumRechnung { EndpunktVerbindung endpunktVerbindung = new EndpunktVerbindung(helpArrayToGetValues.get(0), helpArrayToGetValues.get(1)); verbindungen.add(endpunktVerbindung); } + Log.i(TAG, "Endpunkteverbindungen Erfolgreich festgelegt, Anzahl: " + verbindungen.size()); return verbindungen; } @@ -171,11 +193,12 @@ public class EpizentrumRechnung { return detektionssignal.getAnkunftsZeit().minusSeconds(sec); } - public void erhoheRadius(ArrayList tempEndpunktListe) { + for (Endpunkt b : tempEndpunktListe) { b.erhoeheRadius(SCHRITTWEITE); } } + }