Java根据位置获取经纬度计算距离
1. 业务概述
平时我们在使用美团,饿了么,飞猪,携程,去哪儿等APP的时候,都会显示商家或者景点与我们当前位置的距离,这种基于地理位置的服务,统一被称为LBS(Location Based Service),而LBS的实现则是借助于GIS等信息技术实现。GIS(Geographic information system)地理信息系统。
本文要实现的是基于位置信息计算距离。
2. 原理分析
由出发点详细地址信息与目的地详细地址信息,通过高德地理信息API获取经纬度信息,通过经纬度信息计算得出大概位置距离。
由于地球是一个椭圆形,我们在计算的时候有点麻烦,所以我们更常用的方式是将地球作为一个球形来计算,而计算球面上任意两点之间的距离的公式通常有两种:Great-circle distance和Haversine formula,而目前大多数公司都是用的是Haversine公式,原因可以参考。
Great-circle distance公式用到了大量余弦函数, 而两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999…的结果, 会导致较大的舍入误差。而Haversine公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。
3. 实现验证
3.1 高德地理位置信息 GeoLocation
package com.zrj.weimob.util;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
/**
* 高德地理位置信息
* 地理/逆地理编码 :https://lbs.amap.com/api/webservice/guide/api/georegeo
* 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。
* 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。
*
* @author zrj
* @since 2021/8/12
**/
public class GeoLocation {
// 高德秘钥
private static final String APP_CODE_GAODE = "ce7addca48aa3c5a3b6a22ea299c4df7c05ccb";
/**
* 地理编码
* 根据地址获取经纬度,调用量上限:300000
*
* @param address 详细地址,必填
* @param currentCity 市,可选
* @return java.lang.String
*/
public static String GetLocationByAddress(String address, String currentCity) {
System.out.println("地理编码:address=" + address + ",currentCity=" + currentCity);
try {
HashMap parameters = new HashMap(16);
parameters.put("address", address);
parameters.put("city", currentCity);
parameters.put("key", APP_CODE_GAODE); // APP_CODE_GAODE 高德秘钥
// 高德获取地理信息
String response = HttpUtil.get("http://restapi.amap.com/v3/geocode/geo", parameters);
JSONObject responseJson = JSONObject.parseObject(response);
if (responseJson == null) {
System.err.println("列表信息获取失败,关键字:" + address + "城市:" + currentCity);
return null;
}
String status = responseJson.getString("status");
if (!"1".equals(status)) {
System.err.println("列表信息获取失败,关键字:" + address + "城市:" + currentCity);
return null;
}
JSONArray jsonArray = responseJson

本文介绍了如何利用Java实现基于高德地图API获取地理位置信息,并通过Haversine公式计算两点间的距离。首先,通过高德的地理编码和逆地理编码API获取地址的经纬度;然后,使用两种不同的方法(余弦定理和Haversine公式)计算经纬度对应的距离;最后,提供了一个根据位置计算距离的实用工具类。

2683

被折叠的 条评论
为什么被折叠?



