java点到直线的投影点到经纬度_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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值