在实际的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注释部分自行修改。
分享到:
相关推荐
07.MySql函数-2.sql
Maven坐标:com.github.shyiko:mysql-binlog-connector-java:0.21.0; 标签:github、shyiko、mysql、binlog、connector、java、中文文档、jar包; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件...
flutter + SpringBoot + MySql 实现高德地图定位获取位置信息插入数据库并计算出经纬度之间的距离
MySQL函数 数字转中文 非金额 处理数据类型 decimal(21,6)
百度坐标,84坐标,gjc02坐标系之间的转换函数
包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-...
【IT十八掌徐培成】Java基础第23天-05.jdbc-mysql函数 - 副本.zip
本资源包括全国地铁线、地铁站名称及经纬度坐标的mysql文件。
我3分算了,现在的积分要的太坑了。。。。。 mysql PDF函数大全,mysql常用命令,mysql 5.0中文帮助文档,打包的,zip格式的。。。 刚好三个,给初学者,我也尽力了
需求:现在移动app的运用越来越广泛了,这里有个需求就是查找我附近的酒店 或者是团购这样类似的功能 前提:一般我们的酒店都是有...也就是说 我们数据库已经保存了每个酒店的经纬度的 我们手机会得到当前的经纬度的.
mysql-connector-java-5.1.27.jar mysql-connector-java-5.1.27.jar
mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar
mysql-connector-java-5.1.7-bin.jar
MySql-窗口函数-面试题,很细,有函数讲解,有题干和解答
mysql-connector-java-5.1.37.zip
中国城市行政区坐标经纬度 中国省市区县位置坐标mysql数据库 全国哪个行政区的坐标都有!
mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。
mysql57-community-release-el7-11.noarch.rpm,使用mysql 官方yum 仓库,方法本土下载
2020最新中国行政区划mysql数据表,包含中国省市县行政编码,邮编,区号,拼音,经纬度坐标,层级关系等。sql格式文件,可直接导入。