package com.rxdatainfo.modules.data; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSONArray; public class LatLonUtil { private static double PI = 3.14159265; private static double EARTH_RADIUS = 6378137; private static double RAD = Math.PI / 180.0; /** * @Description: 获取四至信息(最大最小经纬度) * @author 董泽琦 * @param lat * @param lng * @date 2019年4月25日 下午5:50:54 */ public static double[] getFourBounds(String lng, String lat, String[] pointArr) throws Exception { if (pointArr.length>1) { return getPolygonAround(pointArr); } return getCircleAround(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(pointArr[0])); } /** * @Description: 获取多边形四至信息 * @author 董泽琦 * @date 2019年4月26日 下午4:27:26 */ public static double[] getPolygonAround(String[] pointArr) { // 获取中心点 double maxLat = 0.0; double maxLng = 0.0; double minLat = 1000.0; double minLng = 1000.0; for (String str : pointArr) { double lng = Double.parseDouble(str.split(",")[0]); double lat = Double.parseDouble(str.split(",")[1]); if (lat > maxLat) { maxLat = lat; } if (lng > maxLng) { maxLng = lng; } if (lat < minLat) { minLat = lat; } if (lng < minLng) { minLng = lng; } } return new double[] { minLat, minLng, maxLat, maxLng }; } /// <summary> /// 根据提供的经度和纬度、以及半径,取得此半径内的最大最小经纬度 /// </summary> /// <param name="lat">纬度</param> /// <param name="lon">经度</param> /// <param name="raidus">半径(米)</param> /// <returns></returns> public static double[] getCircleAround(double lon, double lat, double raidusMile) { Double latitude = lat; Double longitude = lon; Double degree = (24901 * 1609) / 360.0; Double dpmLat = 1 / degree; Double radiusLat = dpmLat * raidusMile; Double minLat = latitude - radiusLat; Double maxLat = latitude + radiusLat; Double mpdLng = degree * Math.cos(latitude * (PI / 180)); Double dpmLng = 1 / mpdLng; Double radiusLng = dpmLng * raidusMile; Double minLng = longitude - radiusLng; Double maxLng = longitude + radiusLng; return new double[] { minLat, minLng, maxLat, maxLng }; } /// <summary> /// 根据提供的两个经纬度计算距离(米) /// </summary> /// <param name="lng1">经度1</param> /// <param name="lat1">纬度1</param> /// <param name="lng2">经度2</param> /// <param name="lat2">纬度2</param> /// <returns></returns> public static double getDistance(double lng1, double lat1, double lng2, double lat2) { double radLat1 = lat1 * RAD; double radLat2 = lat2 * RAD; double a = radLat1 - radLat2; double b = (lng1 - lng2) * RAD; double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.round(s * 10000) / 10000; return s; } /** * 判断一个点是否在圆形区域内 */ public static boolean isInCircle(double lng1, double lat1, double lng2, double lat2, String radius) { double distance = getDistance(lat1, lng1, lat2, lng2); double r = Double.parseDouble(radius); if (distance > r) { return false; } else { return true; } } public static void main(String[] args) { System.out.println(JSONArray.toJSONString(getCircleAround(116.407863, 39.914087,480))); System.out.println(getDistance(116.407863, 39.914087, 116.413486,39.914336)); } }
来源:CSDN
作者:董泽琦
链接:https://blog.csdn.net/Dongzeqi/article/details/103653122