Пример #1
0
 /**
  * @param $coord
  * @return string
  */
 public function get_circle_cords($coord)
 {
     $out = "";
     $angularDistance = $coord->radius / 6378137;
     $center_lat = deg2rad($coord->lat);
     $center_lon = deg2rad($coord->lon);
     for ($i = 0; $i <= 360; $i++) {
         $bearing = deg2rad($i);
         $lat = Asin(Sin($center_lat) * Cos($angularDistance) + Cos($center_lat) * Sin($angularDistance) * Cos($bearing));
         $dlon = Atan2(Sin($bearing) * Sin($angularDistance) * Cos($center_lat), Cos($angularDistance) - Sin($center_lat) * Sin($lat));
         $lon = fmod($center_lon + $dlon + M_PI, 2 * M_PI) - M_PI;
         $latOut = rad2deg($lat);
         $lonOut = rad2deg($lon);
         $out .= $lonOut . ',' . $latOut . ',' . 0 . ' ';
     }
     return $out;
 }
Пример #2
0
function getArcCords($cords, $start, $end, $dir, $prev_lat = 0, $prev_lon = 0)
{
    $start = modulo($start, 360);
    $end = modulo($end, 360);
    $out = "";
    $out2 = "";
    $angularDistance = $cords[2] / 6371000;
    $count = 0;
    if ($dir < 0) {
        $total_angle = -($end - $start);
    } else {
        $total_angle = $end - $start;
    }
    $total_angle = modulo($total_angle, 360);
    if ($total_angle == 0) {
        $total_angle = 360;
    }
    for ($i = $start; $count <= 48; $i += $dir * $total_angle / 48) {
        //$out.= "$i";
        $bearing = deg2rad($i);
        $lat = Asin(Sin($cords[0]) * Cos($angularDistance) + Cos($cords[0]) * Sin($angularDistance) * Cos($bearing));
        $dlon = Atan2(Sin($bearing) * Sin($angularDistance) * Cos($cords[0]), Cos($angularDistance) - Sin($cords[0]) * Sin($lat));
        $lon = fmod($cords[1] + $dlon + M_PI, 2 * M_PI) - M_PI;
        $latOut = rad2deg($lat);
        $lonOut = rad2deg($lon);
        $out .= encode($latOut - $prev_lat) . encode($lonOut - $prev_lon);
        $out2 .= "{$lonOut},{$latOut},0 ";
        $prev_lat = $latOut;
        $prev_lon = $lonOut;
        $count++;
    }
    return array($out, $out2);
}
Пример #3
0
function getArcCords($cords, $start, $end, $dir, $prev_lat = 0, $prev_lon = 0)
{
    $out = "";
    $out2 = array();
    $angularDistance = $cords[2] / geometry::EARTH_RADIUS;
    $count = 0;
    if ($dir < 0) {
        $totat_angle = $end - $start;
    } else {
        if ($start > $end) {
            $end += 360;
            $totat_angle = -($start - $end);
        } else {
            $totat_angle = -($start - $end) - 360;
        }
    }
    for ($i = $start; $count <= 48; $i += $totat_angle / 48) {
        //$out.= "$i";
        $bearing = deg2rad($i);
        $lat = Asin(Sin($cords[0]) * Cos($angularDistance) + Cos($cords[0]) * Sin($angularDistance) * Cos($bearing));
        $dlon = Atan2(Sin($bearing) * Sin($angularDistance) * Cos($cords[0]), Cos($angularDistance) - Sin($cords[0]) * Sin($lat));
        $lon = fmod($cords[1] + $dlon + M_PI, 2 * M_PI) - M_PI;
        $latOut = rad2deg($lat);
        $lonOut = rad2deg($lon);
        $out .= encode($latOut - $prev_lat) . encode($lonOut - $prev_lon);
        $out2[] = array($lonOut, $latOut);
        $prev_lat = $latOut;
        $prev_lon = $lonOut;
        $count++;
    }
    return array($out, $out2);
}