/*************************************************************************
2地点間の距離を求める
入力:2地点の緯度、経度
出力:直距離、地表面距離、半射程角
19999.08.08
By T.Kubota
*************************************************************************/
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793238462 /* 円周率 */
int main(void) {
double f1,f2; /* 2地点の緯度(°) */
double fr1,fr2; /* 2地点の緯度(rad) */
double g1,g2; /* 2地点の経度(東経基準)(°) */
double gr1,gr2; /* 2地点の経度(東経基準)(rad) */
double h1,h2; /* 標高(m) */
double a=6378136.0; /* 赤道半径(m) */
double e2=0.006694470; /* 地球の離心率の自乗 */
double x1,y1,z1,x2,y2,z2; /* 2地点の直交座標値(m) */
double r; /* 2地点間の直距離(m) */
double s; /* 2地点間の地表面距離(m) */
double w; /* 2地点間の半射程角(°) (中心角の1/2) */
double wr; /* 2地点間の半射程角(rad) */
double rad; /* 度→ラジアン変換係数 */
double N1,N2; /* 緯度補正した地球の半径(m) */
rad=PI/180.0;
h1=h2=0.0; /* ここでは、標高を無視 */
printf("第1地点の緯度、経度(°,西経は負符号)を入力して下さい。--->");
scanf("%lf %lf",&f1,&g1);
if(g1<0) g1=360.0+g1;
fr1=f1*rad; gr1=g1*rad;
printf("第2地点の緯度、経度(°,西経は負符号)を入力して下さい。--->");
scanf("%lf %lf",&f2,&g2);
if(g2<0) g2=360.0+g2;
fr2=f2*rad; gr2=g2*rad;
N1=a/(sqrt(1.0-e2*sin(fr1)*sin(fr1)));
x1=(N1+h1)*cos(fr1)*cos(gr1);
y1=(N1+h1)*cos(fr1)*sin(gr1);
z1=(N1*(1.0-e2)+h1)*sin(fr1);
N2=a/(sqrt(1.0-e2*sin(fr2)*sin(fr2)));
x2=(N2+h2)*cos(fr2)*cos(gr2);
y2=(N2+h2)*cos(fr2)*sin(gr2);
z2=(N2*(1.0-e2)+h2)*sin(fr2);
r=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); /* 直距離 */
wr=asin(r/2/a); /* 半射程角(rad) */
w=wr/rad; /* 半射程角(°) */
s=a*2*wr; /* 地表面距離 */
putchar('\n');
printf("第1地点の緯度:%lf 経度:%lf\n",f1,g1);
printf("第2地点の緯度:%lf 経度:%lf\n",f2,g2);
printf("直 距 離 :%9.3lf km\n",r/1000);
printf("地表面距離 :%9.3lf km\n",s/1000);
printf("半 射 程 角:%8.4lf °\n",w);
getchar(); getchar();
return 0;
}