两个经纬度算距离公式及方法

两个经纬度算距离公式及方法,第1张

纬度经度与纬度的合称组成一个坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。怎么计算两个经纬度之间的距离,有什么计算公式或者方法技巧?

1 经纬度计算方法

在地球上任何地点,只要有只表,有根竹竿,一根卷尺,就可知道当地经纬度。但表必须与该国标准时校对。

方法如下: 1、先算两分日

比如在中国某地,杆影最短时是中午13点20分,且杆长与影长之比为1,则可知该地是北纬45°(tgα=1),东经100°(从120°里1小时减15°,4分钟减1°)杆长与影长之比需查表求α,这里用了特殊角。

2、再算两至日经度的算法不变 纬度在北半球冬至α+235°,夏至α-235°在任意一天加减修正值即可。

3、修正值算法:就是距两分或两至日的天数差乘以94/365 比如2013年2月17日,2013年3月22日春分差33天,即太阳直射点在南纬

33×94/365=85°

所以今天正午时得到的纬度是(arctgα+85)°

tgα= 杆长/影长

1 计算地球上两点距离d

1已知地球上两点的经度、纬度:(X1,Y1), (X2,Y2),其中X1,X2为经度,Y1,Y2为纬度;

视计算程序需要转化为弧度(31415926/180)

地球半径为R=63710 km

则两点距离d=Rarcos[cos(Y1)cos(Y2)cos(X1-X2)+sin(Y1)sin(Y2)]

2在地球上同一条经线上纬度相差一度,实际距离是111公里;在赤道经度相差一度,实际距离是111公里,在其他的纬线上,经度每相差一度,实际距离是111经度数cos经度数,例如在北纬30度,经度相差5度,实际距离是:1115cos30度。

1 用经纬度大致计算距离

地球赤道上环绕地球一周走一圈共 4007504公里

而一圈分成360°

而每1°(度)有60'

每一度一秒在赤道上的长度计算如下:

4007504km/360°=11131955km

11131955km/60'=18553258km=18553m

而每一分又有60秒

每一秒就代表 18553m/60=3092m

任意两点距离计算公式为

d=11112cos{1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB-λA)]}

其中:A点经度,纬度分别为λA和ΦA

B点的经度、纬度分别为λB和ΦB,d为距离

地球上所有地方的纬度一分的距离都是约等于186公里,也就是一度等于186*60=111公里。

不同纬度处的经度线上的一分的实际长度是不同的,219国道基本在东经29-38度之间,29度处的一分经线长约163公里,38度处的一分经线长约147公里。

#define PI 31415926 

 #include<mathh> 

 #include<iostream> 

 using namespace std; 

 int days_of_month_1[]={31,28,31,30,31,30,31,31,30,31,30,31}; 

 int days_of_month_2[]={31,29,31,30,31,30,31,31,30,31,30,31}; 

 long double h=-0833; 

 //定义全局变量 

void input_date(int c[]){ 

     int i; 

     cout<<"Enter the date (form: 2009 03 10):"<<endl; 

     for(i=0;i<3;i++){ 

         cin>>c[i]; 

     } 

 } 

 //输入日期 

void input_glat(int c[]){ 

     int i; 

     cout<<"Enter the degree of latitude(range: 0°- 60°,form: 40 40 40 (means 40°40′40″)):"<<endl; 

     for(i=0;i<3;i++){ 

         cin>>c[i]; 

     } 

 } 

 //输入纬度 

void input_glong(int c[]){ 

     int i; 

     cout<<"Enter the degree of longitude(west is negativ,form: 40 40 40 (means 40°40′40″)):"<<endl; 

     for(i=0;i<3;i++){ 

         cin>>c[i]; 

     } 

 } 

 //输入经度 

int leap_year(int year){ 

     if(((year%400==0) || (year%100!=0) && (year%4==0))) return 1; 

     else return 0; 

 } 

 //判断是否为闰年:若为闰年,返回1;若非闰年,返回0 

 int days(int year, int month, int date){ 

     int i,a=0; 

     for(i=2000;i<year;i++){ 

         if(leap_year(i)) a=a+366; 

         else a=a+365; 

     } 

     if(leap_year(year)){ 

         for(i=0;i<month-1;i++){ 

             a=a+days_of_month_2[i]; 

         } 

     } 

     else { 

         for(i=0;i<month-1;i++){ 

             a=a+days_of_month_1[i]; 

         } 

     } 

     a=a+date; 

     return a; 

 } 

 //求从格林威治时间公元2000年1月1日到计算日天数days 

 long double t_century(int days, long double UTo){ 

     return ((long double)days+UTo/360)/36525; 

 } 

 //求格林威治时间公元2000年1月1日到计算日的世纪数t 

 long double L_sun(long double t_century){ 

     return (280460+36000770t_century); 

 } 

 //求太阳的平黄径 

long double G_sun(long double t_century){ 

     return (357528+35999050t_century); 

 } 

 //求太阳的平近点角 

long double ecliptic_longitude(long double L_sun,long double G_sun){ 

     return (L_sun+1915sin(G_sunPI/180)+002sin(2G_sunPI/180)); 

 } 

 //求黄道经度 

long double earth_tilt(long double t_century){ 

     return (234393-00130t_century); 

 } 

 //求地球倾角 

long double sun_deviation(long double earth_tilt, long double ecliptic_longitude){ 

     return (180/PIasin(sin(PI/180earth_tilt)sin(PI/180ecliptic_longitude))); 

 } 

 //求太阳偏差 

