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

GPS距离计算和位置获取


需求:
1、知道地球上两点GPS经纬度坐标,根据两点坐标获取坐标位置。
2、使用高德地图,根据经纬度获取实时位置。

package com.bdms.utils;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * GPS操作工具
 */
public class GPSHelperUtils {

    /**
     * 地球赤道半径(单位m)
     */
    private static final double EARTH_RADIUS = 6371.393;

    /**
     * 高德地图请求地址和key
     */
    private static String aMapUrl = "https://restapi.amap.com/v3/geocode/regeo?s=rsv3&language=zh_cn";
    /**
    * 注册高德地图,去高德地图官网获取
    */
    private static String aMapKey = "xxxxxxxxxxxxx";

    /**
     * 坐标位置转换为弧度
     * @return
     */
    private static double rad(double data) {
        return Math.toRadians(data);
    }

    /**
     * 根据坐标获取两点距离
     * @param lon1
     * @param lat1
     * @param lon2
     * @param lat2
     * @return 返回距离单位m
     */
    public static double getDistance(double lon1,double lat1,double lon2,double lat2) {
        double distance = 0;
        try {
            double lon = rad(lon2) - rad(lon1);
            lon = lon > 0 ? lon : -lon;
            double radLat1 = rad(lat1);
            double radLat2 = rad(lat2);
            double lat = radLat2 - radLat1;
            lat = lat > 0 ? lat : -lat;
            //计算两个做坐标之间的距离
            //计算公式借鉴了其它博客,据说是从谷歌地图源码获取,自测计算结果准确
            distance = Math.asin(Math.sqrt(Math.pow(Math.sin(lat / 2), 2) +
                    Math.cos(radLat2) * Math.cos(radLat1) * Math.pow(Math.sin(lon / 2), 2)));
            distance = distance * EARTH_RADIUS * 1000;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return distance;
    }

   
    /**
     * 根据经纬度获取坐标位置
     * @param lon
     * @param lat
     * @return
     */
    public static String getAddress(double lon,double lat){
        try {
            getAMapUrl();
            StringBuilder resultData = new StringBuilder();
            StringBuilder https = new StringBuilder(aMapUrl);
            https.append("&key=" + aMapKey);
            //经纬度地址
            StringBuilder localhost = new StringBuilder("&location="+lon+","+lat);
            String url = https.append(localhost).toString();
            //拼接出来的地址
            URL myURL = null;
            URLConnection httpsConn = null;
            try {
                myURL = new URL(url);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            InputStreamReader insr = null;
            BufferedReader br = null;
            try {
                httpsConn = myURL.openConnection();// 不使用代理
                if (httpsConn != null) {
                    insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8");
                    br = new BufferedReader(insr);
                    String data = null;
                    while ((data = br.readLine()) != null) {
                        resultData.append(data);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (insr != null) {
                    insr.close();
                }
                if (br != null) {
                    br.close();
                }
            }
            /**
             * 成返回数格式
             * {"status":"1","info":"OK","infocode":"10000","regeocodes":[{"formatted_address":"湖北省武汉市xxxx",
             * "addressComponent":{"country":"中国","province":"湖北省","city":"武汉市","citycode":"027","district":"xxx","adcode":"420111","township":"xxx","towncode":"420111080000",
             * "neighborhood":{"name":[],"type":[]},"building":{"name":"xxx","type":"商务住宅;楼宇;商务写字楼"},
             * "streetNumber":{"street":"xxx","number":"4号","location":"114.432143,30.505003","direction":"东","distance":"5.09943"},
             * "businessAreas":[{"location":"114.409500,30.495205","name":"xxx","id":"420111"},{"location":"114.414914,30.495456","name":"光谷","id":"420111"}]}}]}
             */
            if (!StringUtils.isEmpty(resultData.toString())) {
                Map<String,Object> resultMap = JSONObject.parseObject(resultData.toString(),Map.class);
                if (resultMap.containsKey("status") && resultMap.get("status").toString().equals("1") && resultMap.containsKey("regeocode")) {
                    Map<String,Object> recordMap = JSONObject.parseObject(resultMap.get("regeocode").toString(),Map.class);
                    return recordMap.get("formatted_address").toString();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

自测没有问题,可以使用。


版权声明:本文为weixin_43686228原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。