1.java 代码计算距离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.yd.mmjy.service.common.utils;

import lombok.extern.slf4j.Slf4j;

/**
* <p>
* 计算距离工具类
* 通过地图上的两个坐标计算距离
* </p>
*
* @Auther: Mr.xiang
* @Date: 2019/12/30 14:33
*/
@Slf4j
public class MapHelperUtils {

/**
* 地球半径
*/
private static double EarthRadius = 6378.137;

/**
* 经纬度转化成弧度
* @param d 经度/纬度
* @return
*/
private static double rad(double d) {
return d * Math.PI / 180.0;
}

/**
* 计算两个坐标点之间的距离
*
* @param firstLatitude 第一个坐标的纬度
* @param firstLongitude 第一个坐标的经度
* @param secondLatitude 第二个坐标的纬度
* @param secondLongitude 第二个坐标的经度
* @return 返回两点之间的距离,单位:米
*/
public static Integer getDistance(double firstLatitude, double firstLongitude,
double secondLatitude, double secondLongitude) {
double firstRadLat = rad(firstLatitude);
double firstRadLng = rad(firstLongitude);
double secondRadLat = rad(secondLatitude);
double secondRadLng = rad(secondLongitude);

double a = firstRadLat - secondRadLat;
double b = firstRadLng - secondRadLng;
double cal = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(firstRadLat)
* Math.cos(secondRadLat) * Math.pow(Math.sin(b / 2), 2))) * EarthRadius;
double result = Math.round(cal * 10000d) / 10000d;
return new Double(result*1000).intValue();
}

/**
* 计算两个坐标点之间的距离
* @param firstPoint 第一个坐标点的(纬度,经度) 例如:"31.2553210000,121.4620020000"
* @param secondPoint 第二个坐标点的(纬度,经度) 例如:"31.2005470000,121.3269970000"
* @return 返回两点之间的距离,单位:公里/千米
*/
public static double GetPointDistance(String firstPoint, String secondPoint) {
String[] firstArray = firstPoint.split(",");
String[] secondArray = secondPoint.split(",");
double firstLatitude = Double.valueOf(firstArray[0].trim());
double firstLongitude = Double.valueOf(firstArray[1].trim());
double secondLatitude = Double.valueOf(secondArray[0].trim());
double secondLongitude = Double.valueOf(secondArray[1].trim());
return getDistance(firstLatitude, firstLongitude, secondLatitude, secondLongitude);
}

// public static void main(String[] args) {
//
// /**
// * 第一种调用方法
// */
// int result = getDistance(31.255321, 121.462002, 31.200547, 121.326997);
// log.info("值:{}",result);
// /**
// * 第二种调用方法
// */
// double result = GetPointDistance("31.2553210000,121.4620020000", "31.2005470000,121.3269970000");
// System.out.println(result);
// double expected = 14.2243;
//
// }

}

2.数据库 sql 语句计算距离查询(mysql)

备注:下图中的这个语法(ew.customSqlSegment)是使用 mybatis plus 框架的使用语法,必须版本是在 3.0.7 以上的才支持(此处有坑)

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
*,
ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW( SIN( ( #{latitude} * PI( ) / 180 - latitude * PI( ) / 180 ) / 2 ), 2 )
+
COS( #{latitude} * PI( ) / 180 ) * COS( latitude * PI( ) / 180 ) *
POW( SIN(( #{longitude} * PI( ) / 180 - longitude * PI( ) / 180 ) / 2 ), 2 ) ) ) * 1000
) AS distance
FROM
b_user ${ew.customSqlSegment}