`
linfengsheng
  • 浏览: 130626 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

mysql 下 计算 两点 经纬度 之间的距离(二)

 
阅读更多

公式如下,单位米:

第一点经纬度:lng1 lat1

第二点经纬度:lng2 lat2

round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000)

 

参考资料如下:

http://www.cnblogs.com/ycsfwhh/archive/2010/12/20/1911232.html

 

根据两点经纬度计算距离

这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的
假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈
就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段,
叫做纬线。我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬。
北极就是北纬90度,南极就是南纬90度。纬度的高低也标志着气候的冷热,如赤道和低纬度地地区无冬,
两极和高纬度地区无夏,中纬度地区四季分明。 
其次,从北极点到南极点,可以画出许多南北方向的与地球赤道垂直的大圆圈,这叫作“经圈”;构成这
些圆圈的线段,就叫经线。公元1884平面坐标图年,国际上规定以通过英国伦敦近郊的格林尼治天文台的
经线作为计算经度的起点,即经度零度零分零秒,也称“本初子午线”。在它东面的为东经,共180度;
在它西面的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同一条经线。各国
公定180度经线为“国际日期变更线”。为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时
略有偏离。 
  每一经度和纬度还可以再细分为60分,每一分再分为60秒以及秒的小数。利用经纬线,我们就可以确定
地球上每一个地方的具体位置,并且把它在地图或地球仪上表示出来。例如问北京的经纬度是多少?我们
很容易从地图上查出来是东经116度24分,北纬39度54分。在大海中航行的船只,只要把所在地的经度测
出来,就可以确定船在海洋中的位置和前进方向。 纬度共有90度。赤道为0度,向两极排列,圈子越小,
度数越大。
横线是纬度,竖线是经度。 
当然可以计算,四元二次方程。 
经度和纬度都是一种角度。经度是个两面角,是两个经线平面的夹角。因所有经线都是一样长,为了度量
经度选取一个起点面,经1884年国际会议协商,决定以通过英国伦敦近郊、泰晤士河南岸的格林尼治皇家
天文台(旧址)的一台主要子午仪十字丝的那条经线为起始经线,称为本初子午线。本初子午线平面是起
点面,终点面是本地经线平面。某一点的经度,就是该点所在的经线平面与本初子午线平面间的夹角。在
赤道上度量,自本初子午线平面作为起点面,分别往东往西度量,往东量值称为东经度,往西量值称为西
经度。由此可见,一地的经度是该地对于本初子午线的方向和角距离。本初子午线是0°经度,东经度的最
大值为180°,西经度的最大值为180°,东、西经180°经线是同一根经线,因此不分东经或西经,而统称
180°经线。 
  纬度是个线面角。起点面是赤道平面,线是本地的地面法线。所谓法线,即垂直于参考扁球体表面的线。
某地的纬度就是该地的法线与赤道平面之间的夹角。纬度在本地经线上度量,由赤道向南、北度量,向北
量值称为北纬度,向南量值称为南纬度。由此可见,一地的纬度是该地对于赤道的方向和角距离。赤道是
0°纬线,北纬度的最大值为90°,即北极点;南纬度的最大值为90°,即南极点。

经纬度互换

度(DDD):E 108.90593度    N 34.21630度

    如何将度(DDD):: 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?转换方法是将108.90593整数位不变取108(度),用0.90593*60=54.3558,取整数位54(分),0.3558*60=21.348再取整数位21(秒),故转化为108度54分21秒.

   同样将度分秒(DMS):东经E 108度54分22.2秒 换算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度

因为计算时小数位保留的原因,导致正反计算存在一定误差,但误差影响不是很大。1秒的误差就是几米的样子。GPS车友可以用上述方法换算成自己需要的单位坐标。

 

 

经纬度换算成米

纬度分为60分,每一分再分为60秒以及秒的小数。

纬度线投射在图上看似水平的平行线,但实际上是不同半径的圆。有相同特定纬度的所有位置都在同一个纬线上。 
赤道的纬度为0°,将行星平分为南半球和北半球。 
纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N,位于赤道以南的点的纬度称南纬,记为S。
纬度数值在0至30度之间的地区称为低纬地区,纬度数值在30至60度之间的地区称为中纬地区,纬度数值在60至90度之间的地区称为高纬地区。
赤道、南回归线、北回归线、南极圈和北极圈是特殊的纬线。
纬度1秒的长度
地球的子午线总长度大约40008km。平均:
纬度1度 = 大约111km 
纬度1分 = 大约1.85km 
纬度1秒 = 大约30.9m 

根据地球上任意两点的经纬度计算两点间的距离

地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。如果以0度经线为基 准,那么根据地球表面任意两点的经纬度就可以计算出这两点间的地表距离(这里忽略地球表面地形对计算带来的误差,仅仅是理论上的估算值)。设第一点A的经 纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三角推导,可以得到计算两点距离的如下公式:

C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)

Distance = R*Arccos(C)*Pi/180

这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile

如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是:

C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)

Distance = R*Arccos(C)*Pi/180

以上通过简单的三角变换就可以推出。

如果三角函数的输入和输出都采用弧度值,那么公式还可以写作:

C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)

Distance = R*Arccos(C)*Pi/180

也就是:

C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)

Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所 计算的距离范围-等等),所以,通过邮政编码查询经纬度这样一个数据库是一个很有用的资源。
附:C#代码:

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;
}

分享到:
评论
1 楼 dying318 2012-08-28  
前面说的倒挺详细的,怎么最后的C#里面的公式就变了。
前面是Distance = R*Arccos(C)*Pi/180,C的推导我也知道,但是最后的代码里面就看不懂了,
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)));
怎么又变成Asin了?

相关推荐

    mysql函数-根据经纬度坐标计算距离

    在二维平面上,我们可以使用余弦定理来计算两点间的欧氏距离,但在地球上,需要使用哈弗辛公式(Haversine Formula): 哈弗辛公式如下: \[ a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cdot \...

    计算两经纬度之间的距离存储过程_mysql

    通过创建这个存储过程,可以方便地在MySQL中计算两点之间的距离,这对于地理信息系统(GIS)应用非常有用。此外,这种方法还可以扩展到其他领域,如物流管理和导航服务等。存储过程中使用了球面三角公式来精确计算两...

    flutter + SpringBoot + MySql 实现高德地图定位获取位置信息插入数据库并计算出经纬度之间的距离

    flutter + SpringBoot + MySql 实现高德地图定位获取位置信息插入数据库并计算出经纬度之间的距离

    MYSQL 关于两个经纬度之间的距离由近及远排序

    为了计算两点之间的球面距离,我们可以使用大圆距离公式,这涉及到三角函数和地球半径的计算。 上述代码中使用了一个近似的计算方法,即Haversine公式。Haversine公式可以计算地球上两点之间的大圆距离,公式如下:...

    PHP根据两点间的经纬度计算距离

    PHP根据两点间的经纬度计算距离 一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime ...本案例主要使用PHP中的数学函数,通过两点间的经纬度来计算两点之间的距离。

    PHP根据两点间的经纬度计算距离1

    计算两点间距离的核心函数是`getDistance()`。该函数接收四个参数,即两个地点的纬度和经度(以度为单位)。首先,我们设定地球的平均半径为6367000米,然后将输入的经纬度转换为弧度。接着,使用半正矢公式...

    腾讯地图行政区域经纬度转Mysql国内地区数据库

    同时,`latitude` 和 `longitude` 字段使得我们可以利用Haversine公式或其他空间距离计算方法,快速估算两个地点之间的直线距离。 其次,`说明.txt` 文件可能是对数据转换过程的详细指南,包括如何导入SQL脚本到...

    Java通过经纬度坐标获取两个点之间的直线距离的示例

    计算两点之间的直线距离的公式为:distance = 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)));其中,a 是两点之间的纬度差,...

    利用java、js或mysql计算高德地图中两坐标之间的距离

    计算两个坐标点之间的距离,可以使用Haversine公式,它基于地球的平均半径来估算两点之间的大圆距离。Haversine公式如下: ``` a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2) c = 2 ⋅ atan2( √a, √...

    使用MySQL的geometry类型处理经纬度距离问题的方法

    2. 计算两点之间的距离(使用地球表面的大圆距离,单位为米): ```sql SELECT ST_Distance_Sphere(POINT(121.590347, 31.388094), location) AS distant FROM map; ``` `ST_Distance_Sphere`函数计算了地球上两点...

    rvincenty:Ruby的Vincenty公式的实现,以计算地球上两点之间的距离

    这是Vincenty公式的Ruby实现,用于计算地球上两点之间的距离。 该公式假定地球的形状是扁球形,因此比假定球形地球的其他方法要准确得多。 该代码在很大程度上受到Chris Venues Javascript实现和解释的启发: 两...

    高德mysql信息表:区域名称、城市编码、邮政编码、经纬度、名称拼音

    高德的这个信息表中包含经纬度,意味着可以结合GPS或其他定位系统进行地图展示、距离计算和位置搜索等功能。 “名称拼音”对于中文地址尤其重要,因为许多系统可能无法识别汉字。将地名转换为拼音,有助于非中文...

    全国城市商圈经纬度MYSQL版

    3. **MySQL的空间扩展**: MySQL通过Spatial扩展提供了对空间数据的支持,包括创建“Point”类型的列来存储经纬度,以及提供一系列的空间函数,如ST_DistanceSphere用于计算两点间的距离。 4. **SQL查询**: 在MySQL...

    最新全国省市区县经纬度sql

    例如,使用ST_Distance函数可以计算两个地点之间的直线距离,而使用Spatial Index可以优化空间查询性能。 这个数据集的使用场景广泛,例如: 1. 地图应用:在地图服务中显示行政区域边界,提供定位和导航功能。 2....

    全国地铁经纬度

    - **距离查询**:通过计算两点间的距离,找出与某一特定点最近的地铁站。这通常需要用到`Spherical Law of Cosines`或`Haversine Formula`。例如,在MySQL中: ```sql SELECT *, 6371 * acos(cos(radians(目标...

    中国省市表带经纬度sql

    此外,结合GIS库(如PostGIS)还可以进行更复杂的地理计算,比如计算两点之间的距离、找出最近的服务设施等。对于开发地图应用、物流配送、位置服务等领域,这样的数据集是不可或缺的基础。 总之,"中国省市表带...

    腾讯地图行政区域经纬度转Mysql国内地区数据库.zip

    7. **空间数据类型与GIS函数**:MySQL支持GIS扩展,如InnoDB存储引擎的SPATIAL数据类型和一系列GIS函数,用于处理几何对象,如计算两点之间的距离、判断是否在区域内等。 8. **编程语言与库**:实现上述功能通常会...

    关于经纬度使用的 sql 脚本(geometry的用法)

    要进行距离计算,可以使用`ST_Distance_Sphere`函数,计算两个点之间的球面距离: ```sql SELECT ST_Distance_Sphere(location, ST_GeomFromText('POINT(-74.0060 40.7128)', 4326)) AS distance FROM locations...

    sql_MYSQL_zipperbag_

    3. **计算两个经纬度之间的距离**:这与GPS点之间的距离计算相似,但这里可能是指在特定的应用场景下,如车辆追踪或物流管理中,对两个地理位置的快速比较。同样,可以使用Haversine公式或者MySQL的Spatial函数来...

Global site tag (gtag.js) - Google Analytics