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<String, Object> 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<String, Object> map = new HashMap<String, Object>();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.665871Map<String, Object> 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',`x_longitude` double(11, 8) DEFAULT NULL COMMENT '经度',`y_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;
传入中心点的,经纬度
SELECTid, user_id,ROUND(6378.138*2*ASIN(SQRT(POW(SIN(('纬度'*PI()/180-y_latitude*PI()/180)/2),2)+COS('纬度'*PI()/180)*COS(y_latitude*PI()/180)*POW(SIN(('经度'*PI()/180-x_longitude*PI()/180)/2),2)))) AS distance
FROMuser_coordinates
HAVINGdistance <= '范围大小(千米)'
ORDER BYdistance
ASC
Java中如何通过经纬度坐标获取两个点之间的直线距离相关推荐
- Java 百度地图 根据经纬度(坐标) 获取乡镇
申请百度开放平台KEY(ak) 没申请,随便找了一个 参数说明: extensions_town:行政区划返回乡镇级数据(town),仅国内召回乡镇数据 coordtype:坐标的类型 bd09ll( ...
- Python爬取两个城市之间的直线距离
因需要爬取江浙沪皖地级市之间的城市距离,爬取的网址是http://www.china6636.com/.爬取代码如下: ###江浙沪皖41城市代号 x=[27005208,27017237,27029 ...
- java获取两个时间之间的所有日期、月份、年份,返回列表
需求描述 输入开始时间和结束时间,获取时间范围内的所有日期,月份.年份 (输入可以为"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd&quo ...
- Google Earth Engine——从Python中的经纬度坐标获取Modis正弦图块网格位置
许多 MODIS 数据产品都组织在基于正弦投影的瓦片网格中.您可以在这里找到一个在线计算器,它将从图块转换为纬度和经度坐标.本教程将演示如何在 Python 中执行此转换. 目标 读入 MODIS 瓦 ...
- java curl get_如何从Java中的curl get请求获取文件?
我正在尝试使用API下载一些XBRL文件.为了做到这一点,我需要做一个卷曲的请求,就像这样:如何从Java中的curl get请求获取文件? curl -XGET http://distribut ...
- java中遍历实体类,获取属性名和属性值
方式一(实体类): //java中遍历实体类,获取属性名和属性值public static void testReflect(Object model) throws Exception{for (F ...
- Java - 计算两个经纬度之间的直线距离
Java - 计算两个经纬度之间的直线距离 代码Github地址 https://github.com/FrankZuozuo/JavaSpecial 1.点接口 public interface P ...
- Java中double类型输出小数点后两位
Java中double类型输出小数点后两位 思路 就是在输出的时候使用字符串格式即可. double testNum=1.123456789;System.out.println(String.for ...
- 根据经纬度坐标获取海拔
根据经纬度坐标获取海拔!!! 作为一个生态er,经纬度.海拔,水陆条件是生态学家们经常关注的重要环境变量,今天发现了一个宝藏R包,可以通过经纬度获取海拔(高程),给大家分享一下!!! #加载这个R包 ...
最新文章
- Silverlight 游戏开发小技巧:角色升级特效
- php发卡_发卡网代码审计
- 查看SSID的mac地址
- Delphi2010组件/控件安装方法
- python 对输入的单词进行字典排序_Python-对字典进行排序
- rest风格使用两个变量_为什么要用Rest风格,接口应该怎么定义,除了Rest还可用什么方式写接口的?...
- mac mysql的初始密码_MAC版修改MySQL初始密码的方法
- java中如何引用非静态变量_java为什么不能从静态环境引用非静态变量?
- php中表格怎么垂直居中,如何利用display:table-cell实现垂直居中?
- 推荐一本书(Secure Coding Standard for Java)
- 在matlab中如何求偏导数,求解 PDE 并计算偏导数
- 整理一个将qq音乐的歌单导入到苹果音乐中的方法
- 【信奥赛一本通】 1413:确定进制(详细代码)
- 计算机网络——互联网上的音/视频服务
- Vmware虚拟机如何与主机共享文件夹
- grant User 使用
- GeoHash算法与用法
- Amazon CloudFront CDN + s3 源站跨域配置
- 生活琐事随感 (r5笔记第43天)
- 爬虫学习:基础爬虫案例实战