相关方法 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960public class GpsUtil { /** * 获得球面(地球)上两个点之间的距离(坐标可以为 WGS84、GCJ02 等任何一种坐标,但两个点的坐标类型必须相同) * * @param longitudeStart 起点的经度 * @param latitudeStart 起点的纬度 * @param longitudeEnd 终点的经度 * @param latitudeEnd 终点的纬度 * @return 两点之间的距离,单位是米 */ public static int getDistance(double longitudeStart, double latitudeStart, double longitudeEnd, double latitudeEnd) { // 计算弧长(d * Math.PI / 180.0) double radLatStart = Math.toRadians(latitudeStart); double radLatEnd = Math.toRadians(latitudeEnd); double radLat = radLatStart - radLatEnd; double radLonDiff = Math.toRadians(longitudeStart) - Math.toRadians(longitudeEnd); double sum = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(radLat / 2), 2) + Math.cos(radLatStart) * Math.cos(radLatEnd) * Math.pow(Math.sin(radLonDiff / 2), 2))); // 取 WGS84 标准参考椭球中的地球长半径 (单位:m) sum = sum * 6378137.0; return (int) Math.round(sum); } /** * 判断某个经纬度否在多边形区域内 * <p> * List<java.awt.geom.Point2D.Double> pointList = new ArrayList<>(); * java.awt.geom.Point2D.Double polygonPoint = new java.awt.geom.Point2D.Double(longitudeDouble, latitudeDouble); * pointList.add(polygonPoint); * System.out.println(" 结果: " + isInArea(118.95401, 28.979503, pointList)); * * @param longitude 经度 * @param latitude 纬度 * @param pointList 经纬度集合 * @return */ public static boolean isInArea(double longitude, double latitude, List<Point2D.Double> pointList) { // 将要判断的经纬度组成一个点 Point2D.Double point = new Point2D.Double(longitude, latitude); GeneralPath peneralPath = new GeneralPath(); // 获取第一个坐标 Point2D.Double firstPoint = pointList.get(0); // 通过移动到指定坐标,将一个点添加到路径中 peneralPath.moveTo(firstPoint.x, firstPoint.y); pointList.remove(0); for (Point2D.Double aDouble : pointList) { // 通过绘制一条从当前坐标到新指定坐标的直线,将一个点添加到路径中。 peneralPath.lineTo(aDouble.x, aDouble.y); } // 将几何多边形封闭 peneralPath.lineTo(firstPoint.x, firstPoint.y); peneralPath.closePath(); // 判断指定的 Point2D 是否在 Shape 的边界内。 return peneralPath.contains(point); }}