当前位置: 首页 > 图灵资讯 > 技术篇> java 经纬度处理、计算两地的距离、获取当前一定距离以内的经纬度值

java 经纬度处理、计算两地的距离、获取当前一定距离以内的经纬度值

来源:图灵教育
时间:2023-02-22 13:59:53

  现在地理坐标位置贴在网站上很流行,可以看到精度纬度。如果结合GPS,可以定位用户所在地的经纬度,自然可以计算出大概的距离。以下是一个小代码,根据经纬度坐标直接计算两地之间的距离。

  package com.fh.util;

  import java.util.HashMap;

  import java.util.Map;

  /**

  * 说明:经纬度处理

  * 作者:FH Admin

  * from:fhadmin.cn

  */

  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 lat1 用户经度

  * @param lng1 用户纬度

  * @param lat2 商家经度

  * @param lng2 商家纬度

  * @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 getAround(String latStr, String lngStr, String raidus) {

  Map map = new HashMap();

  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)

  }

  }