diff --git a/app/build.gradle b/app/build.gradle index 5c71b89..f375418 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,5 +43,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation("com.google.guava:guava:30.1.1-jre") + implementation ('com.lemmingapex.trilateration:trilateration:1.0.2') } \ No newline at end of file diff --git a/app/src/main/java/de/edotzlaff/detection/detektion/Detektionssignal.java b/app/src/main/java/de/edotzlaff/detection/detektion/Detektionssignal.java index c577963..281660f 100644 --- a/app/src/main/java/de/edotzlaff/detection/detektion/Detektionssignal.java +++ b/app/src/main/java/de/edotzlaff/detection/detektion/Detektionssignal.java @@ -27,7 +27,7 @@ public class Detektionssignal { this.koordinaten = koordinaten; } - public int getGeschwErdbeben() { + public double getGeschwErdbeben() { return geschwErdbeben; } @@ -44,6 +44,6 @@ public class Detektionssignal { } public Koordinaten koordinaten; - public int geschwErdbeben; + public double geschwErdbeben; public LocalDateTime ankunftsZeit; } 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 d6a68a6..1cf2e49 100644 --- a/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java +++ b/app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java @@ -5,6 +5,7 @@ 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; import de.edotzlaff.detection.detektion.berechnung.EpizentrumRechnung; @@ -17,7 +18,7 @@ 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 = 2000; + public static final Integer SCHLEIFENDURCHLAUFTE = 200; private static final String TAG = "ERDBEBEN"; private Epizentrum epizentrum; @@ -37,11 +38,9 @@ public class Erdbeben { return nutzerDaten.size(); } - public void addDetektionssignalList(ArrayList detektionssignale) - { - for (int i = 0; i< detektionssignale.size(); i++) - { - nutzerDaten.put(detektionssignale.get(i).getDeviceId()+"i",detektionssignale.get(i)); + public void addDetektionssignalList(ArrayList detektionssignale) { + for (int i = 0; i < detektionssignale.size(); i++) { + nutzerDaten.put(detektionssignale.get(i).getDeviceId() + "i", detektionssignale.get(i)); } Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size()); } @@ -69,6 +68,16 @@ public class Erdbeben { } epizentrumRechnung.erhoheRadius(berechnungsEndpunkte); } + + if(!Objects.isNull(epizentrumRechnung.trilateration(berechnungsEndpunkte))) + { + epizentrum = epizentrumRechnung.trilateration(berechnungsEndpunkte); + Log.i(TAG, "Koordinaten: " +epizentrum.getKoordinaten().getX() + " " + epizentrum.getKoordinaten().getY()); + epizentrum.setEntstehungsZeitpunkt(epizentrumRechnung.berechneEntstehungsZeitpunktLongLatt(erstesDetektionssignal, epizentrum.getKoordinaten())); + return epizentrum; + } + + return null; } 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 3657070..e863bd3 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 @@ -9,12 +9,18 @@ import android.util.Log; import androidx.annotation.RequiresApi; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import com.lemmingapex.trilateration.NonLinearLeastSquaresSolver; +import com.lemmingapex.trilateration.TrilaterationFunction; + +import org.apache.commons.math3.fitting.leastsquares.LeastSquaresOptimizer; +import org.apache.commons.math3.fitting.leastsquares.LevenbergMarquardtOptimizer; import de.edotzlaff.detection.detektion.Detektionssignal; import de.edotzlaff.detection.detektion.Epizentrum; import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten; import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Kreis; import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Schnittpunkt; +import de.edotzlaff.detection.detektion.berechnung.mathObjekte.UTM2Deg; import java.math.BigDecimal; import java.math.RoundingMode; @@ -26,7 +32,7 @@ import java.util.Set; public class EpizentrumRechnung { //ToDo Schrittweite und Abstand auf Szenario anpassen - private static final double SCHRITTWEITE = 20; + private static final double SCHRITTWEITE = 5; private static final double MAX_ABSTAND = 5; private static final int DOUBLESTELLEN = 15; private static final int SCHLEIFENDURCHLAUFTE = 5000; @@ -181,21 +187,21 @@ public class EpizentrumRechnung { double abstand = Math.sqrt( Math.pow(detektionssignal.getKoordinaten().getX() - koordEpi.getX(), 2) + Math.pow(detektionssignal.getKoordinaten().getY() - koordEpi.getY(), 2)); - int sec = (int) abstand/ detektionssignal.geschwErdbeben; + int sec = (int) (abstand / detektionssignal.geschwErdbeben); return detektionssignal.getAnkunftsZeit().minusSeconds(sec); } @RequiresApi(api = Build.VERSION_CODES.O) - public LocalDateTime berechneEntstehungsZeitpunktLongLatt(Detektionssignal detektionssignal, Koordinaten koordEpi) - { + public LocalDateTime berechneEntstehungsZeitpunktLongLatt(Detektionssignal detektionssignal, Koordinaten koordEpi) { float[] results = new float[1]; Location.distanceBetween(detektionssignal.getKoordinaten().getX(), detektionssignal.getKoordinaten().getY(), koordEpi.getX(), koordEpi.getY(), results); float distanceInMeters = results[0]; - int sec = (int) distanceInMeters/ detektionssignal.geschwErdbeben; + int sec = (int) (distanceInMeters / detektionssignal.geschwErdbeben); return detektionssignal.getAnkunftsZeit().minusSeconds(sec); } + public void erhoheRadius(ArrayList tempEndpunktListe) { for (Endpunkt b : tempEndpunktListe) { @@ -203,5 +209,32 @@ public class EpizentrumRechnung { } } + public Epizentrum trilateration(ArrayList tempEndpunktListe) { + double[][] positions = new double[tempEndpunktListe.size()][2]; + double[] distances = new double[tempEndpunktListe.size()]; + + for (int i = 0; i < tempEndpunktListe.size(); i++) { + positions[i][0] = tempEndpunktListe.get(i).getKreis().getMittelPunkt().getX(); + positions[i][1] = tempEndpunktListe.get(i).getKreis().getMittelPunkt().getY(); + distances[i] = tempEndpunktListe.get(i).getKreis().getRadius(); + } + NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer()); + LeastSquaresOptimizer.Optimum optimum = solver.solve(); + + double[] centroid = optimum.getPoint().toArray(); + if (centroid.length == 2) { + UTM2Deg utm2Deg = new UTM2Deg(); + utm2Deg.convertToDeg(32, 'U', centroid[0], centroid[1]); + + Log.i(TAG, "Center: " + utm2Deg.getLatitude() + " " + utm2Deg.getLongitude()); + Epizentrum epizentrum = new Epizentrum(); + Koordinaten koordinaten = new Koordinaten(centroid[0], centroid[1]); + epizentrum.setKoordinaten(koordinaten); + return epizentrum; + } + + return null; + } + }