113 lines
5.3 KiB
PHP
113 lines
5.3 KiB
PHP
<?php
|
|
|
|
define ("GEO_EARTH_RADIUS" , 6371.0); // in km
|
|
define ("DIST_LAT_KM", acos(sin(deg2rad(0)) * sin(deg2rad(1)) + cos(deg2rad(0)) * cos(deg2rad(1)) * cos(deg2rad(0) - deg2rad(0))) * GEO_EARTH_RADIUS); // 111.19492664455 km
|
|
|
|
function getDirection($loc_long, $loc_lat, $prev_loc_long, $prev_loc_lat)
|
|
{
|
|
global $diff_str, $distLongKm;
|
|
|
|
// http://www.stern.de/noch-fragen/wie-gross-ist-der-abstand-zwischen-zwei-breitengraden-1000307782.html
|
|
// "Der Abstand zwischen zwei Breitengraden ist immer gleich und entspricht 111,32 km. Der Abstand zwischen zwei Breitengradminuten ist eine Seemeile = 1,85 km.
|
|
// Der Abstand zwischen zwei Längengraden ist am Äquator auch 111,32 km, nimmt aber umso weiter man nach Norden oder Süden kommt immer weiter ab. In Europa könnte man für grobe Berechnungen mit 70 km rechnen."
|
|
// Anmerkung: 111,32 km als Abstand zwischen zwei Breitengraden stimmt natürlich nicht ganz, da durch die Abplattung an den Polen der Abstand dort minimal kürzer ist.
|
|
// D.h. der Erdradius nimmt zu den Polen hin leicht ab. Für die Berechnung des ortsabhängigen Abstandes zwischen den Längen- und Breitengraden wird mit GEO_EARTH_RADIUS
|
|
// aus Vereinfachungsgründen der durschnittliche Erdradius genommen. Da der Abstand zwischen zwei Breitengraden nur vom Erdradius abhängig ist und daher durch GEO_EARTH_RADIUS in diesem Skript immer gleich ist,
|
|
// wird er nur einmal berechnet und fortan als Konstante verwendet
|
|
$distLongKm = acos(sin(deg2rad($loc_lat)) * sin(deg2rad($loc_lat)) + cos(deg2rad($loc_lat)) * cos(deg2rad($loc_lat)) * cos(deg2rad(0) - deg2rad(1))) * GEO_EARTH_RADIUS;
|
|
//echo "$loc_long: " . DIST_LAT_KM . ", $loc_lat: $distLongKm<br>\n";
|
|
// --- Richtungsbestimmung ---
|
|
// Achtung: Punkte liegen in zeitlich absteigender Reihenfolge vor
|
|
|
|
// Betrag in km und Richtungsbestimmung der Bewegung in der Länge: Osten oder Westen
|
|
$diff_long = ($loc_long - $prev_loc_long) * $distLongKm;
|
|
$move_long = "o";
|
|
$diff_rel_start = 0;
|
|
if ($diff_long >= 0) {
|
|
$move_long = "w";
|
|
$diff_rel_start = -360;
|
|
}
|
|
|
|
// Betrag in km und Richtungsbestimmung der Bewegung in der Breite: Norden oder Süden
|
|
$diff_lat = ($loc_lat - $prev_loc_lat) * DIST_LAT_KM;
|
|
$move_lat = "n";
|
|
if ($diff_lat >= 0) {
|
|
$move_lat = "s";
|
|
$diff_rel_start = -180;
|
|
if ($move_long == "w")
|
|
$diff_rel_start = 180;
|
|
}
|
|
|
|
$diff_str = "(" . str_replace(".", ",", sprintf("%01.3f", abs($diff_long))) . " km nach " . strtoupper($move_long) . ",<br>" . str_replace(".", ",", sprintf("%01.3f", abs($diff_lat))) . " km nach " . strtoupper($move_lat) . ")<br>";
|
|
|
|
// Bestimmung der Hauptrichtung der Bewegung in Länge oder Breite
|
|
if (abs($diff_lat) > abs($diff_long)) {
|
|
// Betrag der Bewegung in der Breite (nach Norden/Süden) ist größer als die in der Länge (nach Osten/Westen)
|
|
$direction = $move_lat;
|
|
$diff_rel = abs($diff_long) / abs($diff_lat);
|
|
if ($diff_rel >= 0.25 && $diff_rel < 0.75)
|
|
$direction .= $move_lat . $move_long;
|
|
if ($diff_rel >= 0.75)
|
|
$direction .= $move_long;
|
|
} else {
|
|
// Betrag der Bewegung in der Länge (nach Osten/Westen) ist größer als die in der Breite (nach Norden/Süden)
|
|
$direction = $move_long;
|
|
$diff_rel = abs($diff_lat) / abs($diff_long);
|
|
if ($diff_rel >= 0.25 && $diff_rel < 0.75)
|
|
$direction .= $move_lat . $move_long;
|
|
if ($diff_rel >= 0.75)
|
|
$direction = $move_lat . $direction;
|
|
|
|
$diff_rel_start = -90;
|
|
if ($diff_long >= 0) {
|
|
$diff_rel_start = 270;
|
|
}
|
|
if ($diff_lat >= 0) {
|
|
$diff_rel_start = 90;
|
|
if ($move_long == "w")
|
|
$diff_rel_start = -270;
|
|
}
|
|
}
|
|
// die Werte in $diff_rel_start sind größtenteils falsch, müssen noch korrigiert werden, bevor die Grad-Angabe ausgegeben werden kann
|
|
$diff_str = "Richtung: " /* . "<br>" . $diff_rel_start . " + " . sprintf("%01.0f", $diff_rel * 45) */ . "" . sprintf("%01.0f", abs(($diff_rel_start + $diff_rel * 45) * 10) / 10) . "° " . strtoupper($direction) . "<br>" . $diff_str;
|
|
// --- ---
|
|
// return "../images/arrow_" . $direction . ".png";
|
|
return $direction;
|
|
}
|
|
|
|
function getVelocity($loc_long, $loc_lat, $loc_time, $prev_loc_long, $prev_loc_lat, $prev_loc_time)
|
|
{
|
|
if ($loc_time == "1970-01-01 01:00:00" || $prev_loc_time == "1970-01-01 01:00:00")
|
|
return "?";
|
|
|
|
$distKm = acos(sin(deg2rad($loc_lat)) * sin(deg2rad($prev_loc_lat)) + cos(deg2rad($loc_lat)) * cos(deg2rad($prev_loc_lat)) * cos(deg2rad($prev_loc_long) - deg2rad($loc_long))) * GEO_EARTH_RADIUS;
|
|
//echo "$loc_long, $loc_lat, $loc_time, $prev_loc_long, $prev_loc_lat, $prev_loc_time, $distKm , " . (strtotime($prev_loc_time) - strtotime($loc_time)) . ", " . (($distKm / (strtotime($prev_loc_time) - strtotime($loc_time))) * 3600) . "<br>";
|
|
|
|
return round(($distKm / (strtotime($prev_loc_time) - strtotime($loc_time))) * 3600);
|
|
}
|
|
|
|
|
|
function getLocatingType($cr_gps_type) {
|
|
$cr_gps_type_text = "";
|
|
if ($cr_gps_type == 0) {
|
|
$cr_gps_type_text = "unbestimmt";
|
|
} elseif ($cr_gps_type == 1) {
|
|
$cr_gps_type_text = "LBS";
|
|
} elseif ($cr_gps_type == 2) {
|
|
$cr_gps_type_text = "GPS";
|
|
} elseif ($cr_gps_type == 3) {
|
|
$cr_gps_type_text = "Network";
|
|
} elseif ($cr_gps_type == 9) {
|
|
$cr_gps_type_text = "Ortung aus";
|
|
}
|
|
return $cr_gps_type_text;
|
|
}
|
|
|
|
function formDateTime($sqlDate) {
|
|
global $today;
|
|
|
|
return substr($sqlDate, 8, 2) . "." . substr($sqlDate, 5, 2) . "." . substr($sqlDate, 0, 4) . ", " . substr($sqlDate, 11, 8);
|
|
}
|
|
|
|
?>
|