Java通过经纬度坐标获取两个点之间的直线距离的示例
前言
现在很多App都需要附带着附近人列表功能,所以我在这里实现2个点之间的距离计算
经纬度的获取需要第三方来支持,高德地图、百度地图....
附近人功能具体的实现逻辑:
1.获取每个人的经纬度坐标,存库记录
2.通过SQL获取指定距离范围内的用户列表(文章的“二、MySQL中通过经纬度,获取范围内的用户”)
3.通过获取到的用户列表,计算自己与用户之间度距离(文章的“一、JAVA代码实现计算AB两点的直线距离”)
一、JAVA代码实现计算AB两点的直线距离
我的代码逻辑中,判断了小于1千米、小于100米、大于1千米的返参
但在这文章里没有体现,有需要的可以自己按需修改
importjava.math.BigDecimal;
importjava.util.HashMap;
importjava.util.Map;
publicclassDistanceUtil{
//椭球的长半轴
privatestaticdoubleEARTH_RADIUS=6378.137;
/**
*计算弧度
*/
privatestaticdoublerad(doubled){
returnd*Math.PI/180.0;
}
/**
*通过经纬度计算AB两点间的距离
*A点经度:longitude1、A点纬度:latitude1、
*B点经度:longitude2、B点纬度:latitude2
*/
publicstaticMapgetDistance(doublelongitude1,doublelatitude1,doublelongitude2,doublelatitude2){
doubleradLat1=rad(latitude1);
doubleradLat2=rad(latitude2);
doublea=radLat1-radLat2;
doubleb=rad(longitude1)-rad(longitude2);
doubledistance=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;
Mapmap=newHashMap();
BigDecimaldecimal=newBigDecimal(distance);
//结果保留2位小数
distance=decimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
map.put("units","km");
map.put("distance",distance);
returnmap;//{distance=700.0,units=km}
}
publicstaticvoidmain(String[]args){
//A点117.03472736.665777B点117.04100636.665871
Mapm=DistanceUtil.getDistance(36.665777,117.034727,36.665871,117.041006);
System.out.println(m);//AB直线700米左右
}
}
二、MySQL中通过经纬度,获取范围内的用户
SETNAMESutf8mb4; SETFOREIGN_KEY_CHECKS=0; ------------------------------ --Tablestructureforlt_coordinates ------------------------------ DROPTABLEIFEXISTS`user_coordinates`; CREATETABLE`user_coordinates`( `id`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciNOTNULL, `user_id`varchar(32)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'用户id', `longitude`double(11,8)DEFAULTNULLCOMMENT'经度', `latitude`double(11,8)DEFAULTNULLCOMMENT'纬度', PRIMARYKEY(`id`)USINGBTREE )ENGINE=InnoDBCHARACTERSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='用户经纬度坐标'ROW_FORMAT=Dynamic; ------------------------------ --Recordsoflt_coordinates ------------------------------
INSERTINTO`user_coordinates`VALUES('1','1001',117.12345678,36.12345678);
SETFOREIGN_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))))ASdistance
FROM
user_coordinates
HAVING
distance<='范围大小(千米)'
ORDERBY
distance
ASC
到此这篇关于Java通过经纬度坐标获取两个点之间的直线距离的示例的文章就介绍到这了,更多相关Java经纬度坐标距离内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!