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

前言

现在很多App都需要附带着附近人列表功能,所以我在这里实现2个点之间的距离计算

经纬度的获取需要第三方来支持,高德地图、百度地图....

附近人功能具体的实现逻辑:

1.获取每个人的经纬度坐标,存库记录

2.通过SQL获取指定距离范围内的用户列表(文章的 “二、MySQL中通过经纬度,获取范围内的用户”)

3.通过获取到的用户列表,计算自己与用户之间度距离(文章的 “一、JAVA代码实现计算AB两点的直线距离”)

一、JAVA代码实现计算AB两点的直线距离

我的代码逻辑中,判断了小于1千米、小于100米、大于1千米的返参

但在这文章里没有体现,有需要的可以自己按需修改

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class DistanceUtil {

  // 椭球的长半轴
  private static double EARTH_RADIUS = 6378.137;

  /**
   * 计算弧度
   */
  private static double rad(double d) {
    return d * Math.PI / 180.0;
  }

  /**
   * 通过经纬度计算AB两点间的距离
   * A点经度:longitude1、A点纬度:latitude1、
   * B点经度:longitude2、 B点纬度:latitude2
   */
  public static Map<String, Object> getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
    double radLat1 = rad(latitude1);
    double radLat2 = rad(latitude2);
    double a = radLat1 - radLat2;
    double b = rad(longitude1) - rad(longitude2);
    double 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)));
    distance = distance * EARTH_RADIUS;
    Map<String, Object> map = new HashMap<String, Object>();
    BigDecimal decimal = new BigDecimal(distance);
    //结果保留2位小数
    distance = decimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    map.put("units", "km");
    map.put("distance", distance);
    return map; // {distance=700.0, units=km}
  }

  public static void main(String[] args) {
   // A点 117.034727 36.665777 B点 117.041006 36.665871
    Map<String, Object> m = DistanceUtil.getDistance(36.665777, 117.034727, 36.665871, 117.041006);
    System.out.println(m);//AB直线700米左右
  }
}

