前言

现在很多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中如何通过经纬度坐标获取两个点之间的直线距离相关推荐

  1. Java 百度地图 根据经纬度(坐标) 获取乡镇

    申请百度开放平台KEY(ak) 没申请,随便找了一个 参数说明: extensions_town:行政区划返回乡镇级数据(town),仅国内召回乡镇数据 coordtype:坐标的类型 bd09ll( ...

  2. Python爬取两个城市之间的直线距离

    因需要爬取江浙沪皖地级市之间的城市距离,爬取的网址是http://www.china6636.com/.爬取代码如下: ###江浙沪皖41城市代号 x=[27005208,27017237,27029 ...

  3. java获取两个时间之间的所有日期、月份、年份,返回列表

     需求描述 输入开始时间和结束时间,获取时间范围内的所有日期,月份.年份     (输入可以为"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd&quo ...

  4. Google Earth Engine——从Python中的经纬度坐标获取Modis正弦图块网格位置

    许多 MODIS 数据产品都组织在基于正弦投影的瓦片网格中.您可以在这里找到一个在线计算器,它将从图块转换为纬度和经度坐标.本教程将演示如何在 Python 中执行此转换. 目标 读入 MODIS 瓦 ...

  5. java curl get_如何从Java中的curl get请求获取文件?

    我正在尝试使用API​​下载一些XBRL文件.为了做到这一点,我需要做一个卷曲的请求,就像这样:如何从Java中的curl get请求获取文件? curl -XGET http://distribut ...

  6. java中遍历实体类,获取属性名和属性值

    方式一(实体类): //java中遍历实体类,获取属性名和属性值public static void testReflect(Object model) throws Exception{for (F ...

  7. Java - 计算两个经纬度之间的直线距离

    Java - 计算两个经纬度之间的直线距离 代码Github地址 https://github.com/FrankZuozuo/JavaSpecial 1.点接口 public interface P ...

  8. Java中double类型输出小数点后两位

    Java中double类型输出小数点后两位 思路 就是在输出的时候使用字符串格式即可. double testNum=1.123456789;System.out.println(String.for ...

  9. 根据经纬度坐标获取海拔

    根据经纬度坐标获取海拔!!! 作为一个生态er,经纬度.海拔,水陆条件是生态学家们经常关注的重要环境变量,今天发现了一个宝藏R包,可以通过经纬度获取海拔(高程),给大家分享一下!!! #加载这个R包 ...

最新文章

  1. Silverlight 游戏开发小技巧:角色升级特效
  2. php发卡_发卡网代码审计
  3. 查看SSID的mac地址
  4. Delphi2010组件/控件安装方法
  5. python 对输入的单词进行字典排序_Python-对字典进行排序
  6. rest风格使用两个变量_为什么要用Rest风格,接口应该怎么定义,除了Rest还可用什么方式写接口的?...
  7. mac mysql的初始密码_MAC版修改MySQL初始密码的方法
  8. java中如何引用非静态变量_java为什么不能从静态环境引用非静态变量?
  9. php中表格怎么垂直居中,如何利用display:table-cell实现垂直居中?
  10. 推荐一本书(Secure Coding Standard for Java)
  11. 在matlab中如何求偏导数,求解 PDE 并计算偏导数
  12. 整理一个将qq音乐的歌单导入到苹果音乐中的方法
  13. 【信奥赛一本通】 1413:确定进制(详细代码)
  14. 计算机网络——互联网上的音/视频服务
  15. Vmware虚拟机如何与主机共享文件夹
  16. grant User 使用
  17. GeoHash算法与用法
  18. Amazon CloudFront CDN + s3 源站跨域配置
  19. 生活琐事随感 (r5笔记第43天)
  20. 爬虫学习:基础爬虫案例实战

热门文章

  1. 5G网络中的缩略语与简写
  2. 密码学和计算机安全学科方向排名
  3. API接口开发其实特简单,Python Flask Web 框架教程来了
  4. 如何解决移动硬盘弹出时报错:设备正在使用中
  5. 基于Java实现的几何图形处理系统
  6. JAVA前端修改密码,Java Web版SVN 配置管理工具 2.0 (远道建立仓库,修改密码,设置权限,支持apache等)...
  7. Centos下安装桌面环境和Flash插件
  8. Java汉字输入练习
  9. 攻防世界writeup
  10. win7计算机电源设置在哪里设置,Win7系统如何设置电源选项