经纬度量距,并判断。

这段是转的。

地球赤道上环绕地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的长度计算如下:

40075.04km/360°=111.31955km

111.31955km/60=1.8553258km=1855.3m

而每一分又有60秒,每一秒就代表1855.3m/60=30.92m

任意两点距离计算公式为

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

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

至于比例尺计算就不废话了

 

这段也是转的。

从google maps的脚本里扒了段代码,没准啥时会用上。大家一块看看是怎么算的。

private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
   return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);
   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
   s = s * EARTH_RADIUS;
   s = Math.Round(s * 10000) / 10000;
   return s;
}

 

也是转的。

地球赤道上环绕地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的长度计算如下:
  40075.04km/360°=111.31955km
  111.31955km/60=1.8553258km=1855.3m
  而每一分又有60秒,每一秒就代表     1855.3m/60=30.92m
  任意两点距离计算公式为
  d=111.12cos{1/[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)]}
  其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。
  其次,从北极点到南极点,可以画出许多南北方向的与地球赤道垂直的大圆圈,这叫作“经圈”;构成这些圆圈的线段,就叫经线。公元1884平面坐标图年,国际上规定以通过英国伦敦近郊的格林尼治天文台的经线作为计算经度的起点,即经度零度零分零秒,也称“本初子午线”。在它东面的为东经,共180度;在它西面的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同一条经线。各国公定180度经线为“国际日期变更线”。为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时略有偏离。 
  每一经度和纬度还可以再细分为60分,每一分再分为60秒以及秒的小数。利用经纬线,我们就可以确定地球上每一个地方的具体位置,并且把它在地图或地球仪上表示出来。例如问北京的经纬度是多少?我们很容易从地图上查出来是东经116度24分,北纬39度54分。在大海中航行的船只,只要把所在地的经度测出来,就可以确定船在海洋中的位置和前进方向。 
  纬度共有90度。赤道为0度,向两极排列,圈子越小,度数越大
    北极点到南极点,可以画出许多南北方向的与地球赤道垂直的大圆圈,这叫作“经圈”;构成这些圆圈的线段,就叫经线。公元1884年,国际上规定以通过英国伦敦近郊的格林尼治天文台的经线作为计算经度的起点,即经度零度零分零秒,也称“本初子午线”。在它东面的为东经,共180度;在它西面的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同一条经线。各国公定180度经线为“国际日期变更线”。为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时略有偏离。
  国际上规定,把通过英国首都伦敦格林尼治天文台原址的那一条经线定为0°经线,也叫本初子午线。从0°经线算起,向东、向西各分作180°,以东的180°属于东经,习惯上用“E”作代号,以西的180°属于西经,习惯上用“W”作代号。东经180°和西经的180°重合在一条经线上,那就是180°经线。在地图上判读经度时应注意:从西向东,经度的度数由小到大为东经度;从西向东,经度的度数由大到小,为西经度;除0°和180°经线外,其余经线都能准确区分是东经度还是西经度。不同的经线具有不同的地方时。偏东的地方时要早,偏西的地方时要迟。每15个经度便相差一个小时
  卫星经度代表直播卫星所在的位置 因为直播的卫星轨道是同步轨道  所以纬度是0  只要说明其经度就可以知道它的位置了.经度数值和地球的一样  比如说你所在地经度是东经
