Browse Source

添加市中心地名地址结果解析逻辑,以及部分逻辑调整

DESKTOP-6LTVLN7\Liumouren 2 months ago
parent
commit
7a227db023

+ 37 - 36
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -47,6 +47,20 @@ public class AddressQueryEngine {
             return null;
         }
         AddressResult addressResult = new AddressResult();
+//      数据库查询
+        for (String addr : addrs) {
+            if (addr.startsWith("中山") && !addr.startsWith("中山街道")) {
+                addr = addr.replace("中山", "中山街道");
+            }
+            // 优先进行数据库查询
+            List<AmapAddressV3> dbPois = AreaService.getInstance().getAddressPoisByAddr(addr);
+            JSONArray pois = new JSONArray();
+            if (dbPois != null && dbPois.size() > 0) {
+                System.out.println("数据库查询有结果!!!!");
+                pois.addAll(dbPois);
+                return new TransfromDataTool().gdV3ResultToResult(addr, pois, false);
+            }
+        }
         /*for (String addr : addrs) {
             //  创建请求
             addressResult = sj_szxSearchByName(addr, 3);
@@ -57,7 +71,7 @@ public class AddressQueryEngine {
             }
         }*/
 //      市中心转发的测绘院地名地址服务
-        /*for (String addr : addrs) {
+        for (String addr : addrs) {
             //  创建请求
             addressResult = szxSearchByName(addr);
             if (addressResult != null) {
@@ -65,7 +79,7 @@ public class AddressQueryEngine {
                 addressResult.setMessage("成功");
                 return getCjWgWgwByLoc(addressResult);
             }
-        }*/
+        }
 //      TODO 如果多次尝试请求市中心地址后,还是请求失败就使用高德地名地址搜索
         for (String addr : addrs) {
             //  创建请求(要返回对应的搜索地址,返回地址,总分,市:cityname,街道:adname,村居:community)
@@ -295,33 +309,21 @@ public class AddressQueryEngine {
         if (address.startsWith("中山") && !address.startsWith("中山街道")) {
             address = address.replace("中山", "中山街道");
         }
-
-
-
-        // 优先进行数据库查询
-        List<AmapAddressV3> dbPois = AreaService.getInstance().getAddressPoisByAddr(address);
-
         JSONArray pois = new JSONArray();
-        if(dbPois != null && dbPois.size() > 0){
-            System.out.println("数据库查询有结果!!!!");
-            pois.addAll(dbPois);
-            return new TransfromDataTool().gdV3ResultToResult(address, pois, false);
-        } else {// 数据查询无结果,使用高德
-            System.out.println("!!!!!数据库查询无结果!!!!-----!!!开始进行高德查询-----!!!!!");
-            String geoUrl =
-                    Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
-                            "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
-            ResponseEntity responseEntity = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
-            if (responseEntity.hasBody()) {
-                String body = responseEntity.getBody() + "";
-                if (!StringUtils.hasText(body)) {
-                    return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
-                }
+        String geoUrl =
+                Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
+                        "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
+        ResponseEntity responseEntity = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
+        if (responseEntity.hasBody()) {
+            String body = responseEntity.getBody() + "";
+            if (!StringUtils.hasText(body)) {
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
+            }
 
-                JSONObject json = JSONObject.parseObject(body);
-                if (json.containsKey("pois")) {
-                    pois.addAll(json.getJSONArray("pois"));
-                }
+            JSONObject json = JSONObject.parseObject(body);
+            if (json.containsKey("pois")) {
+                pois.addAll(json.getJSONArray("pois"));
+            }
 //            if (json.containsKey("count")) {
 //                int count = Integer.parseInt(json.get("count") + "");
 //                if (count > 20) {
@@ -343,16 +345,15 @@ public class AddressQueryEngine {
 //                    }
 //                }
 //            }
-                try {
-                    return new TransfromDataTool().gdV3ResultToResult(address, pois, true);
-                } catch (Exception e) {
-                    System.err.println(e);
-                    e.printStackTrace();
-                    return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
-                }
-            } else {
-                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "高德V3分页查询无结果");
+            try {
+                return new TransfromDataTool().gdV3ResultToResult(address, pois, true);
+            } catch (Exception e) {
+                System.err.println(e);
+                e.printStackTrace();
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
             }
+        } else {
+            return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "高德V3分页查询无结果");
         }
     }
 

+ 16 - 9
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -131,10 +131,15 @@ public class TransfromDataTool {
             content.setCityname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[1]);
             double[] points = new double[]{jsonObject.getJSONObject("location").getDouble("lng"),
                     jsonObject.getJSONObject("location").getDouble("lat")};
-            content.setLon(points[1]);
-            content.setLat(points[0]);
-            if (jsonObject.get("point_x") != null && jsonObject.get("point_y") != null) {
+            content.setLon(points[0]);
+            content.setLat(points[1]);
+            if (jsonObject.containsKey("point_x") && jsonObject.containsKey("point_y") && jsonObject.get("point_x") != null && jsonObject.get("point_y") != null) {
                 content.setLocation(jsonObject.getDouble("point_x") + "," + jsonObject.getDouble("point_y"));
+            } else {
+//              市中心返回的结果没有sh2000坐标字段的话就把wgs84的坐标转成sh2000的坐标系并保存到location字段中
+                double[] points2 = CoordTransform2.getInstance().wgs84ToShcj(
+                        jsonObject.getJSONObject("location").getDouble("lng"), jsonObject.getJSONObject("location").getDouble("lat"));
+                content.setLocation(points2[0] + "," + points2[1]);
             }
             content.setAdname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[2]);
             if (jsonObject.containsKey("ext_data")) {
@@ -191,7 +196,7 @@ public class TransfromDataTool {
         return result;
     }
 
-    public AddressResult gdV3ResultToResult(String searchAddress, JSONArray array, boolean isInserted ) {
+    public AddressResult gdV3ResultToResult(String searchAddress, JSONArray array, boolean isInserted) {
         AddressResult result = new AddressResult();
         if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
@@ -210,17 +215,19 @@ public class TransfromDataTool {
                 content.setAddress(content.getPname() + content.getAdname() + jsonObject.getString("address"));
                 content.setName(jsonObject.getString("name"));
                 String[] loc = jsonObject.getString("location").split(",");
-                double[] points = CoordTransform2.getInstance().gcj02_to_wgs84(
+                double[] points = CoordTransform2.getInstance().gcj02_to_shcj(
                         Double.parseDouble(loc[0]), Double.parseDouble(loc[1]));
                 content.setLocation(points[0] + "," + points[1]);
-                content.setLon(points[0]);
-                content.setLat(points[1]);
+                double[] points2 = CoordTransform2.getInstance().gcj02_to_wgs84(
+                        Double.parseDouble(loc[0]), Double.parseDouble(loc[1]));
+                content.setLon(points2[0]);
+                content.setLat(points2[1]);
                 if (result.getData() == null) {
                     result.setData(new ArrayList<>());
                 }
                 result.getData().add(content);
             }
-            if(isInserted){
+            if (isInserted) {
                 //          TODO 将请求返回的高德结果入库到pgsql中
                 List<AmapAddressV3> amapAddressV3List = new ArrayList<>();
                 for (int i = 0; i < array.size(); i++) {
@@ -257,7 +264,7 @@ public class TransfromDataTool {
             System.err.println("gdV3ResultToResult err:" + e);
         }
         result.setCode(AddressResultEnum.GDV3_SUCCESS);
-        if(isInserted){
+        if (isInserted) {
             System.out.println("*******高德查询结果返回,查询地址是:" + searchAddress);
         } else {
             System.out.println("&&&&&&&数据库查询结果返回,查询地址是:" + searchAddress);

+ 3 - 3
src/main/java/com/skyversation/poiaddr/bean/AddressResult.java

@@ -44,11 +44,11 @@ public class AddressResult {
         private String distance;
         // 地址名称
         private String name;
-        // 经纬度
+        // 经纬度(保存上海2000坐标系)
         private String location;
-        // 纬度
+        // 纬度(wgs84)
         private Double lat;
-        // 经度
+        // 经度(wgs84)
         private Double lon;
         // 村居信息
         private JSONObject cjJson;

+ 3 - 1
src/main/java/com/skyversation/poiaddr/entity/AmapAddressV3.java

@@ -50,6 +50,7 @@ public class AmapAddressV3  implements Serializable {
    	@Column(name = "address" )
 	private String address;
 
+//	高德坐标系
    	@Column(name = "location" )
 	private String location;
 
@@ -98,9 +99,10 @@ public class AmapAddressV3  implements Serializable {
    	@Column(name = "residential_committee" )
 	private String residentialCommittee;
 
+//	上海2000
    	@Column(name = "lon" )
 	private String lon;
-
+//	上海2000
    	@Column(name = "lat" )
 	private String lat;
 }

+ 2 - 2
src/main/java/com/skyversation/poiaddr/entity/YyskAddressStandardization.java

@@ -68,12 +68,12 @@ public class YyskAddressStandardization implements Serializable {
 	private String matchLevel;
 
 	/**
-	 * 经度
+	 * 经度(SH2000)
 	 */
 	private String lat;
 
 	/**
-	 * 纬度
+	 * 纬度(SH2000)
 	 */
 	private String lon;
 

+ 1 - 1
src/main/java/com/skyversation/poiaddr/service/AmapAddressV3Repository.java

@@ -12,7 +12,7 @@ import java.util.List;
 public interface AmapAddressV3Repository extends JpaRepository<AmapAddressV3, String> {
 
     // 执行自定义的SQL查询
-    @Query(value = "SELECT * FROM amap_address_v3 WHERE name ILIKE %:addr% OR address ILIKE %:addr% LIMIT 20", nativeQuery = true)
+    @Query(value = "SELECT * FROM amap_address_v3 WHERE address ILIKE %:addr% LIMIT 20", nativeQuery = true)
     List<AmapAddressV3> getAddressPoisByAddr(@Param("addr") String addr);
 
     @Query(value = "SELECT COUNT(*) FROM amap_address_v3", nativeQuery = true)

+ 3 - 3
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -162,9 +162,9 @@ public class AreaService {
         }
 
         if(addr.contains("号")){
-            addr = addr.substring(0, addr.indexOf("号") + 1);
+            addr = addr.substring(0, addr.lastIndexOf("号") + 1);
         } else if(addr.contains("弄")){
-            addr = addr.substring(0, addr.indexOf("弄") + 1);
+            addr = addr.substring(0, addr.lastIndexOf("弄") + 1);
         }
         System.out.println("<<<<<<<----- 开始数据库查询,数据查询地址为:" + addr);
         return amapAddressV3Service.getAddressPoisByAddr(addr);
@@ -172,7 +172,7 @@ public class AreaService {
 
     public GeoJsonBean isInadPolygon(double lon, double lat) {
         try {
-            Geometry point = reader.read("POINT (" + lat + " " + lon + ")");
+            Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
             for (GeoJsonBean bean : shAllAdministrativeDivisionPolygonList) {
                 if (bean.getMultiPolygon().contains(point)) {
                     return bean;

+ 7 - 18
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationServiceImpl.java

@@ -309,19 +309,15 @@ public class YyskAddressStandardizationServiceImpl {
     }
 
     public void searchLoadFileData(String fileRootPath, Integer startFileIndex, Integer endFileIndex, Integer sort) {
-
-
         // 任务总数
-        int totalTasks = 412;
+        int totalTasks = Math.abs(endFileIndex - startFileIndex);
         // 最大线程数
-        int maxThreads = 20;
-
-        // 创建一个固定大小的线程池
-        ExecutorService executorService = Executors.newFixedThreadPool(maxThreads);
-
+        int maxThreads = Runtime.getRuntime().availableProcessors();
+        // 创建一个最大线程数一半的线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(maxThreads / 2);
         // 提交任务到线程池
-        for (int i = 22; i < totalTasks; i++) {
-            final int taskId = i;
+        for (int i = 0; i < totalTasks; i++) {
+            final int taskId = sort * (i + 1) + startFileIndex;
             executorService.submit(() -> {
                 // 任务执行
                 System.out.println("<<<<<<------Executing task: " + taskId + " on thread: " + Thread.currentThread().getName() + "------>>>>>>>>");
@@ -332,7 +328,6 @@ public class YyskAddressStandardizationServiceImpl {
 
         // 关闭线程池
         executorService.shutdown();
-
         System.out.println("<<<<<--- 任务完成!!!----->>>>>>>");
 
     }
@@ -360,12 +355,6 @@ public class YyskAddressStandardizationServiceImpl {
             }
             long endTime = System.currentTimeMillis();
             System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!");
-//            if (startFileIndex + sort != endFileIndex) {
-//                startFileIndex += sort;
-//                searchLoadFileData(fileRootPath, startFileIndex, endFileIndex, sort);
-//            } else {
-//                System.out.println("<<<<<<<<------任务处理完成!");
-//            }
         } else {
             System.out.println("<<<<<<<<------ 第" + startFileIndex + "个文件 -----任务处理完成!结果为空。。。--->>>>" + outPath);
         }
@@ -403,7 +392,7 @@ public class YyskAddressStandardizationServiceImpl {
                 //  TODO 开始查询
                 AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList);
                 System.out.println("<<<---- 第: " + index + " 条数据返回数据,数据为:!!!" + addressResult.getMessage() + "   ----->>>>>");
-                if (addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1) {
+                if (addressResult.getData() == null || addressResult.getData().size() < 1) {
                     item.setMatchLevel("异常");
                     item.setReturnAddress("未匹配到符合规则的结果");
                 } else {

+ 52 - 17
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -6,6 +6,8 @@ import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
+import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.service.AreaService;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
 import org.locationtech.jts.geom.Geometry;
@@ -301,7 +303,7 @@ public class AddressTools {
      * @return 上海市,松江区,车墩镇,乐都路590号
      */
     public static String[] parseAddressJZ(String address) {
-        if(!StringUtils.hasText(address)){
+        if (!StringUtils.hasText(address)) {
             return null;
         }
         String[] result = new String[4];
@@ -569,6 +571,39 @@ public class AddressTools {
             }
         }
 
+        //          TODO 将请求返回的市中心结果入库到pgsql中
+        List<AmapAddressV3> amapAddressV3List = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject item = array.getJSONObject(i);
+            AmapAddressV3 amapAddressV3 = new AmapAddressV3();
+            amapAddressV3.setId(UUID.randomUUID().toString());
+            amapAddressV3.setName(item.get("name").toString());
+            amapAddressV3.setType("测绘院结果");
+            amapAddressV3.setAddress(item.get("address").toString());
+            JSONObject localtion = item.getJSONObject("location");
+            Double wgs84Lng = localtion.getDouble("lng");
+            Double wgs84Lat = localtion.getDouble("lat");
+            double[] points2 = CoordTransform2.getInstance().wgs84ToShcj(wgs84Lng, wgs84Lat);
+            double[] points = CoordTransform2.getInstance().wgs84_to_gcj02(wgs84Lng, wgs84Lat);
+            amapAddressV3.setLocation(points[0] + "," + points[1]);
+            amapAddressV3.setLon(String.valueOf(points2[0]));
+            amapAddressV3.setLat(String.valueOf(points2[1]));
+            amapAddressV3.setCreateTime(new Date());
+            if (item.containsKey("ext_data")) {
+                JSONObject ext_data = item.getJSONObject("ext_data");
+                if (!ext_data.get("region_ss").toString().isEmpty()) {
+                    amapAddressV3.setPname(ext_data.get("region_ss").toString());
+                    amapAddressV3.setCityname(ext_data.get("region_ss").toString());
+                    amapAddressV3.setAdname(item.get("region_qx").toString());
+                    amapAddressV3.setStreetTTown(item.get("region_jd").toString());
+                    amapAddressV3.setResidentialCommittee(item.get("region_jw").toString());
+                }
+            }
+            amapAddressV3List.add(amapAddressV3);
+        }
+        if (amapAddressV3List.size() > 0) {
+            AreaService.getInstance().saveAmapAddressV3(amapAddressV3List);
+        }
         return bestMatch;
     }
 
@@ -735,7 +770,7 @@ public class AddressTools {
     /***
      * 初始化上海市84坐标系下的,区划、街镇、村居矢量数据
      */
-    public void initSHQH(){
+    public void initSHQH() {
         List<List<GeoJsonBean>> lis = new ArrayList<>();
         lis.add(qxPolygonList);
         lis.add(jzPolygonList);
@@ -757,8 +792,8 @@ public class AddressTools {
         }
     }
 
-    private void initPolygon(String[] path, List<List<GeoJsonBean>> list){
-        for(int j = 0; j < path.length; j ++){
+    private void initPolygon(String[] path, List<List<GeoJsonBean>> list) {
+        for (int j = 0; j < path.length; j++) {
             BufferedReader br = null;
             try {
                 File file = ResourceUtils.getFile(path[j]);
@@ -773,7 +808,7 @@ public class AddressTools {
 
                 JSONArray featrues = json.getJSONArray("features");
 
-                for(int i = 0; i < featrues.size(); i ++){
+                for (int i = 0; i < featrues.size(); i++) {
                     Map<String, GeoJsonBean> map = new HashMap<>();
                     JSONObject properties = featrues.getJSONObject(i).getJSONObject("properties");
                     JSONObject geoJson = new JSONObject();
@@ -797,7 +832,7 @@ public class AddressTools {
         System.out.println("<<<<<<<<------  初始化行政区划完成  ------>>>>>>>>>");
     }
 
-    public JSONObject isQXInPolygon(double lon, double lat){
+    public JSONObject isQXInPolygon(double lon, double lat) {
         Geometry point = null;
         try {
             point = reader.read("POINT (" + lon + " " + lat + ")");
@@ -805,8 +840,8 @@ public class AddressTools {
             throw new RuntimeException(e);
         }
 
-        for(GeoJsonBean bean : qxPolygonList){
-            if(bean.getMultiPolygon().contains(point)){
+        for (GeoJsonBean bean : qxPolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
                 return bean.getProperties();
             }
         }
@@ -814,7 +849,7 @@ public class AddressTools {
     }
 
 
-    public JSONObject isJZInPolygon(double lon, double lat){
+    public JSONObject isJZInPolygon(double lon, double lat) {
         Geometry point = null;
         try {
             point = reader.read("POINT (" + lon + " " + lat + ")");
@@ -822,15 +857,15 @@ public class AddressTools {
             throw new RuntimeException(e);
         }
 
-        for(GeoJsonBean bean : jzPolygonList){
-            if(bean.getMultiPolygon().contains(point)){
+        for (GeoJsonBean bean : jzPolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
                 return bean.getProperties();
             }
         }
         return null;
     }
 
-    public JSONObject isCJInPolygon(double lon, double lat){
+    public JSONObject isCJInPolygon(double lon, double lat) {
         Geometry point = null;
         try {
             point = reader.read("POINT (" + lon + " " + lat + ")");
@@ -838,15 +873,15 @@ public class AddressTools {
             throw new RuntimeException(e);
         }
 
-        for(GeoJsonBean bean : cjPolygonList){
-            if(bean.getMultiPolygon().contains(point)){
+        for (GeoJsonBean bean : cjPolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
                 return bean.getProperties();
             }
         }
         return null;
     }
 
-    public JSONObject isCJSH2000InPolygon(double x, double y){
+    public JSONObject isCJSH2000InPolygon(double x, double y) {
         Geometry point = null;
         try {
             point = reader.read("POINT (" + x + " " + y + ")");
@@ -854,8 +889,8 @@ public class AddressTools {
             throw new RuntimeException(e);
         }
 
-        for(GeoJsonBean bean : cjSh2000PolygonList){
-            if(bean.getMultiPolygon().contains(point)){
+        for (GeoJsonBean bean : cjSh2000PolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
                 return bean.getProperties();
             }
         }