From 04dba6a17f836b5fbdf0eedff8a129c6785fd8a2 Mon Sep 17 00:00:00 2001 From: k94314517 <8417338+k94314517@user.noreply.gitee.com> Date: 星期五, 28 二月 2025 18:25:00 +0800 Subject: [PATCH] 111 --- server/services/src/main/java/com/doumee/core/utils/PositionUtil.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 117 insertions(+), 3 deletions(-) diff --git a/server/services/src/main/java/com/doumee/core/utils/PositionUtil.java b/server/services/src/main/java/com/doumee/core/utils/PositionUtil.java index d311bd5..bbfeaba 100644 --- a/server/services/src/main/java/com/doumee/core/utils/PositionUtil.java +++ b/server/services/src/main/java/com/doumee/core/utils/PositionUtil.java @@ -39,18 +39,132 @@ } return null; } + /** + * 妞悆鍙傛暟 + */ + private static double pi = 3.14159265358979324; + /** + * 鍗槦妞悆鍧愭爣鎶曞奖鍒板钩闈㈠湴鍥惧潗鏍囩郴鐨勬姇褰卞洜瀛� + */ + private static double a = 6378245.0; + /** + * 妞悆鐨勫亸蹇冪巼 + */ + private static double ee = 0.00669342162296594323; + /** + * 缁忕含搴� GPS杞珮寰� + * + * @param wgLon GPS缁忓害 + * @param wgLat GPS缁村害 + * @return 杞寲鍚庣殑缁忕含搴﹀潗鏍� + */ + public static AMap transform(double wgLon, double wgLat) { + if (outOfChina(wgLat, wgLon)) { + return new AMap(wgLon, wgLat); + } + + double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); + double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); + double radLat = wgLat / 180.0 * pi; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double transLat = wgLat + dLat; + double transLon = wgLon + dLon; + return new AMap(transLon, transLat); + } + + /** + * 鍒ゆ柇鏄惁涓哄浗澶栧潗鏍囷紝锛屼笉鍦ㄥ浗鍐呬笉鍋氬亸绉� + * + * @param lat + * @param lon + * @return + */ + private static Boolean outOfChina(double lat, double lon) { + if (lon < 72.004 || lon > 137.8347) + return true; + if (lat < 0.8293 || lat > 55.8271) + return true; + return false; + } + + /** + * 绾害杞崲 + * + * @param x + * @param y + * @return + */ + private static double transformLat(double x, double y) { + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; + return ret; + } + + /** + * 缁忓害杞崲 + * + * @param x + * @param y + * @return + */ + private static double transformLon(double x, double y) { + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; + return ret; + } + + /** + * 楂樺痉缁忕含搴︾被 + */ + public static class AMap { + /** + * 缁忓害 + */ + private double longitude; + + /** + * 缁村害 + */ + private double latitude; + + public AMap(double longitude, double latitude) { + this.longitude = longitude; + this.latitude = latitude; + } + + public double getLongitude() { + return longitude; + } + + public double getLatitude() { + return latitude; + } + } public static void main(String[] args) { - String str ="[{\"lat\": 31.71383446224521, \"lng\": 117.39342857107226, \"height\": 0}, {\"lat\": 31.71393087373135, \"lng\": 117.39402357524818, \"height\": 0}, {\"lat\": 31.713593433089077, \"lng\": 117.39433170240886, \"height\": 0}, {\"lat\": 31.713280450806966, \"lng\": 117.39358710879355, \"height\": 0}]"; + String str ="[{\"lat\":31.732726766273103,\"lng\":117.37721605116087,\"height\":0},{\"lat\":31.72079687406289,\"lng\":117.39831914258241,\"height\":0},{\"lat\":31.714484720597493,\"lng\":117.39831914258241,\"height\":0},{\"lat\":31.71233192243245,\"lng\":117.39583137996954,\"height\":0},{\"lat\":31.71401037878662,\"lng\":117.3785457182995,\"height\":0}]"; TypeReference typeReference = new TypeReference<List<LocaltionDTO>>(){}; List<LocaltionDTO> array = JSONObject.parseObject(str, typeReference.getType()); if(array == null || array.size() ==0){ System.out.println("================="); } - System.out.println(isInPolygon(117.39, 31.71551600,array)); + System.out.println(isInPolygon( 117.39387876,31.71365546,array)); +// AMap aMap = transform( 117.38823300, 31.71550000); +// System.out.println(aMap.getLatitude()+""+aMap.getLongitude()); +// System.out.println(isInPolygon( aMap.getLongitude(),aMap.getLatitude(),array)); } - /* "latitude": 31.71551600, + /* "latitude": 31.71553300, "longitude": 117.39, +117.393962,31.713690 + 31.71550000 117.38823300 */ /** * 鍒ゆ柇鍧愭爣鐐规槸鍚﹀湪澶氳竟褰㈠尯鍩熷唴 * -- Gitblit v1.9.3