LBS计算两坐标的距离
移动互联网浪潮,LBS服务越来越广泛。实际场景经常会遇到两点距离或者n米范围内的商户问题。
网上资料很多介绍LBS的时候,都是关于LBS的概念解释,这不是我要讲的重点内容。
这里特别关注场景问题,不深入研究数学建模问题等问题,关注实际中如何利用算法来解决问题。
问题一 如何计算两点间的直线距离?(JAVA代码)
应用描述:两点带入经纬度即可,不需要描述。
/*** 根据两点经纬度((longitude and latitude))坐标计算直线距离* <p>* S = 2arcsin√sin²(a/2)+cos(lat1)*cos(lat2)*sin²(b/2) ̄*6378137* <p>* 1. lng1 lat1 表示A点经纬度,lng2 lat2 表示B点经纬度;<br>* 2. a=lat1 – lat2 为两点纬度之差 b=lng1 -lng2 为两点经度之差;<br>* 3. 6378137为地球赤道半径,单位为米;** @param longitude1* 点1经度* @param latitude1* 点1纬度* @param longitude2* 点2经度* @param latitude2* 点2纬度* @return 距离,单位米(M)* @see <a href=* "https://zh.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E7%9F%A2%E5%85%AC%E5%BC%8F">* 半正矢(Haversine)公式</a>*/public static double getDistanceFrom2LngLat(double longitude1, double latitude1, double longitude2, double latitude2) {// 将角度转化为弧度double radLongitude1 = radians(longitude1);double radLatitude1 = radians(latitude1);double radLongitude2 = radians(longitude2);double radLatitude2 = radians(latitude2);double a = radLatitude1 - radLatitude2;double b = radLongitude1 - radLongitude2;return 2 * Math.asin(Math.sqrt(Math.sin(a / 2) * Math.sin(a / 2)+ Math.cos(radLatitude1) * Math.cos(radLatitude2) * Math.sin(b / 2) * Math.sin(b / 2))) * (RC);}
问题二 如何查找n米内的商家?(JAVA代码)
应用描述 n米范围是一个圆形区域。
(1)以原点为基点,建立垂直坐标系(与经纬线平行),
(2)那么中心点的东北西南四个方向的最远点,可以经度最大值最小值,纬度最大值最小值,
(注:东北西南四个方向的角度分布为0度,90度,180度,270度)
(3)以经纬度最大最小值范围区间构建一个近似矩形
(4)此矩形范围内的点再进行距离计算,即可得出n米范围内的商家。
注:下图是某坐标点为基点3000米范围的东北西南的极点。
/*** 获取指定角度方向上的经纬度(longitude and latitude)<br>* 以原始点的经纬度为基点,构建XY二维坐标线,则angle角度则从x轴起算。<br>* 说明:LBS查找,东西南北四个方向的最远点,构建矩形,在矩形框方位内, 才有可能是该距离方位内的坐标,然后利用距离公式从小范围内找坐标* * * @param origLongitude* 基点经度* @param origLatitude* 基点纬度* @param distance* 距离(m)* @param angle* 角度(0~360)* @param 经纬度(该角度指定距离的经纬度)*/public static Coordinate getCoordinate(double origLongitude, double origLatitude, double distance, double angle) {double x = distance * Math.sin(angle * Math.PI / 180.0);double y = distance * Math.cos(angle * Math.PI / 180.0);double r = RJ + (RC - RJ) * (90.0 - origLongitude) / 90.0;//由于地球不是标准的球体,中间粗,两头细,这里計算平均半徑rdouble d = r * Math.cos(origLongitude * Math.PI / 180);double newLongitude = (y / r + origLongitude * Math.PI / 180.0) * 180.0 / Math.PI;double newLatitude = (x / d + origLatitude * Math.PI / 180.0) * 180.0 / Math.PI;return new Coordinate(newLongitude, newLatitude);}
问题三 如何验证算法计算结果?
地图测距:百度地图有测距工具。地址:略。
地理位置经纬度获取:百度地图拾取坐标系统。 地址:http://api.map.baidu.com/lbsapi/getpoint/index.html
注:上述算法结果经过验证。
附完整代码。(JAVA代码)
package com.game.common.tool.lbs;/*** 经纬度(gps里的经纬度)* * @author leng**/
public class Coordinate {/*** 经度*/protected double longitude;/*** 纬度*/protected double latitude;public Coordinate() {super();}public Coordinate(double longitude, double latitude) {super();this.longitude = longitude;this.latitude = latitude;}public double getLongitude() {return longitude;}public void setLongitude(double longitude) {this.longitude = longitude;}public double getLatitude() {return latitude;}public void setLatitude(double latitude) {this.latitude = latitude;}@Overridepublic String toString() {return "Coordinate [longitude=" + longitude + ", latitude=" + latitude + "]";}/*** 坐标点是否一致* * @param coord* @return*/public boolean equals(Coordinate coord) {if (null == coord) {return false;}return this.toString().equals(coord.toString());}}
package com.game.common.tool.lbs;/*** LBS服务工具* * @author leng**/
public class LBSUtil {/*** 赤道半径(m)*/public final static double RC = 6378137;/*** 极半径(m)*/public final static double RJ = 6356725;/*** 将角度转化为弧度*/public static double radians(double d) {return d * Math.PI / 180.0;}/*** 根据两点经纬度((longitude and latitude))坐标计算直线距离* <p>* S = 2arcsin√sin²(a/2)+cos(lat1)*cos(lat2)*sin²(b/2) ̄*6378137* <p>* 1. lng1 lat1 表示A点经纬度,lng2 lat2 表示B点经纬度;<br>* 2. a=lat1 – lat2 为两点纬度之差 b=lng1 -lng2 为两点经度之差;<br>* 3. 6378137为地球赤道半径,单位为米;** @param longitude1* 点1经度* @param latitude1* 点1纬度* @param longitude2* 点2经度* @param latitude2* 点2纬度* @return 距离,单位米(M)* @see <a href=* "https://zh.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E7%9F%A2%E5%85%AC%E5%BC%8F">* 半正矢(Haversine)公式</a>*/public static double getDistanceFrom2LngLat(double longitude1, double latitude1, double longitude2, double latitude2) {// 将角度转化为弧度double radLongitude1 = radians(longitude1);double radLatitude1 = radians(latitude1);double radLongitude2 = radians(longitude2);double radLatitude2 = radians(latitude2);double a = radLatitude1 - radLatitude2;double b = radLongitude1 - radLongitude2;return 2 * Math.asin(Math.sqrt(Math.sin(a / 2) * Math.sin(a / 2)+ Math.cos(radLatitude1) * Math.cos(radLatitude2) * Math.sin(b / 2) * Math.sin(b / 2))) * (RC);}/*** 获取指定角度方向上的经纬度(longitude and latitude)<br>* 以原始点的经纬度为基点,构建XY二维坐标线,则angle角度则从x轴起算。<br>* 说明:LBS查找,东西南北四个方向的最远点,构建矩形,在矩形框方位内, 才有可能是该距离方位内的坐标,然后利用距离公式从小范围内找坐标* * * @param origLongitude* 基点经度* @param origLatitude* 基点纬度* @param distance* 距离(m)* @param angle* 角度(0~360)* @param 经纬度(该角度指定距离的经纬度)*/public static Coordinate getCoordinate(double origLongitude, double origLatitude, double distance, double angle) {double x = distance * Math.sin(angle * Math.PI / 180.0);double y = distance * Math.cos(angle * Math.PI / 180.0);double r = RJ + (RC - RJ) * (90.0 - origLongitude) / 90.0;//由于地球不是标准的球体,中间粗,两头细,这里計算平均半徑rdouble d = r * Math.cos(origLongitude * Math.PI / 180);double newLongitude = (y / r + origLongitude * Math.PI / 180.0) * 180.0 / Math.PI;double newLatitude = (x / d + origLatitude * Math.PI / 180.0) * 180.0 / Math.PI;return new Coordinate(newLongitude, newLatitude);}}
LBS计算两坐标的距离相关推荐
- php高德地图计算距离接口,高德地图计算两坐标之间距离
最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了相关计算方法,供大家参 ...
- 高德地图计算两坐标之间距离
转载自:http://blog.csdn.net/jianggujin/article/details/72833711 如要转载请写明原创地址 Java实现 Javascript实现 MySQL实现 ...
- Mysql之st_distance_sphere计算两坐标点距离
最近项目中需要计算一个坐标点与多个点的距离,发现用Python来实现效率很低.经同事推荐,将这些坐标点存入了Mysql数据库,然后用数据库自带的方法st_distance_sphere计算距离.经过比 ...
- uniapp经纬度,并计算两坐标间距离
点击方法是获取了经纬度,没算距离,但底下有方法,拷一下就ok <template><view class="content"><image class ...
- Java-高德地图根据经纬度计算两坐标之间的直线距离
Java-高德地图根据经纬度计算两坐标之间的直线距离 最近在做毕设项目,项目打卡需要用到高德地图,看了下高德地图计算两坐标距离的方法,官网上提供的开发包中也有相关的方法. /**** @author ...
- CLLocation的distanceFromLocation方法计算地图上距离 (汇总)
准备两个CLLocation的对象,比如要计算某个位置与使用者当前位置的距离, 则其 中一个CLLocation是userLocation = [locationManager location],l ...
- 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?
我的理解是,直接求距离之和可能导致多个解存在的情况,而求距离平方和可以保证唯一解,参考: 当且仅当a=b时,不等式等号成立 参考文章:利用最小二乘法,用直线拟合5点时,为什么计算竖直距离而非垂直距离?
- mysql 计算gps坐标距离_mysql、sqlserver和php计算GPS经纬度坐标距离
摘要:mysql.sqlserver.oracle和php计算GPS经纬度坐标距离 mysql计算GPS经纬度距离DELIMITER $$ CREATEDEFINER=`root`@`localhos ...
- 如何用python计算levenshteindistance_Levenshtein计算相似度距离
使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...
- 多个点 最远距离 java_Java实现的计算最大下标距离算法示例
本文实例讲述了Java实现的计算最大下标距离算法.分享给大家供大家参考,具体如下: 题目描述 给定一个整形数组,找出最大下标距离j−i, 当且A[i] < A[j] 和 i < j 解法 ...
最新文章
- 观察者模式的经典应用(猫叫 烧开水)
- html5 settimeout,计时器setTimeout()
- UTF8转换为GB编码gb2312转换为utf-8
- linux vsftp的配置
- RH124 章1 访问命令行 笔记
- android sdk启动不了,windows server 2008下android sdk不能正常启动
- 【视频】v-bind的使用
- 计算机设计学校,计算机设计制作大赛
- 与 OpenCV 1 同时使用
- WordPress后台删除不需要的侧边栏菜单
- tensorboard ckpt pb 模型的输出节点_算法工程化系列——模型固化
- EXEC和sp_executesql的区别
- 中小企业IT建设的小看法2
- 设计开发前的产品原型图
- php 读取js文件,JS中如何读取文件
- 扑克牌发牌游戏python_Python随机扑克牌生成器游戏
- 小白网安学习日记(2) hacknet游戏(模拟黑客入侵的游戏)
- 笔记本电脑怎么做服务器的显示屏,干货!笔记本液晶屏不要扔,自己动手DIY便携显示器...
- 计算并返回 x 的平方根,其中 x 是非负整数。
- 解决无线路由器wds桥接频繁掉线的办法
热门文章
- 清华操作系统课程(向勇、陈渝)笔记——第十二章(一)(基本概念:文件系统和文件,文件描述符,目录,文件别名,文件系统种类)
- 2年了,我逃离北上广,后悔了么?
- ath9k usb wifi 网卡驱动浅析
- 大数据的核心价值是什么?
- IAR For ARM 7.8下载地址
- 【源码分析】Spring Boot中Relaxed Binding机制的不同实现
- 网上车市通过聆讯:营收单一,上半年减员15%,徐翀持股80%
- 10x 程序员工作法 - 总复习 | 重新审视“最佳实践”
- c 语言 随机值的生成器,C 语言随机数生成器的实现分析
- 中国创新“先锋”企业系列报道