Java根据位置获取经纬度计算距离

article/2025/8/27 16:51:54

高德地图获取经纬度

高德官方地址

/*** @author 周坤* @date Create in 10:51 2022/4/18* 高德地理位置信息* 地理/逆地理编码 :https://lbs.amap.com/api/webservice/guide/api/georegeo* 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。* 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。*/
@Slf4j
public class GeoLocation {// 高德秘钥private static final String APP_CODE_GAODE = "44aa4b2a7772504960b691cfb9802";/*** 地理编码* 根据地址获取经纬度,调用量上限:300000** @param address     填写结构化地址信息:省份+城市+区县+城镇+乡村+街道+门牌号码 例[北京市朝阳区阜通东大街6号]* @param city 市,可选  例如[北京]* @return java.lang.String*/public static String GetLocationByAddress(String address, String city) {log.info("地理编码:address=" + address + ",currentCity=" + city);try {HashMap<String, Object> parameters = new HashMap<>(3);parameters.put("address", address);parameters.put("city", city);parameters.put("key", APP_CODE_GAODE);// 高德获取地理信息String response = HttpUtil.get("https://restapi.amap.com/v3/geocode/geo", parameters);JSONObject responseJson = JSONUtil.parseObj(response);String status = responseJson.get("status").toString();if (!"1".equals(status)) {log.error("列表信息获取失败,关键字:" + address + "城市:" + city);return null;}JSONArray geocodes = responseJson.getJSONArray("geocodes");return JSONUtil.parseObj(geocodes.get(0)).get("location").toString();} catch (Exception ex) {log.error("调用接口失败!" + ex.getMessage());return null;}}/*** 逆地理编码* 根据经纬度获取地址,调用量上限:300000** @param location 经纬度:经度在前,纬度在后,经纬度间以“,”分割* @return java.lang.String*/public static String GetAddressByLocation(String location) {log.info("逆地理编码:location=" + location);try {HashMap<String, Object> parameters = new HashMap(16);parameters.put("location", location);parameters.put("key", APP_CODE_GAODE);// 高德获取地理信息String response = HttpUtil.get("https://restapi.amap.com/v3/geocode/regeo", parameters);JSONObject responseJson = JSONUtil.parseObj(response);String status = responseJson.get("status").toString();if (!"1".equals(status)) {log.error("列表信息获取失败,经纬度:" + location);return null;}JSONObject regeocode = responseJson.getJSONObject("regeocode");return regeocode.get("formatted_address").toString();} catch (Exception ex) {log.error("调用接口失败!" + ex.getMessage());return null;}}}

根据经纬度进行距离测算

/*** @author 周坤* @date Create in 11:44 2022/4/18*/
@Slf4j
public class DistanceUtils {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = 6378.137;/*** 基于余弦定理求两经纬度距离* Math.pow(x,y)      //这个函数是求x的y次方* Math.toRadians     //将一个角度测量的角度转换成以弧度表示的近似角度* Math.sin           //正弦函数* Math.cos           //余弦函数* Math.sqrt          //求平方根函数* Math.asin          //反正弦函数*/public static double getDistanceStr(String lng1, String lat1, String lng2, String lat2) {return getDistance(new Double(lng1), new Double(lat1), new Double(lng2), new Double(lat2));}/*** 根据经纬度计算两点间的距离* 基于余弦定理求两经纬度距离** @param longitude1 第一个点的经度* @param latitude1  第一个点的纬度* @param longitude2 第二个点的经度* @param latitude2  第二个点的纬度* @return 返回距离 单位千米*/public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {log.info("经纬度距离:longitude1=" + longitude1 + ",latitude1=" + latitude1 + ",longitude2=" + longitude2 + ",latitude2=" + latitude2);// 纬度double lat1 = Math.toRadians(latitude1);double lat2 = Math.toRadians(latitude2);// 经度double lng1 = Math.toRadians(longitude1);double lng2 = Math.toRadians(longitude2);// 纬度之差double a = lat1 - lat2;// 经度之差double b = lng1 - lng2;// 计算两点距离的公式double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 弧长乘地球半径, 返回单位: 千米s = s * EARTH_RADIUS;return s;}/*** 根据经纬度,计算两点间的距离* 由于三角函数中特定的关联关系,Haversine公式的最终实现方式可以有多种,比如借助转角度的函数atan2:** @param longitude1 第一个点的经度* @param latitude1  第一个点的纬度* @param longitude2 第二个点的经度* @param latitude2  第二个点的纬度* @return double*/public static double getDistance2(double longitude1, double latitude1,double longitude2, double latitude2) {double latDistance = Math.toRadians(longitude1 - longitude2);double lngDistance = Math.toRadians(latitude1 - latitude2);double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)+ Math.cos(Math.toRadians(longitude1)) * Math.cos(Math.toRadians(longitude2))* Math.sin(lngDistance / 2) * Math.sin(lngDistance / 2);double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));return c * EARTH_RADIUS;}
}

工具类

/*** @author 周坤* @date Create in 11:45 2022/4/18*/
@Slf4j
public class GeoDistance {/*** 根据位置计算距离** @param origin      出发点,市区与详细地址中间用逗号拼接,例如:南京市,仙林中心* @param destination 目的地,与出发点相同* @return double*/public static double getDistance(String origin, String destination) {if (StringUtils.isEmpty(origin) || StringUtils.isEmpty(destination)) {log.info("出发点或者目的地为空!");return 0;}String[] originList = origin.split(",");String[] destinationList = destination.split(",");// 获取经纬度String originLocation = GeoLocation.GetLocationByAddress(originList[1], originList[0]);String destinationLocation = GeoLocation.GetLocationByAddress(destinationList[1], destinationList[0]);// 根据经纬度计算距离double distance = DistanceUtils.getDistanceStr(originLocation.split(",")[0], originLocation.split(",")[1], destinationLocation.split(",")[0], destinationLocation.split(",")[1]);BigDecimal bg = BigDecimal.valueOf(distance);double f1 = bg.setScale(2, RoundingMode.HALF_UP).doubleValue();log.info("两地距离: " +  f1 + "KM");return distance;}}

测试