二、MySQL中通过经纬度,获取范围内的用户

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for lt_coordinates
-- ----------------------------
DROP TABLE IF EXISTS `user_coordinates`;
CREATE TABLE `user_coordinates` (
 `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
 `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户id',
 `longitude` double(11, 8) DEFAULT NULL COMMENT '经度',
 `latitude` double(11, 8) DEFAULT NULL COMMENT '纬度',
 PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户经纬度坐标' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of lt_coordinates
-- ----------------------------
INSERT INTO `user_coordinates` VALUES ('1', '1001', 117.12345678, 36.12345678);
SET FOREIGN_KEY_CHECKS = 1;
SELECT
  id,
  user_id,
  ROUND(6378.138*2*ASIN(SQRT(POW(SIN((纬度*PI()/180-latitude*PI()/180)/2),2)+COS(纬度*PI()/180)*COS(latitude*PI()/180)*POW(SIN((经度*PI()/180-longitude*PI()/180)/2),2)))) AS distance
FROM
  user_coordinates
HAVING
  distance <= '范围大小(千米)'
ORDER BY
  distance
ASC

到此这篇关于Java通过经纬度坐标获取两个点之间的直线距离的示例的文章就介绍到这了,更多相关Java 经纬度坐标距离内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java编程获取经纬度之间距离的方法

    本文实例讲述了Java编程获取经纬度之间距离的方法.分享给大家供大家参考,具体如下: public class GeoUtil { /** * 根据经纬度和距离返回一个矩形范围 * * @param lng * 经度 * @param lat * 纬度 * @param distance * 距离(单位为米) * @return [lng1,lat1, lng2,lat2] 矩形的左下角(lng1,lat1)和右上角(lng2,lat2) */ public static double[] ge

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

    前言 现在很多App都需要附带着附近人列表功能,所以我在这里实现2个点之间的距离计算 经纬度的获取需要第三方来支持,高德地图.百度地图.... 附近人功能具体的实现逻辑: 1.获取每个人的经纬度坐标,存库记录 2.通过SQL获取指定距离范围内的用户列表(文章的 "二.MySQL中通过经纬度,获取范围内的用户") 3.通过获取到的用户列表,计算自己与用户之间度距离(文章的 "一.JAVA代码实现计算AB两点的直线距离") 一.JAVA代码实现计算AB两点的直线距离 我

  • js实现获取两个日期之间所有日期的方法

    本文实例讲述了js实现获取两个日期之间所有日期的方法.分享给大家供大家参考,具体如下: <script> function getDate(datestr){ var temp = datestr.split("-"); var date = new Date(temp[0],temp[1],temp[2]); return date; } var start = "2012-3-25"; var end = "2012-4-3";

  • python3获取两个日期之间所有日期,以及比较大小的实例

    如下所示: import datetime #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date): date_list = [] begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d") end_date = datetime.datetime.strptime(end_date,"%Y-%m-%d") while begin_date <=

  • Java趣味练习题之输出两个日期之间的相隔天数

    目录 导语 一.需求及思路 二.代码实现 结语 源码部分 utility工具类 Time测试类 导语 朋友们大家好,今天给大家带来一个经典题目,求两个日期之间的相隔天数. 一.需求及思路 首先,题目要求是将两个日期进行比较,求出相差的天数,那么我们首先应该联想到Date日期类,用日期类的getTime 方法去取出两个日期的毫秒值.再用这个毫秒值相减,得到一个毫秒差值,再用它除以1000*60*60*24,这个表达式就是将毫秒值转换了我们熟悉的天. 二.代码实现 首先我们做这道题应该导包,Date

  • ASP.NET如何获取两个日期之间的天数

    复制代码 代码如下: DateTime startdate=DateTime.Parse("2013-11-01"); DateTime enddate = DateTime.Parse("2013-11-11"); int d = enddate.Subtract(startdate).Days; 定义开始时间startdate 结束时间enddate 使用方法Subtract得到两个时间差

  • ASP.NET使用Subtract方法获取两个日期之间的天数

    DateTime startdate=DateTime.Parse("2013-11-01"); DateTime enddate = DateTime.Parse("2013-11-11"); int d = enddate.Subtract(startdate).Days; 定义开始时间startdate 结束时间enddate 使用方法Subtract得到两个时间差

  • 利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同:阴(农)历,每个月固定28天 每周的第一天 - 阳(公)历星期日是第一天:阴(农)历,星期一是第一天 实际上,在历史上有着许多种纪元的方法.它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期.所以为了计时

  • Vue如何获取两个时间点之间的所有间隔时间

    目录 获取两个时间点之间的所有间隔时间 获取两个时间之间的 间隔时间 获取两个日期之间的间隔日期 获取指定两个月份之间的 间隔月份 获取两个时间点之间的所有间隔时间 说明 使用的是vue@2.6.12和elementUI@2.14.1 使用的是TS,用来校验数据格式 所有返回的数据都是在时间前面自动补全了0 使用的主要方法是new Date().setFullYear()设置当前的时间,如果传入的时间是new Date().setFullYear(2020,12,32),该方法会自动将时间转化为

  • Java将GeoHash转化为对应的经纬度坐标实例代码

    本文实例介绍了JAVA实现将GeoHash转化为对应的经纬度坐标的详细代码,分享给大家供大家参考,具体内容如下 package com.lulei.geo; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import com.lulei.geo.bean.LocationBean; import com.lulei.util.JsonUti

  • js获取元素到文档区域document的(横向、纵向)坐标的两种方法

    获取页面中元素到文档区域document的横向.纵向坐标的两种方法及其比较 在js控制元素运动的过程中,对于页面元素坐标位置的获取是经常用到的,这里主要总结下两种方法: 一:通过叠加元素对象和它的offsetParent(如果存在)的offsetLeft/offsetTop属性来实现 在阅读javascript高级程序设计第三版DOM部分时,了解到要获取某个元素在页面上的偏移量,需要将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,一直循环直至根元素

随机推荐