府中天文同好会(FAS)のサイトで公開されている、
佐藤幹哉さんが作成された CGI
のソースコードをいただいたので、若干の修正を入れたうえで Web APIに仕立ててみました。(計算部分はほぼ佐藤さんの書かれたコードのまま)
公開することをご快諾いただけたので as isで公開させていただきます。
CM-I | CM-II | CM-III | MJD | status |
---|---|---|---|---|
function callapi() { var t = $('#time_input').val() + $('input[name=tz]:checked').val(); $.ajax({ url: 'https://www.carina.gr.jp/~yamane/Jupiter_CM/api/calc_jupiter_cm', type: 'post', cache: false, data: { 'time' : t }, dataType: 'json' }) .done(function(json, status, xhr) { $('#cm1').html(json.cm1); $('#cm2').html(json.cm2); $('#cm3').html(json.cm3); $('#mjd').html(json.mjd); $('#status').html(json.status); }) .fail(function(xhr, status, error) { alert('Error: ' + error); }); }
$ curl -F 'time=2019-09-16T09:12:34+0000' https://www.carina.gr.jp/~yamane/Jupiter_CM/api/calc_jupiter_cm {"status":0,"cm1":"264.7","cm3":"37.5","mjd":43722.8837268519,"cm2":"41.2","apiversion":"v0.9"}
例1: 2019-09-15T22:34:56+0900
例2: 2019-09-15T22:34.9+0900
#! /usr/bin/perl # # calc_jupiter_cm # # Created: 2019/09/14 Satoru Yamane Initial revision. # Special thanks to Mikiya Sato. # use strict; use JSON qw/ encode_json /; use Log::Log4perl; use CGI qw/:cgi-lib/; # --------------------------- # Globals # --------------------------- my $version = "jupcmcal.cg-v1.1"; my $APIver = "v0.9"; our %form; my %ret = ( 'status' => -99, # undefined error 'mjd' => -1, 'cm1' => -1, 'cm2' => -1, 'cm3' => -1, 'apiversion' => $APIver, ); # --------------------------- # main # --------------------------- Log::Log4perl::init('./log4perl.conf'); my $logger = Log::Log4perl::get_logger("mylogger"); my $srcIP = $ENV{'REMOTE_ADDR'}; $logger->info("$0 started (IP=$srcIP)."); ReadParse(*form); my $t = $form{'time'}; # ISO 8061 format is expected $logger->debug("t=$t"); print("Content-type: application/json\n\n"); # -------------------------- # parse time string (ISO 8061) # -------------------------- my ($yy, $mm, $dd, $hh, $mi, $ss, $tz) = (); if ($t =~ /(\d{4})-*(\d{2})-*(\d{2})T(\d{2})\:*(\d{2})\:*(\d{2})(Z|[+-]\d{4})/) { ($yy, $mm, $dd, $hh, $mi, $ss, $tz) = ($1, $2, $3, $4, $5, $6, $7); } elsif ($t =~ /(\d{4})-*(\d{2})-*(\d{2})T(\d{2})\:*(\d{2})\.(\d{1})(Z|[+-]\d{4})/) { ($yy, $mm, $dd, $hh, $mi, $ss, $tz) = ($1, $2, $3, $4, $5, $6, $7); $ss *= 6; } else { $logger->error("'$t': Invalid time format."); $ret{'status'} = -1; clean_exit(1); } $logger->debug("yy=$yy, mm=$mm, dd=$dd, hh=$hh, mi=$mi, ss=$ss, tz=$tz"); # -------------------------- # final validation # -------------------------- if ($yy < 1901 || $mm < 1 || $mm > 12 || $dd < 1 || $dd > 31 || $hh < 0 || $hh > 30 || $mi < 0 || $mi > 60 || $ss < 0 || $ss > 60) { $ret{'status'} = -1; clean_exit(9); } $logger->debug("validation passed. continue..."); # -------------------------- # calc MJD and CM # -------------------------- my $mjd = MJD($yy, $mm, $dd, $hh, ($mi + $ss / 60), $tz); $ret{'mjd'} = $mjd; my ($cm1, $cm2, $cm3) = CM($mjd); $ret{'cm1'} = sprintf("%3.1f", $cm1); $ret{'cm2'} = sprintf("%3.1f", $cm2); $ret{'cm3'} = sprintf("%3.1f", $cm3); $ret{'status'} = 0; clean_exit(0); # ------------------------------------- # clean_exit --- # ------------------------------------- sub clean_exit { my $rc = shift; $logger->info("$0 finished. (rc=$rc)"); print encode_json(\%ret); exit ($rc); } # ------------------------------------- # CM --- calc CM # ------------------------------------- sub CM { my ($mjd) = shift; my ($cm1, $cm2, $cm3) = (); # return values my $RAD = 0.0174532925199433; my $IR = (134.630 + $mjd * 0.00111587) * $RAD; my $JR = (358.476 + $mjd * 0.9856) * $RAD; my $KR = (225.328 + $mjd * 0.083085 + 0.33 * sin($IR)) * $RAD; my $L = 221.650 + $mjd * 0.902518 - 0.33 * sin($IR); my $M = 1.916 * sin($JR) + 0.02 * sin(2 * $JR); my $N = 5.552 * sin($KR) + 0.167 * sin(2 * $KR); my $OR = ($L + $M - $N) * $RAD; my $P = 1 - 0.0167 * cos($JR) - 0.00014 * cos(2 * $JR); my $Q = 5.21 - 0.252 * cos($KR) - 0.0061 * cos(2 * $KR); my $R = sqrt($Q * $Q + $P * $P - 2 * $Q * $P * cos($OR)); my $SSI = $P * sin($OR) / $R; my $SCO = sqrt(1 - $SSI * $SSI); my $SR = atan2($SSI , $SCO); my $S = $SR / $RAD; my $sk = ($S < 0) ? 1 : -1; my $T = 877.8169088 * ($mjd - $R / 173) + $S - $N + 269.10 + 57.3 * $sk * (sin($SR * 0.5)) ** 2; my $U = 870.1869088 * ($mjd - $R / 173) + $S - $N + 291.04 + 57.3 * $sk * (sin($SR * 0.5)) ** 2; my $V = 870.4529088 * ($mjd - $R / 173) + $S - $N + 177.04 + 57.3 * $sk * (sin($SR * 0.5)) ** 2; $cm1 = $T - 360 * int($T / 360.0); $cm2 = $U - 360 * int($U / 360.0); $cm3 = $V - 360 * int($V / 360.0); $logger->debug("CM($mjd) ==> $cm1, $cm2, $cm3"); ($cm1, $cm2, $cm3) ; } # ------------------------------------- # MJD --- Calc MJD # ------------------------------------- sub MJD { my ($sy, $sm, $sd, $sh, $smin, $stz) = @_; my ($mjd); $logger->debug("enter MJD($sy, $sm, $sd, $sh, $smin, $stz)"); if ($sm > 2) { $sy = $sy - 1900; $sm = $sm; } else { $sy = $sy - 1901; $sm = $sm + 12; } my $dt = 0; if ($stz =~ /([+-]*\d{2})(\d{2})/) { my ($h, $m) = ($1, $2); $dt = ($h / 24.0) + ($m / 24.0 / 60); $logger->debug("MJD() h=$h / m=$m ==> dt=$dt"); } $mjd = int($sy * 365.25) + int(30.6 * $sm + 0.6) + $sd - 34 + ($sh / 24.0) + ($smin / 1440) + 0.5 - $dt; $logger->debug("exit MJD() ==> $mjd"); ($mjd) ; } __END__