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版权协议,转载请附上原文出处链接和本声明。