JAVA中经纬度的计算

需求

项目中,有时候我们会有一些涉及到经纬度的计算,比如要让你计算两个坐标之间的距离,比如外卖的场景,要计算骑手和你之间的距离多少。java是可以实现的,数据库mysql也是可以实现的,下面就分别讲解两种方法是如何实现的。

辅助工具

这里给大家推荐几款辅助工具,你肯定用的上,比如拾取坐标轴坐标、经纬度查询定位 、在线经纬度距离计算 、经纬度坐标查询*各种转换工具

拾取坐标轴坐标:http://jingweidu.757dy.com/

经纬度查询定位 :https://api.map.baidu.com/lbsapi/getpoint/

在线经纬度距离计算:https://www.lddgo.net/convert/distance

经纬度坐标查询:https://www.toolnb.com/tools/gps.html

代码实现

package com.example.demo;

import java.util.HashMap;
import java.util.Map;

/**
 * 说明:经纬度处理
 * 公众号:干货食堂
 */

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 lat1Str 用户经度
     * @param lng1Str 用户纬度
     * @param lat2Str 商家经度
     * @param lng2Str 商家纬度
     * @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<Object,Object> getAround(String latStr, String lngStr, String raidus) {
  Map<Object,Object> map = new HashMap<Object,Object>();

  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)

 }

}

mysql实现

create table tb_self_pickup_point
(
    id          bigint auto_increment comment 'ID'
        primary key,
    name        varchar(50)     null comment '名字',
    lng         decimal(1810null comment '经度',
    lat         decimal(1810null comment '纬度'
)
    comment '自提点表' engine = InnoDB;


INSERT INTO tb_self_pickup_point (idname, lng, lat) VALUES (1'阿里巴巴',  120.032698000030.2852960000);
INSERT INTO tb_self_pickup_point (idname, lng, lat) VALUES (2'西溪景苑',  120.039236000030.2534720000);
INSERT INTO tb_self_pickup_point (idname, lng, lat) VALUES (3'西溪北苑',  120.042085000030.2930710000);


原文始发于微信公众号(干货食堂):JAVA中经纬度的计算

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/258470.html

(0)
葫芦侠五楼的头像葫芦侠五楼

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!