long double GHA(long double UTo, long double G_sun, long double ecliptic_longitude){ 

     return (UTo-180-1915sin(G_sunPI/180)-002sin(2G_sunPI/180)+2466sin(2ecliptic_longitudePI/180)-0053sin(4ecliptic_longitudePI/180)); 

 } 

 //求格林威治时间的太阳时间角GHA 

 long double e(long double h, long double glat, long double sun_deviation){ 

     return 180/PIacos((sin(hPI/180)-sin(glatPI/180)sin(sun_deviationPI/180))/(cos(glatPI/180)cos(sun_deviationPI/180))); 

 } 

 //求修正值e 

 long double UT_rise(long double UTo, long double GHA, long double glong, long double e){ 

     return (UTo-(GHA+glong+e)); 

 } 

 //求日出时间 

long double UT_set(long double UTo, long double GHA, long double glong, long double e){ 

     return (UTo-(GHA+glong-e)); 

 } 

 //求日落时间 

long double result_rise(long double UT, long double UTo, long double glong, long double glat, int year, int month, int date){ 

     long double d; 

     if(UT>=UTo) d=UT-UTo; 

     else d=UTo-UT; 

     if(d>=01) { 

         UTo=UT; 

         UT=UT_rise(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))); 

         result_rise(UT,UTo,glong,glat,year,month,date); 

     } 

     return UT; 

 } 

 //判断并返回结果(日出) 

long double result_set(long double UT, long double UTo, long double glong, long double glat, int year, int month, int date){ 

     long double d; 

     if(UT>=UTo) d=UT-UTo; 

     else d=UTo-UT; 

     if(d>=01){ 

         UTo=UT; 

         UT=UT_set(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))); 

         result_set(UT,UTo,glong,glat,year,month,date); 

     } 

     return UT; 

 } 

 //判断并返回结果(日落) 

int Zone(long double glong){ 

     if(glong>=0) return (int)((int)(glong/150)+1); 

     else return (int)((int)(glong/150)-1); 

 } 

 //求时区 

void output(long double rise, long double set, long double glong){ 

     if((int)(60(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<10) 

         cout<<"The time at which the sun rises is "<<(int)(rise/15+Zone(glong))<<":0"<<(int)(60(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<<" \n"; 

     else cout<<"The time at which the sun rises is "<<(int)(rise/15+Zone(glong))<<":"<<(int)(60(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<<" \n"; 

     if((int)(60(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<10) 

         cout<<"The time at which the sun sets is "<<(int)(set/15+Zone(glong))<<": "<<(int)(60(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<<" \n"; 

     else cout<<"The time at which the sun sets is "<<(int)(set/15+Zone(glong))<<":"<<(int)(60(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<<" \n"; 

 } 

 //打印结果 

         

int main(){ 

     long double UTo=1800; 

     int year,month,date; 

     long double glat,glong; 

     int c[3]; 

     input_date(c); 

     year=c[0]; 

     month=c[1]; 

     date=c[2]; 

     input_glat(c); 

     glat=c[0]+c[1]/60+c[2]/3600; 

     input_glong(c); 

     glong=c[0]+c[1]/60+c[2]/3600; 

     long double rise,set; 

     rise=result_rise(UT_rise(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))),UTo,glong,glat,year,month,date); 

     set=result_set(UT_set(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))),UTo,glong,glat,year,month,date); 

     output(rise,set,glong); 

     system("pause"); 

     return 0; 

 }

[114°10′÷6°]+1=20(方括号为取整运算符),6N-3°=117°-----这是6度带带号和中央子午线; [(114°10′-15°)÷3°]+1=38,3N=114°----这是3度带带号和中央子午线。

二分日的日出时间是北京时间640 ,因北京时间是120度的地方时,也就是说120度的地方时是6:40所以6:00的地方应该是和他差四十分钟的地方也就是经度差十度,方位在西,因为东加西减,所以是东经120-10=110度

地图显示什么的一般写在html里

script代码如下

var map = new BMapMap("容器ID"); // 创建地图实例

var point = new BMapPoint(精度值, 纬度值);// Location, (经度, 纬度)mapcenterAndZoom(point, 18);

var mark = new BMapMarker(point);//做标记

mapaddOverlay(mark);//在地图显示上添加标记

mapaddControl(new BMapMapTypeControl()); //为地图添加2D3D切换控件

mapsetCurrentCity("城市名"); // 仅当设置城市信息时,MapTypeControl的切换功能才能可用

要加什么直接参考相应运营商的API。

东经117度45分34秒

6度带:带号是第20带,中央子午线经度是东经117度。

3度带:带号是第39带,中央子午线经度是东经117度。

从零度子午线开始,自西向东每个经差6度为一投影带,全球共分60个带,用1、2、3、4、5……表示,即东经0——6度为第一带,其中央经线的经度为东经3度,东经6——12度为第二带,其中央经线的经度为东经9度……

从东经15度的经线开始每隔3度为一带用123……表示全球共划分120个投影带即东经15——45度为第1带其中央经线的经度为东经3度东经45——75度为第2带其中央经线的经度为东经6度……

设地面点的经度为L,求其六度带的中央子午线经度:先求其所处的带号,套公式:n=int(L/6°)+1,带入题设L=131°58′求出n=22再利用公式L0(6°带的中央子午线经度)=6°n-3°带入求出的n=22得到L0=129°望采纳。。。

以上就是关于两个经纬度算距离公式及方法全部的内容,包括:两个经纬度算距离公式及方法、利用日期、经纬度求日出日落时间 C语言程序代码、某点的大地经度是150.3请计算该点所在的6度带带号和中央子午线经度,以及所在的3度带带号和中央子午线经度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10162579.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存