|
|
|
|
|
|
|
|
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 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.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; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Kreis; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Kreis; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Schnittpunkt; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Schnittpunkt; |
|
|
|
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.UTM2Deg; |
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
import java.math.BigDecimal; |
|
|
import java.math.RoundingMode; |
|
|
import java.math.RoundingMode; |
|
|
|
|
|
|
|
|
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 = 20; |
|
|
|
|
|
|
|
|
private static final double SCHRITTWEITE = 5; |
|
|
private static final double MAX_ABSTAND = 5; |
|
|
private static final double MAX_ABSTAND = 5; |
|
|
private static final int DOUBLESTELLEN = 15; |
|
|
private static final int DOUBLESTELLEN = 15; |
|
|
private static final int SCHLEIFENDURCHLAUFTE = 5000; |
|
|
private static final int SCHLEIFENDURCHLAUFTE = 5000; |
|
|
|
|
|
|
|
|
double abstand = Math.sqrt( |
|
|
double abstand = Math.sqrt( |
|
|
Math.pow(detektionssignal.getKoordinaten().getX() - koordEpi.getX(), 2) + |
|
|
Math.pow(detektionssignal.getKoordinaten().getX() - koordEpi.getX(), 2) + |
|
|
Math.pow(detektionssignal.getKoordinaten().getY() - koordEpi.getY(), 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); |
|
|
return detektionssignal.getAnkunftsZeit().minusSeconds(sec); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@RequiresApi(api = Build.VERSION_CODES.O) |
|
|
@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]; |
|
|
float[] results = new float[1]; |
|
|
Location.distanceBetween(detektionssignal.getKoordinaten().getX(), detektionssignal.getKoordinaten().getY(), koordEpi.getX(), koordEpi.getY(), results); |
|
|
Location.distanceBetween(detektionssignal.getKoordinaten().getX(), detektionssignal.getKoordinaten().getY(), koordEpi.getX(), koordEpi.getY(), results); |
|
|
float distanceInMeters = results[0]; |
|
|
float distanceInMeters = results[0]; |
|
|
int sec = (int) distanceInMeters/ detektionssignal.geschwErdbeben; |
|
|
|
|
|
|
|
|
int sec = (int) (distanceInMeters / detektionssignal.geschwErdbeben); |
|
|
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) { |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Epizentrum trilateration(ArrayList<Endpunkt> 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; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |