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

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

阅读更多
    在实际的Web开发中,越来越多的碰到一些特定领域的专业算法,比如本文提到的根据两点经纬度计算距离的方法。
通常的两种计算:
1。要算的距离是椭球面的距离
    设第一点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

2。google地图提供的方法(PHP版本)
class Distance{
const EARTH_RADIUS = 6378.137; // earth radius (const) kilometer

	/**
	 *
	 *	Example:
	 *		$precision = 49;
	 *		ini_set("precision", $precision);
	 *		echo pi(); //will output 3.141592653589793115997963468544185161590576171875
	 *
	 *		1 kilometer = 0.621371192 mile
	 *
	 *	@param double d
	 *	@return double data
	 */
	private function rad( $d )
	{
		return $d * M_PI / 180.0;
	}

	/**
	 *
	 *	Example : get_distance(44.2112,-88.4175,34.5082,-82.6498)
	 *	Get Distance between two point : longitude,latitude(lat1,lng1 => lat2,lng2 )
	 *
	 *	@param double d
	 *	@return double data
	 *
	 */
	public function get_distance( $lat1, $lng1, $lat2, $lng2, $base = 1000 )
	{
		$radLat1 = floatval( $this->rad($lat1) );
		$radLat2 = floatval( $this->rad($lat2) );
		$a = $radLat1 - $radLat2;
		$b = $this->rad($lng1) - $this->rad($lng2);

		$s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));

		$s = $s * self::EARTH_RADIUS;
		$s = round($s * 10000) / 10000;

		return $s;
	}
}


    第一种方法计算繁琐,我们通常采用的还是第二种方法。但是,无论是第一种还是第二种如果直接用编程语言来转换的话,会非常耗时,因为,我们通常不得不将全部结果查出,然后再逐个计算过滤以得到结果集,如果需要排序,那将更加耗时。
    一个优化的方法就是采用SQL函数,具体的Mysql Function请参见附件,注意其中的括号,默认单位是公里,如果要转换成英里,请参考本文中PHP Code注释部分自行修改。
0
3
分享到:
评论
1 楼 sfcc 2013-12-19  
 

相关推荐

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

    使用空间索引后,可以使用特定的地理函数(如`ST_Distance_Sphere`或`ST_Distance_Spheroid`)来计算距离,而无需在查询中进行复杂的数学运算。 另外,如果你的数据库中存储了大量的地理位置信息,可能需要考虑使用...

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

    在本文中,我们将深入探讨如何使用PHP来计算两个地点之间的距离,基于它们的经纬度坐标。这个功能在很多Web应用程序中都有用到,比如地图服务、物流跟踪或旅行规划等。我们将按照以下步骤来实现这一功能: 首先,...

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

    本文主要介绍了Java通过经纬度坐标获取两个点之间的直线距离的示例,通过示例代码详细介绍了计算两个点之间的直线距离的方法,对大家的学习或者工作具有一定的参考学习价值。 一、经纬度坐标获取两个点之间的直线...

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

    首先,你需要创建一个具有GIS类型(如`POINT`)的列,然后可以使用`ST_Distance_Sphere`函数来计算距离。以下是一个例子: ```sql CREATE TABLE locations ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50...

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

    1. 查看经纬度坐标: ```sql SELECT address, ST_AsText(location) AS location FROM map; ``` 2. 计算两点之间的距离(使用地球表面的大圆距离,单位为米): ```sql SELECT ST_Distance_Sphere(POINT(121....

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

    在处理经纬度时,我们可以将每个地点视为一个点,用经纬度坐标表示。经纬度遵循笛卡尔坐标系统,其中经度代表水平位置,范围从-180到180度,纬度代表垂直位置,范围从-90到90度。 在SQLQuery5.sql、SQLQuery1.sql、...

    point-clustering.rar Java后端前端进行经纬度点抽稀聚合渲染

    Java后端进行经纬度点抽稀聚合,HTML呈现及前端聚合渲染 index.html 谷歌map后端点聚合 geos.html 后端点聚合并渲染 geo_cluster.html mapbox前端点聚合 jpg/heatJpgTile.html 栅格瓦片jpg渲染底图及数据 multilines...

    2020最新mysql数据库地理位置数据,包含省市区街道,及编码,数据结构到街道

    然后,可以使用空间函数进行距离计算、覆盖范围检查等操作,这对于提供基于位置的服务非常有用。 此外,编码信息可能指的是行政区域代码,如中国国家标准GB/T 2260,它为每个省、市、区分配了唯一的数字代码。这些...

    全国城市商圈经纬度MYSQL版

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

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

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

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

    用户只需要创建相应的表格结构,然后执行这些SQL语句,就能快速构建一个包含中国全部行政区域经纬度坐标的数据集。 在IT领域,经纬度数据是地理信息系统的基础,它通过经度和纬度坐标来表示地球上任意一点的位置。...

    PHP计算当前坐标3公里内4个角落的最大最小经纬度实例

    在PHP编程中,有时我们需要根据一个给定的中心坐标来计算特定范围内的边界坐标,例如在地图应用中,用户可能需要查找距离当前位置3公里内的兴趣点。本篇将详细讲解如何利用PHP计算当前坐标3公里内四个角落的最大最小...

    全国地铁经纬度

    总结来说,全国地铁经纬度的SQL处理涉及了对地理坐标数据的存储、检索、排序、计算距离和范围查询等一系列操作,这需要对SQL和地理信息系统有深入的理解。在实际应用中,这些数据对于城市规划、交通研究以及智能出行...

    sql_MYSQL_zipperbag_

    1. **GPS点之间的距离计算**:在GIS(地理信息系统)中,经常需要计算两个GPS坐标点之间的距离。这通常使用Haversine公式来实现,该公式基于地球的半径计算出两点之间的大圆弧距离。在MySQL中,可以使用内置的`SP_...

    mysql 搜寻附近N公里内数据的简单实例

    根据球面上两点间距离的计算公式(Haversine公式),可以构建SQL查询。 Haversine公式如下: \[ C = \sin^2(\frac{\Delta\phi}{2}) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \sin^2(\frac{\Delta\lambda}{2}) \] \...

    PHP查询附近的人及其距离的实现方法

    - `getDistanceBetweenPointsNew` 函数实现了根据Haversine公式计算两个经纬度坐标之间的距离。 - 公式利用三角函数和地球半径计算两点间的弧长,再转换为常用的单位(英里、英尺、码、千米、米)。 - 函数接受两...

    2023最新地图数据,包含省市区,坐标,geo

    在数据库中存储和查询地理数据时,可以利用MySQL的Spatial函数,如ST_GeomFromText用于创建几何对象,ST_Contains用于检查一个几何对象是否包含另一个,以及ST_Distance计算两个几何对象之间的距离等。这样,你可以...

    美国州城市县数据库(.sql文件)

    经纬度坐标用于在地球上精确定位每个州和城市。GIS可以将这些坐标与地图数据相结合,提供可视化的地理信息,比如在地图上标记出所有城市的位置。 为了有效地利用这些数据,用户需要熟悉SQL查询语言,包括JOIN操作来...

Global site tag (gtag.js) - Google Analytics