    @Testpublic void test1() {String s = GeoLocation.GetLocationByAddress("陕西省西安市雁塔区", "西安");String s1 = GeoLocation.GetLocationByAddress("广东省深圳市光明区", "深圳");assert s != null;String[] split = s.split(",");assert s1 != null;String[] split1 = s1.split(",");Console.log(s);Console.log(s1);double distance = GeoDistance.getDistance("西安,陕西省西安市雁塔区东八里村新村一巷", "深圳,广东省深圳市光明区");Console.log(distance);}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/des4gKhT.shtml

相关文章

根据两个经纬度点计算距离

根据两个经纬度点计算距离 假设要算的距离为A、B两点之间的距离&#xff0c;A、B两点的经线相交于南北极&#xff0c;纬线平行&#xff0c;找出C点和B点同一条纬线和A点同一条经线&#xff0c;同理找出D点。这时如果想要知道A和B距离只要知道角AOB的角度再根据求弧长的公式即可…

根据经纬度坐标计算实际距离

double hypot( double x, double y) ... { return sqrt(x * x y * y);} double distance( double wd1, double jd1, double wd2, double jd2) ... {// 根据经纬度坐标计算实际距离 double x, y, out; double PI 3.1415926535898; double R 6.3712…

计算经纬度之间的距离

给你两个经纬度&#xff0c;计算他们之间的距离 这些经纬线是怎样定出来的呢&#xff1f;地球是在不停地绕地轴旋转&#xff08;地轴是一根通过地球南北两极和地球中心的 假想线&#xff09;&#xff0c;在地球中腰画一个与地轴垂直的大圆圈&#xff0c;使圈上的每一点都和南北…

通过经纬度坐标计算距离的方法(实为通过一个经纬度和距离角度求另一个经纬度)

转自&#xff1a;https://www.cnblogs.com/softfair/p/lat_lon_distance_bearing_new_lat_lon.html 通过经纬度坐标计算距离的方法&#xff08;经纬度距离计算&#xff09; 通过经纬度坐标计算距离的方法&#xff08;经纬度距离计算&#xff09; 最近在网上搜索“通过经纬度…

经纬度计算距离

通过经纬度坐标计算距离的方法&#xff08;经纬度距离计算&#xff09; 最近在网上搜索“通过经纬度坐标计算距离的方法”&#xff0c;发现网上大部分都是如下的代码&#xff1a; #define PI 3.14159265 static double Rc 6378137; // 赤道半径 static double Rj 6356725; …

Mysql 根据经纬度计算距离

方式1&#xff1a;st_distance_sphere st_distance_sphere函数返回以米为单位 SELECT*,st_distance_sphere (point ( longitudes, latitudes ),point ( 113.264435, 23.129163 )) AS juli FROMzxh_distance ORDER BYjuli ASC;方式2&#xff1a;st_distance st_distance返回的…

计算经纬度点之间的距离

球面上任意两点之间的距离计算公式可以参考维基百科上的下述文章。 Great-circle distance Haversine formula 值得一提的是&#xff0c;维基百科推荐使用Haversine公式&#xff0c;理由是Great-circle distance公式用到了大量余弦函数&#xff0c; 而两点间距离很短时&#x…

计算两个经纬度的距离

一 点睛 计算两个经纬度的距离的方法这里提供两种。 1 基于 googleMap 中的算法得到两经纬度之间的距离&#xff0c;计算精度与谷歌地图的距离精度差不多。 2 计算中心经纬度与目标经纬度的距离(米) 二 代码 public class LongitudeLatitude {/*** 默认地球半径*/private …

根据两点经纬度计算距离

根据两点经纬度计算距离 这些经纬线是怎样定出来的呢&#xff1f;地球是在不停地绕地轴旋转&#xff08;地轴是一根通过地球南北两极和地球中心的 假想线&#xff09;&#xff0c;在地球中腰画一个与地轴垂直的大圆圈&#xff0c;使圈上的每一点都和南北两极的距离相等&#xf…

通过经纬度坐标计算距离的方法(经纬度距离计算)

通过经纬度坐标计算距离的方法&#xff08;经纬度距离计算&#xff09; 最近在网上搜索“通过经纬度坐标计算距离的方法”&#xff0c;发现网上大部分都是如下的代码&#xff1a; #define PI 3.14159265 static double Rc 6378137; // 赤道半径 static double Rj 635672…

根据经纬度计算两点之间的距离

前言 在我们平时使用美团&#xff0c;饿了么等app进行订餐&#xff0c;或者使用猫眼进行订电影票的时候&#xff0c;都有一个距离的排序&#xff0c;表明该家店距离我们当前的位置&#xff0c;这种基于地理位置的服务&#xff0c;统一被称为LBS&#xff08;Location Based Ser…

logistic模型原理与推导过程分析(1)

从线性分类器谈起 给定一些数据集合&#xff0c;他们分别属于两个不同的类别。例如对于广告数据来说&#xff0c;是典型的二分类问题&#xff0c;一般将被点击的数据称为正样本&#xff0c;没被点击的数据称为负样本。现在我们要找到一个线性分类器&#xff0c;将这些数据分为两…

阻滞增长模型--Logistic模型

文章目录 写在前面一、思路二、原始数据三、源代码四、结果 写在前面 做了一个作业&#xff0c;觉得挺有意思&#xff0c;有空就发上来了。 阻滞增长模型–Logistic模型的部分推导、思路&#xff0c;并给出参考代码。 参考书籍&#xff1a;《数学模型》第四版&#xff0c;姜启…

logistic模型原理与推导过程分析(2)

二项逻辑回归模型 既然logistic回归把结果压缩到连续的区间(0,1)&#xff0c;而不是离散的0或者1&#xff0c;然后我们可以取定一个阈值&#xff0c;通常以0.5为阈值&#xff0c;如果计算出来的概率大于0.5&#xff0c;则将结果归为一类&#xff08;1&#xff09;&#xff0c;…

从logit变换到logistic模型

从logit变换到logistic模型 logit变换几率logistic模型 前面我们知道对数函数和对数函数的一些基本性质&#xff0c;也许你会问&#xff0c;为什么要引入对数函数&#xff1f;而且还是一个基本初等函数&#xff1f;这就要从logit变换说起。 logit变换 我们在研究某一结果&…

Gompertz模型绘图 matlab,Logistic模型matlab求解

Logistic模型求解怎么用matlab求解啊&#xff1f; 悬赏分&#xff1a;100 - 解决时间&#xff1a;2008-11-17 23:09 已知 x0:1:12 y[43.65 109.86 187.21 312.67 496.58 707.65 960.25 1238.75 1560.00 1824.29 2199.00 2438.89 2737.71] yL/(1a*exp(-k*x)) 利用线性回归模型所…

数学建模-Logistic模型

文章目录 Malthus模型模型假设建模与求解模型评价 Logistic模型模型假设建模与求解模型检验 为了更好地理解Logistic模型&#xff0c;我们先看看Malthus模型 Malthus模型 这是英国神父Malthus通过对一百多年人口统计资料的分析之后提出的人口模型假设 模型假设 设x(t)表示t时…

数学建模-Logistic模型附Matlab代码

目录 一、Logistic模型介绍 二、Logistic模型实例 三、Logistic模型原理 3.1 Logistic 方程定义 3.2 Yule算法 3.2 Rhodes算法 3.3 Nair算法 4、Logistic模型Matlab部分代码 4.1 Yule算法 4.2 Rhodes算法 4.3 Nair算法 一、Logistic模型介绍 logistic回归又称logi…

logistic回归模型—基于R

logistic回归模型—基于R 数据理解和准备一. 对缺失值的处理二.虚拟变量的赋值三.箱线图四.相关性分析 训练集与测试集的划分模型构建与评价一.logistic回归模型二.检查模型在训练数据集和测试数据集上的表现使用交叉验证的logistic回归 logistic回归又称logistic回归分析&…

数学模型——Logistic回归模型(含Matlab代码)

写在前面 Logistic回归模型是一种非常常见的统计回归模型&#xff0c;在处理大量数据&#xff0c;揭示各自变量如何作用于因变量&#xff08;描述X与Y之间的关系&#xff09;时有着十分重要的作用。笔者在写Logit回归模型前参加了一次市场调研比赛&#xff0c;在这次比赛中学到…