移动互联网浪潮,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计算两坐标的距离相关推荐

  1. php高德地图计算距离接口,高德地图计算两坐标之间距离

    最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了相关计算方法,供大家参 ...

  2. 高德地图计算两坐标之间距离

    转载自:http://blog.csdn.net/jianggujin/article/details/72833711 如要转载请写明原创地址 Java实现 Javascript实现 MySQL实现 ...

  3. Mysql之st_distance_sphere计算两坐标点距离

    最近项目中需要计算一个坐标点与多个点的距离,发现用Python来实现效率很低.经同事推荐,将这些坐标点存入了Mysql数据库,然后用数据库自带的方法st_distance_sphere计算距离.经过比 ...

  4. uniapp经纬度,并计算两坐标间距离

    点击方法是获取了经纬度,没算距离,但底下有方法,拷一下就ok <template><view class="content"><image class ...

  5. Java-高德地图根据经纬度计算两坐标之间的直线距离

    Java-高德地图根据经纬度计算两坐标之间的直线距离 最近在做毕设项目,项目打卡需要用到高德地图,看了下高德地图计算两坐标距离的方法,官网上提供的开发包中也有相关的方法. /**** @author ...

  6. CLLocation的distanceFromLocation方法计算地图上距离 (汇总)

    准备两个CLLocation的对象,比如要计算某个位置与使用者当前位置的距离, 则其 中一个CLLocation是userLocation = [locationManager location],l ...

  7. 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?

    我的理解是,直接求距离之和可能导致多个解存在的情况,而求距离平方和可以保证唯一解,参考: 当且仅当a=b时,不等式等号成立 参考文章:利用最小二乘法,用直线拟合5点时,为什么计算竖直距离而非垂直距离?

  8. mysql 计算gps坐标距离_mysql、sqlserver和php计算GPS经纬度坐标距离

    摘要:mysql.sqlserver.oracle和php计算GPS经纬度坐标距离 mysql计算GPS经纬度距离DELIMITER $$ CREATEDEFINER=`root`@`localhos ...

  9. 如何用python计算levenshteindistance_Levenshtein计算相似度距离

    使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...

  10. 多个点 最远距离 java_Java实现的计算最大下标距离算法示例

    本文实例讲述了Java实现的计算最大下标距离算法.分享给大家供大家参考,具体如下: 题目描述 给定一个整形数组,找出最大下标距离j−i, 当且A[i] < A[j] 和 i < j 解法 ...

最新文章

  1. 观察者模式的经典应用(猫叫 烧开水)
  2. html5 settimeout,计时器setTimeout()
  3. UTF8转换为GB编码gb2312转换为utf-8
  4. linux vsftp的配置
  5. RH124 章1 访问命令行 笔记
  6. android sdk启动不了,windows server 2008下android sdk不能正常启动
  7. 【视频】v-bind的使用
  8. 计算机设计学校,计算机设计制作大赛
  9. 与 OpenCV 1 同时使用
  10. WordPress后台删除不需要的侧边栏菜单
  11. tensorboard ckpt pb 模型的输出节点_算法工程化系列——模型固化
  12. EXEC和sp_executesql的区别
  13. 中小企业IT建设的小看法2
  14. 设计开发前的产品原型图
  15. php 读取js文件,JS中如何读取文件
  16. 扑克牌发牌游戏python_Python随机扑克牌生成器游戏
  17. 小白网安学习日记(2) hacknet游戏(模拟黑客入侵的游戏)
  18. 笔记本电脑怎么做服务器的显示屏,干货!笔记本液晶屏不要扔,自己动手DIY便携显示器...
  19. 计算并返回 x 的平方根,其中 x 是非负整数。
  20. 解决无线路由器wds桥接频繁掉线的办法

热门文章

  1. 清华操作系统课程(向勇、陈渝)笔记——第十二章(一)(基本概念:文件系统和文件,文件描述符,目录,文件别名,文件系统种类)
  2. 2年了,我逃离北上广,后悔了么?
  3. ath9k usb wifi 网卡驱动浅析
  4. 大数据的核心价值是什么?
  5. IAR For ARM 7.8下载地址
  6. 【源码分析】Spring Boot中Relaxed Binding机制的不同实现
  7. 网上车市通过聆讯:营收单一,上半年减员15%,徐翀持股80%
  8. 10x 程序员工作法 - 总复习 | 重新审视“最佳实践”
  9. c 语言 随机值的生成器,C 语言随机数生成器的实现分析
  10. 中国创新“先锋”企业系列报道