需求
在项目中,有时候我们会有一些涉及到经纬度的计算,比如要让你计算两个坐标之间的距离,比如外卖的场景,要计算骑手和你之间的距离多少。java是可以实现的,数据库mysql也是可以实现的,下面就分别讲解两种方法是如何实现的。
辅助工具
这里给大家推荐几款辅助工具,你肯定用的上,比如拾取坐标轴坐标、经纬度查询定位 、在线经纬度距离计算 、经纬度坐标查询*各种转换工具
拾取坐标轴坐标:http://jingweidu.757dy.com/
经纬度查询定位 :https://api.map.baidu.com/lbsapi/getpoint/
在线经纬度距离计算:https://www.lddgo.net/convert/distance
经纬度坐标查询:https://www.toolnb.com/tools/gps.html
代码实现
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
/**
* 说明:经纬度处理
* 公众号:干货食堂
*/
public class MapDistance {
private static double EARTH_RADIUS = 6378.137;
private static double rad(double d) {
return d * Math.PI / 180.0;
}
/**
* 根据两个位置的经纬度,来计算两地的距离(单位为KM)
* 参数为String类型
* @param lat1Str 用户经度
* @param lng1Str 用户纬度
* @param lat2Str 商家经度
* @param lng2Str 商家纬度
* @return
*/
public static String getDistance(String lat1Str, String lng1Str, String lat2Str, String lng2Str) {
Double lat1 = Double.parseDouble(lat1Str);
Double lng1 = Double.parseDouble(lng1Str);
Double lat2 = Double.parseDouble(lat2Str);
Double lng2 = Double.parseDouble(lng2Str);
double patm = 2;
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double difference = radLat1 - radLat2;
double mdifference = rad(lng1) - rad(lng2);
double distance = patm * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / patm), patm)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(mdifference / patm), patm)));
distance = distance * EARTH_RADIUS;
String distanceStr = String.valueOf(distance);
return distanceStr;
}
/**
* 获取当前用户一定距离以内的经纬度值
* 单位米 return minLat
* 最小经度 minLng
* 最小纬度 maxLat
* 最大经度 maxLng
* 最大纬度 minLat
*/
public static Map<Object,Object> getAround(String latStr, String lngStr, String raidus) {
Map<Object,Object> map = new HashMap<Object,Object>();
Double latitude = Double.parseDouble(latStr);// 传值给经度
Double longitude = Double.parseDouble(lngStr);// 传值给纬度
Double degree = (24901 * 1609) / 360.0; // 获取每度
double raidusMile = Double.parseDouble(raidus);
Double mpdLng = Double.parseDouble((degree * Math.cos(latitude * (Math.PI / 180))+"").replace("-", ""));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng * raidusMile;
//获取最小经度
Double minLat = longitude - radiusLng;
// 获取最大经度
Double maxLat = longitude + radiusLng;
Double dpmLat = 1 / degree;
Double radiusLat = dpmLat * raidusMile;
// 获取最小纬度
Double minLng = latitude - radiusLat;
// 获取最大纬度
Double maxLng = latitude + radiusLat;
map.put("minLat", minLat+"");
map.put("maxLat", maxLat+"");
map.put("minLng", minLng+"");
map.put("maxLng", maxLng+"");
return map;
}
public static void main(String[] args) {
//济南国际会展中心经纬度:117.11811 36.68484
//趵突泉:117.00999000000002 36.66123
System.out.println(getDistance("116.97265","36.694514","116.597805","36.738024"));
System.out.println(getAround("117.11811", "36.68484", "13000"));
//117.01028712333508(Double), 117.22593287666493(Double),
//36.44829619896034(Double), 36.92138380103966(Double)
}
}
mysql实现
create table tb_self_pickup_point
(
id bigint auto_increment comment 'ID'
primary key,
name varchar(50) null comment '名字',
lng decimal(18, 10) null comment '经度',
lat decimal(18, 10) null comment '纬度'
)
comment '自提点表' engine = InnoDB;
INSERT INTO tb_self_pickup_point (id, name, lng, lat) VALUES (1, '阿里巴巴', 120.0326980000, 30.2852960000);
INSERT INTO tb_self_pickup_point (id, name, lng, lat) VALUES (2, '西溪景苑', 120.0392360000, 30.2534720000);
INSERT INTO tb_self_pickup_point (id, name, lng, lat) VALUES (3, '西溪北苑', 120.0420850000, 30.2930710000);
原文始发于微信公众号(干货食堂):JAVA中经纬度的计算
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/258470.html