Browse Source

Anpassung Koordinatenberechnung

EpiTest
Jan Gabriel Kunze 3 years ago
parent
commit
0d8e04f9e0

+ 3
- 4
app/src/main/java/de/edotzlaff/detection/EarthquakeLocation.java View File

@RequiresApi(api = Build.VERSION_CODES.O) @RequiresApi(api = Build.VERSION_CODES.O)
public Epizentrum ermittleEpizentrum(DataSnapshot data) public Epizentrum ermittleEpizentrum(DataSnapshot data)
{ {
Log.i(TAGEPIZENTRUM, "Start Ermittle Epizentrum");
Erdbeben erdbeben = new Erdbeben(); Erdbeben erdbeben = new Erdbeben();
erdbeben.addDetektionssignalList(mapToDetektionssignale(data)); erdbeben.addDetektionssignalList(mapToDetektionssignale(data));


Epizentrum epizentrum = new Epizentrum();
epizentrum = erdbeben.ermittleEpizentrum();

Epizentrum epizentrum = erdbeben.ermittleEpizentrum();
if(Objects.isNull(epizentrum)) if(Objects.isNull(epizentrum))
{ {
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!Kein Epizentrum vorhanden!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!Kein Epizentrum vorhanden!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
} }





@RequiresApi(api = Build.VERSION_CODES.O) @RequiresApi(api = Build.VERSION_CODES.O)
public ArrayList<Detektionssignal> mapToDetektionssignale(DataSnapshot data) public ArrayList<Detektionssignal> mapToDetektionssignale(DataSnapshot data)
{ {


detektionssignale.add(detektionssignal); detektionssignale.add(detektionssignal);
} }
System.out.println("detektionsingale size: " + detektionssignale.size());
return detektionssignale; return detektionssignale;
} }



+ 11
- 8
app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java View File





