function CalculateArc($Text) {
  global $TempArea,$TempPoint,$CenterY, $CenterX,$Rotation ;

  $parts=split(",",substr($Text,3) );
  if ( count($parts)==1 ) { echo "Wrong format in CalculateArc<BR>"; return; }
	
  list ($res, $StartLon , $StartLat) = ReadCoords( $parts[0] );
  list ($res, $EndLon  , $EndLat) = ReadCoords( $parts[1]  );

  list($Radius, $StartBearing)	= DistanceBearing($CenterY, $CenterX, $StartLat, $StartLon, 1,1);
  list($tmp1 ,  $EndBearing)	= DistanceBearing($CenterY, $CenterX, $EndLat, $EndLon,0,1);
  
  $TempPoint->Latitude  = $StartLat;
  $TempPoint->Longitude = $StartLon;
  
  AddPoint($TempPoint);

  while(abs($EndBearing-$StartBearing) > 7.5) {
	  $StartBearing += $Rotation *5 ;

	  if($StartBearing > 360)
		  $StartBearing -= 360;
	  if($StartBearing < 0)
		  $StartBearing += 360;
	
      list($TempPoint->Latitude,$TempPoint->Longitude)= FindLatitudeLongitude($CenterY, $CenterX, $StartBearing, $Radius, 1,1 );
	  
	  AddPoint($TempPoint);
  }
  $TempPoint->Latitude  = $EndLat;
  $TempPoint->Longitude = $EndLon;  
  AddPoint($TempPoint);
  
}
Example #2
0
function CrossTrackError($lon1, $lat1, $lon2, $lat2, $lon3, $lat3)
{
    $dot1 = dot($lon1, $lat1, $lon2, $lat2, $lon3, $lat3);
    if ($dot1 > 0) {
        list($dist_BD, $tmp1) = DistanceBearing($lat2, $lon2, $lat3, $lon3, 1, 0);
        return $dist_BD;
    }
    $dot2 = dot($lon2, $lat2, $lon1, $lat1, $lon3, $lat3);
    if ($dot2 > 0) {
        list($dist_AD, $crs_AD) = DistanceBearing($lat1, $lon1, $lat3, $lon3, 1, 1);
        return $dist_AD;
    }
    list($dist_AD, $crs_AD) = DistanceBearing($lat1, $lon1, $lat3, $lon3, 1, 1);
    $dist_AD /= RAD_TO_DEG * 111194.9267;
    $crs_AD *= DEG_TO_RAD;
    // list($dist_AB, $crs_AB)=  DistanceBearing($lat1, $lon1, $lat2, $lon2, 1,1);
    list($tmp1, $crs_AB) = DistanceBearing($lat1, $lon1, $lat2, $lon2, 0, 1);
    // DEBUG("a1",1,"dist_AB : $dist_AB dist_AD:$dist_AD ");
    //$dist_AB_m=  $dist_AB;
    //$dist_AB/= (RAD_TO_DEG * 111194.9267);
    $crs_AB *= DEG_TO_RAD;
    // $lat1 *= DEG_TO_RAD;
    // $lat2 *= DEG_TO_RAD;
    // $lat3 *= DEG_TO_RAD;
    // $lon1 *= DEG_TO_RAD;
    // $lon2 *= DEG_TO_RAD;
    // $lon3 *= DEG_TO_RAD;
    // double XTD; // cross track distance
    // double ATD; // along track distance
    //  The "along track distance", ATD, the distance from A along the
    //  course towards B to the point abeam D
    $sindist_AD = sin($dist_AD);
    $XTD = asin($sindist_AD * sin($crs_AD - $crs_AB));
    //$sinXTD = sin($XTD);
    //$ATD = asin(sqrt( $sindist_AD*$sindist_AD - $sinXTD*$sinXTD )/cos($XTD));
    /*
      if (lon4 && lat4) {
        IntermediatePoint(lon1, lat1, lon2, lat2, ATD, dist_AB,
    		      lon4, lat4);
      }
    */
    // units
    $XTD *= RAD_TO_DEG * 111194.9267;
    //$ATD *= (RAD_TO_DEG * 111194.9267);
    /*
    	//DEBUG("a1",1," XTD: $XTD , ATD: $ATD<BR>");
    	if ($ATD > $dist_AB_m ) {
    		list($dist_BD, $tmp1 )= DistanceBearing($lat2, $lon2, $lat3, $lon3, 1,0);
    		$XTD = min($dist_AD_m ,$dist_BD);
    		DEBUG("a1",1," special case: $dist_AD_m , $dist_BD<BR>");
    	} else {
    		DEBUG("a1",1,"XTD ($XTD) is ok ($ATD < $dist_AB_m )<BR>");
    	}
    */
    //   return abs($ATD);
    return abs($XTD);
}