From e4a0a497dc089630a48dc7f2454cc5a5155316e7 Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Tue, 15 Nov 2022 20:55:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E8=BE=B9=E5=BD=A2?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=EF=BC=8C=E9=87=8D=E5=BF=83=E7=82=B9=E8=AE=A1?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ink/wgink/util/point/PointUtil.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/basic-util/src/main/java/ink/wgink/util/point/PointUtil.java b/basic-util/src/main/java/ink/wgink/util/point/PointUtil.java index fcdb130c..8394772f 100644 --- a/basic-util/src/main/java/ink/wgink/util/point/PointUtil.java +++ b/basic-util/src/main/java/ink/wgink/util/point/PointUtil.java @@ -19,6 +19,11 @@ public class PointUtil { private static final double RADIAN = Math.PI / 180.00D; private static final double HALF = 0.5D; + public static final double MIN_LAT = -90; + public static final double MAX_LAT = 90; + public static final double MIN_LNG = -180; + public static final double MAX_LNG = 180; + /** * 点在多边形内 * @@ -301,4 +306,97 @@ public class PointUtil { return Math.abs(area); } + /** + * 计算中心点 + * + * @param mPoints + * @return + */ + public static Point getCenterPoint(List mPoints) { + double latitude = (getMinLatitude(mPoints) + getMaxLatitude(mPoints)) / 2; + double longitude = (getMinLongitude(mPoints) + getMaxLongitude(mPoints)) / 2; + return new Point(latitude, longitude); + } + + + /** + * 获取不规则多边形重心点 + * + * @param mPoints + * @return + */ + public static Point getCenterOfGravityPoint(List mPoints) { + double area = 0.0;//多边形面积 + double Gx = 0.0, Gy = 0.0;// 重心的x、y + for (int i = 1; i <= mPoints.size(); i++) { + double iLat = mPoints.get(i % mPoints.size()).getX(); + double iLng = mPoints.get(i % mPoints.size()).getY(); + double nextLat = mPoints.get(i - 1).getX(); + double nextLng = mPoints.get(i - 1).getY(); + double temp = (iLat * nextLng - iLng * nextLat) / 2.0; + area += temp; + Gx += temp * (iLat + nextLat) / 3.0; + Gy += temp * (iLng + nextLng) / 3.0; + } + Gx = Gx / area; + Gy = Gy / area; + return new Point(Gx, Gy); + } + + // 经度最小值 + public static double getMinLongitude(List mPoints) { + double minLongitude = MAX_LNG; + if (mPoints.size() > 0) { + minLongitude = mPoints.get(0).getY(); + for (Point latlng : mPoints) { + // 经度最小值 + if (latlng.getY() < minLongitude) + minLongitude = latlng.getY(); + } + } + return minLongitude; + } + + // 经度最大值 + public static double getMaxLongitude(List mPoints) { + double maxLongitude = MIN_LNG; + if (mPoints.size() > 0) { + maxLongitude = mPoints.get(0).getY(); + for (Point latlng : mPoints) { + // 经度最大值 + if (latlng.getY() > maxLongitude) + maxLongitude = latlng.getY(); + } + } + return maxLongitude; + } + + // 纬度最小值 + public static double getMinLatitude(List mPoints) { + double minLatitude = MAX_LAT; + if (mPoints.size() > 0) { + minLatitude = mPoints.get(0).getX(); + for (Point latlng : mPoints) { + // 纬度最小值 + if (latlng.getX() < minLatitude) + minLatitude = latlng.getX(); + } + } + return minLatitude; + } + + // 纬度最大值 + public static double getMaxLatitude(List mPoints) { + double maxLatitude = MIN_LAT; + if (mPoints.size() > 0) { + maxLatitude = mPoints.get(0).getX(); + for (Point latlng : mPoints) { + // 纬度最大值 + if (latlng.getX() > maxLatitude) + maxLatitude = latlng.getX(); + } + } + return maxLatitude; + } + }