From 4fabfe4dbd2eb28d07a4350597d314958cc1c281 Mon Sep 17 00:00:00 2001 From: MrShi <1878285526@qq.com> Date: 星期四, 09 十月 2025 11:16:43 +0800 Subject: [PATCH] 优化 --- server/services/src/main/java/com/doumee/core/utils/PositionUtil.java | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 159 insertions(+), 0 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 74294d2..3d23120 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 @@ -1,6 +1,8 @@ package com.doumee.core.utils; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.doumee.dao.business.web.request.LocaltionDTO; import java.awt.geom.GeneralPath; @@ -13,7 +15,164 @@ */ public class PositionUtil { + + + + public static String getTxMapAddrByLatAndLng(Double lat,Double lng,String host,String mapkey){ + try { + if(lat == null || lng ==null){ + return null; + } + String url =host +"/ws/geocoder/v1/?key="+mapkey+"&location="+lat+","+lng; + String res = HttpsUtil.get(url,false); + JSONObject jsonObject = JSONObject.parseObject(res ); + String r = null; + if(jsonObject.getJSONObject("result")!=null){ + if(jsonObject.getJSONObject("result").getJSONObject("formatted_addresses")!=null){ + r =jsonObject.getJSONObject("result").getJSONObject("formatted_addresses").getString("recommend"); + } + if(r==null || r.equals("")){ + r =jsonObject.getJSONObject("result").getString("address"); + } + } + return r; + + }catch (Exception e){ + e.printStackTrace(); + } + 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) { +// System.out.println( +// PositionUtil.getTxMapAddrByLatAndLng(Double.valueOf("31.76792509"),Double.valueOf("117.23267758"),"https://apis.map.qq.com","3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ") +// ); + +// 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.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.71553300, + "longitude": 117.39, +117.393962,31.713690 + 31.71550000 117.38823300 + */ /** * 鍒ゆ柇鍧愭爣鐐规槸鍚﹀湪澶氳竟褰㈠尯鍩熷唴 * * @param pointLon 瑕佸垽鏂殑鐐圭殑缁忓害 -- Gitblit v1.9.3