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

网友投稿 592 2022-11-29


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 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 map = new HashMap();

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 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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:maven将项目打包上传到nexus私服的详细教程
下一篇:MFC列表控件CListCtrl使用方法示范
相关文章

 发表评论

暂时没有评论,来抢沙发吧~