115.5°  那么就代表卫星6B在你的斜上方
  俯仰角的大小可以由以下公式推算 θ=arctg(h/R)A/2 
  其中θ--天线的俯仰角 
  h--天线的高度 
  R--小区的覆盖半径 
  A天线的垂直平面半功率角 
 上式是将天线的主瓣方向对准小区边缘时得出的.在实际的调整工作中一般在由此得出的俯仰角角度的基础上再加上1-2度使信号更有效地覆盖在本小区之内. 
  在地平坐标系中,通过南点、北点的地平经圈称子午圈。子午圈被天顶、天底等分为两个180°的半圆。以北点为中点的半个圆弧,称为子圈,以南点为中点的半个圆弧,称为午圈。在地平坐标系中,午圈所起的作用相当于本初子午线在地理坐标系中的作用,是地平经度(方位)度量的起始面。
  方位角:是指卫星接收天线,在水平面做0°-360°旋转。方位角调整时抛物面在水平面做左右运动。
  通常我们通过计算软件或在资料中得到的结果应该是以正南方向为标准,将卫星天线的指向偏东或偏西调整一个角度,该角度即是所谓的方位角。至于到底是偏东还是偏西,取决于接收地与欲接收卫星之间的。

 

 

上述有误,应修改为:a=Lng1 -Lng2为两点纬度之差 b=Lat1–Lat2 为两点经度之差;
public double DistanceOfTwoPoints(double lat1, double lng1, double lat2, double lng2)
{
double radLng1 = lng1 * Math.PI / 180.0;
double radLng2 = lng2 * Math.PI / 180.0;
double a = radLng1 – radLng2;
double b = (lat1-lat2) * Math.PI / 180.0;
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2), 2) +
Math.Cos(radLng1) * Math.Cos(radLng2) * Math.Pow(Math.Sin(b/2), 2)))* 6378.137;
s =Math.Round(s * 10000) / 10000;
return s;
}
程序经验证正确通过!

 

转的。

2009-02-13 11:14:40 发表于电子技术 本文链接: 通过经纬度计算距离的公式

在去年cosbeta曾经发布了一个网页计算工具,这个作用就是根据地球上两点之间的经纬度计算两点之间的直线距离。经纬度到距离的计算在通信工程中应用比较广泛,所以cosbeta通过搜索找到了一个js的计算脚本(其实是google map的计算脚本,应该算是比较准确了),做成了这个经纬度算距离的工具

今天有人给cosbeta发邮件,询问计算的公式是什么样的。其实,若是把地球当作一个正常的球体(其实它是椭球)来说,球面两点之间的距离计算并不复杂,运用球坐标很容易就能计算出两点之间的弧长。当然这都是高中的知识,我和你一样,也没有那个耐心来将其推导,所以我就利用google map的经纬度到距离计算的js脚本,将球面弧长的公式给还原出来(估计这个公式是经过部分修正的),还原出来的公式如下:

对上面的公式解释如下:

公式中经纬度均用弧度表示,角度到弧度的转化应该是很简单的了吧,若不会,依然请参考这个这个经纬度算距离的工具

Lat1 Lung1 表示A点经纬度,Lat2 Lung2 表示B点经纬度;

a=Lat1 – Lat2 为两点纬度之差  b=Lung1 -Lung2 为两点经度之差;

6378.137为地球半径,单位为公里;

计算出来的结果单位为公里;

 

 

http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html

 

 

google maps的脚本里扒了段代码,没准啥时会用上。大家一块看看是怎么算的。

private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
   return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);
   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
   s = s * EARTH_RADIUS;
   s = Math.Round(s * 10000) / 10000;
   return s;
}

 

 

整理好后的完整程序如下:

#include <stdio.h>
#include <math.h>
#define EARTH_RADIUS  6378.137
#define PI 3.1415926
 double rad(double d)
{
   return d * PI / 180.0;
}
 double dis(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);
   double s = 2 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
   s = s * EARTH_RADIUS;
   return s;
}

int main()
{
 double lat1,lng1,lat2,lng2,distance;
 printf("please input lat1:/n");
 scanf("%lf:",&lat1);
 printf("please input lng1:/n");
 scanf("%lf:",&lng1);
 printf("please input lat2:/n");
 scanf("%lf:",&lat2);
 printf("please input lng2:/n");
 scanf("%lf:",&lng2);
 distance=dis(lat1,lng1,lat2,lng2);
 printf("the distance is %f Km/n:",distance);

 return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值