import android.os.Build; import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import de.edotzlaff.detection.detektion.berechnung.Endpunkt; import de.edotzlaff.detection.detektion.berechnung.Endpunkt;
import de.edotzlaff.detection.detektion.berechnung.EndpunktVerbindung; import de.edotzlaff.detection.detektion.berechnung.EndpunktVerbindung;
public class Erdbeben { public class Erdbeben {


//ToDO anpassen an Szenario umso mehr umso wahrscheinlich ein Ergebnis, oder Abbruchbedingung mit do while //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 Epizentrum epizentrum;
private EpizentrumRechnung epizentrumRechnung; private EpizentrumRechnung epizentrumRechnung;
private HashMap<String, Detektionssignal> nutzerDaten; private HashMap<String, Detektionssignal> nutzerDaten;
private Detektionssignal erstesDetektionssignal;


public Erdbeben() { public Erdbeben() {


{ {
for (int i = 0; i< detektionssignale.size(); i++) 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) @RequiresApi(api = Build.VERSION_CODES.O)
ArrayList<Detektionssignal> rechenListe = new ArrayList<>(); ArrayList<Detektionssignal> rechenListe = new ArrayList<>();
nutzerDaten.forEach((key, value) -> rechenListe.add(value)); nutzerDaten.forEach((key, value) -> rechenListe.add(value));
//Initialisierung der Rechung - First Element mit delta r + alle möglichen EndpunktKombinationen (einfach) //Initialisierung der Rechung - First Element mit delta r + alle möglichen EndpunktKombinationen (einfach)
ArrayList<Endpunkt> berechnungsEndpunkte = epizentrumRechnung.initEndpunkte(rechenListe);
erstesDetektionssignal = epizentrumRechnung.ermittleErstesDetektionssignal(rechenListe);
ArrayList<Endpunkt> berechnungsEndpunkte = epizentrumRechnung.initEndpunkte(rechenListe, erstesDetektionssignal);

ArrayList<EndpunktVerbindung> endpunktKonbinationen = epizentrumRechnung.ermittleEndpunktKonbinationen(berechnungsEndpunkte); ArrayList<EndpunktVerbindung> endpunktKonbinationen = epizentrumRechnung.ermittleEndpunktKonbinationen(berechnungsEndpunkte);


//ToDo Vernünftiger Endpunkt überlegen bzw. bis wann abgebrochen wird -> Umzug in Berechnungs //ToDo Vernünftiger Endpunkt überlegen bzw. bis wann abgebrochen wird -> Umzug in Berechnungs
epizentrum = epizentrumRechnung.ueberpruefeObEpizentrum(endpunktKonbinationen); epizentrum = epizentrumRechnung.ueberpruefeObEpizentrum(endpunktKonbinationen);
//ToDo set EnstehungsZeitpunkt -> (Bezugszeit, Koord, Koord, v;) //ToDo set EnstehungsZeitpunkt -> (Bezugszeit, Koord, Koord, v;)
if (!Objects.isNull(epizentrum)) { 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; return epizentrum;
} }
} }

+ 42
- 19
app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java View File



import android.location.Location; import android.location.Location;
import android.os.Build; import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;

import de.edotzlaff.detection.detektion.Detektionssignal; import de.edotzlaff.detection.detektion.Detektionssignal;
import de.edotzlaff.detection.detektion.Epizentrum; import de.edotzlaff.detection.detektion.Epizentrum;
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten; import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten;
public class EpizentrumRechnung { public class EpizentrumRechnung {


//ToDo Schrittweite und Abstand auf Szenario anpassen //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) @RequiresApi(api = Build.VERSION_CODES.O)
public ArrayList<Endpunkt> initEndpunkte(ArrayList<Detektionssignal> detektionssignal) {
Detektionssignal nahegelegensteMessung = detektionssignal.get(0);
public ArrayList<Endpunkt> initEndpunkte(ArrayList<Detektionssignal> detektionssignal, Detektionssignal ersteMessung) {
ArrayList<Endpunkt> arrBerechnungsObjekte = new ArrayList<>(); ArrayList<Endpunkt> 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) { for (Detektionssignal aufzeichnung : detektionssignal) {
int zeitunterschied = aufzeichnung.getAnkunftsZeit().getHour() * 3600 + aufzeichnung.getAnkunftsZeit().getMinute() * 60 + aufzeichnung.getAnkunftsZeit().getSecond() 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()); Endpunkt tempEndpunkt = new Endpunkt(aufzeichnung.getDeviceId());
Kreis k = new Kreis(aufzeichnung.getKoordinaten().getX(), aufzeichnung.getKoordinaten().getY(), startradius); Kreis k = new Kreis(aufzeichnung.getKoordinaten().getX(), aufzeichnung.getKoordinaten().getY(), startradius);
tempEndpunkt.setKreis(k); tempEndpunkt.setKreis(k);
arrBerechnungsObjekte.add(tempEndpunkt); arrBerechnungsObjekte.add(tempEndpunkt);
} }

Log.i(TAG, "Daten Erfolgreich initialisiert");
return arrBerechnungsObjekte; return arrBerechnungsObjekte;
} }


@RequiresApi(api = Build.VERSION_CODES.O)
public Detektionssignal ermittleErstesDetektionssignal(ArrayList<Detektionssignal> 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<Schnittpunkt> berechneKreisSchnittpunkte(Kreis kreis1, Kreis kreis2) { public ArrayList<Schnittpunkt> berechneKreisSchnittpunkte(Kreis kreis1, Kreis kreis2) {


ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>();
} }


public boolean genuegendSchnittpunktevorhanden(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { public boolean genuegendSchnittpunktevorhanden(ArrayList<EndpunktVerbindung> endpunktVerbindungen) {
System.out.println("<<<<<<<<<<<<<<<<<<<<<<genuegendSchnittpunktevorhanden");
//Log.i(TAG,"Überprüfe ob genügend Schnittpunkte vorhanden sind");
//Log.i(TAG,"Radius: "+ Double.toString(endpunktVerbindungen.get(0).getEndpunkt1().getKreis().getRadius()));
for (EndpunktVerbindung endpunktVerbindung : endpunktVerbindungen) { for (EndpunktVerbindung endpunktVerbindung : endpunktVerbindungen) {
ArrayList<Schnittpunkt> templist; ArrayList<Schnittpunkt> templist;
templist = berechneKreisSchnittpunkte(endpunktVerbindung.getEndpunkt1().getKreis(), endpunktVerbindung.getEndpunkt2().getKreis()); templist = berechneKreisSchnittpunkte(endpunktVerbindung.getEndpunkt1().getKreis(), endpunktVerbindung.getEndpunkt2().getKreis());
} }


public Epizentrum ueberpruefeObEpizentrum(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { public Epizentrum ueberpruefeObEpizentrum(ArrayList<EndpunktVerbindung> endpunktVerbindungen) {

int counter; int counter;
ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>();


if (counter == endpunktVerbindungen.size() - 1) { if (counter == endpunktVerbindungen.size() - 1) {
schnittpunkte.add(s1); schnittpunkte.add(s1);
Epizentrum tempEpizentrum = new Epizentrum(); 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; return tempEpizentrum;
} }
} }
} }


public Koordinaten berechneEpizentrumKoordinaten(ArrayList<Schnittpunkt> schnittpunkte) { public Koordinaten berechneEpizentrumKoordinaten(ArrayList<Schnittpunkt> schnittpunkte) {
Log.i(TAG, "Berechne Epizentrum Koordinaten");
double x = 0; double x = 0;
double y = 0; double y = 0;
for (Schnittpunkt s : schnittpunkte) { for (Schnittpunkt s : schnittpunkte) {
x+= s.getKoordinaten().getX(); x+= s.getKoordinaten().getX();
y+= s.getKoordinaten().getY(); 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<EndpunktVerbindung> ermittleEndpunktKonbinationen(ArrayList<Endpunkt> tempBerechungsObjekte) { public ArrayList<EndpunktVerbindung> ermittleEndpunktKonbinationen(ArrayList<Endpunkt> tempBerechungsObjekte) {

ArrayList<EndpunktVerbindung> verbindungen = new ArrayList<>(); ArrayList<EndpunktVerbindung> verbindungen = new ArrayList<>();
Set<Set<Endpunkt>> combinations = Sets.combinations(ImmutableSet.copyOf(tempBerechungsObjekte), 2); Set<Set<Endpunkt>> combinations = Sets.combinations(ImmutableSet.copyOf(tempBerechungsObjekte), 2);
for (Set<Endpunkt> tempEndpunkt : combinations) { for (Set<Endpunkt> tempEndpunkt : combinations) {
EndpunktVerbindung endpunktVerbindung = new EndpunktVerbindung(helpArrayToGetValues.get(0), helpArrayToGetValues.get(1)); EndpunktVerbindung endpunktVerbindung = new EndpunktVerbindung(helpArrayToGetValues.get(0), helpArrayToGetValues.get(1));
verbindungen.add(endpunktVerbindung); verbindungen.add(endpunktVerbindung);
} }
Log.i(TAG, "Endpunkteverbindungen Erfolgreich festgelegt, Anzahl: " + verbindungen.size());
return verbindungen; return verbindungen;
} }


return detektionssignal.getAnkunftsZeit().minusSeconds(sec); return detektionssignal.getAnkunftsZeit().minusSeconds(sec);


} }

public void erhoheRadius(ArrayList<Endpunkt> tempEndpunktListe) { public void erhoheRadius(ArrayList<Endpunkt> tempEndpunktListe) {

for (Endpunkt b : tempEndpunktListe) { for (Endpunkt b : tempEndpunktListe) {
b.erhoeheRadius(SCHRITTWEITE); b.erhoeheRadius(SCHRITTWEITE);
} }
} }



} }

Loading…
Cancel
Save