Browse Source

调整逻辑,流程调整,完善上海市区、街镇geojson数据

DESKTOP-6LTVLN7\Liumouren 1 tháng trước cách đây
mục cha
commit
5e2cb9f6cf

+ 6 - 0
pom.xml

@@ -47,6 +47,12 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.33</version> <!-- 可根据需要选择合适的 MySQL 8 版本 -->
         </dependency>
+        <!-- 星环数据库 JDBC 驱动 -->
+<!--        <dependency>-->
+<!--            <groupId>com.argoDb</groupId>-->
+<!--            <artifactId>argoDb-jdbc-driver</artifactId>-->
+<!--            <version>8.37.3</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.json</groupId>
             <artifactId>json</artifactId>

+ 112 - 90
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -16,8 +16,6 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 public class AddressQueryEngine {
 
@@ -35,12 +33,6 @@ public class AddressQueryEngine {
 
     private WDToken wdToken = null;
 
-    public static void main(String[] args) {
-        String[] address = new String[]{"未来城"};
-        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(address, AddressLevel.values()[1]);
-        System.out.println(addressResult);
-    }
-
     /***
      * 单条地名搜索通用方法,搜索顺序  1. 武大吉奥; 2. 市四中心; 3. 高德搜索; 4. 高德高级搜索;
      * @param addrs
@@ -52,8 +44,8 @@ public class AddressQueryEngine {
      *              5. 结果与基准数据完全一致,则使用。
      * @return
      */
-    public AddressResult commonSearchByName(String[] addrs, AddressLevel level) {
-        if (addrs == null || addrs.length < 1) {
+    public AddressResult commonSearchByName(List<String> addrs, AddressLevel level) {
+        if (addrs == null || addrs.size() < 1) {
             return null;
         }
         AddressResult addressResult = new AddressResult();
@@ -84,7 +76,7 @@ public class AddressQueryEngine {
                 }
             }
         }
-        if (addressResult.getData() == null || addressResult.getData().size() == 0) {
+        /*if (addressResult.getData() == null || addressResult.getData().size() == 0) {
             for (String addr : addrs) {
                 AddressResult.ContentBean contentBean = verificaData(gdSearchByName(addr), level, addr);
                 if (contentBean != null) {
@@ -95,8 +87,8 @@ public class AddressQueryEngine {
                     return getCjWgWgwByLoc(addressResult);
                 }
             }
-        }
-        if (addressResult.getData() == null || addressResult.getData().size() == 0) {
+        }*/
+        /*if (addressResult.getData() == null || addressResult.getData().size() == 0) {
             for (String addr : addrs) {
                 AddressResult.ContentBean contentBean = verificaData(gdV3SearchByName(addr), level, addr);
                 if (contentBean != null) {
@@ -107,7 +99,7 @@ public class AddressQueryEngine {
                     return getCjWgWgwByLoc(addressResult);
                 }
             }
-        }
+        }*/
         addressResult.setCode(AddressResultEnum.RESULT_NULL);
         addressResult.setMessage("失败");
         return addressResult;
@@ -165,7 +157,7 @@ public class AddressQueryEngine {
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
             }
         } else {
-            System.out.println("地址" + address + "未查询到数据!");
+            System.out.println("地址[" + address + "]未查询到数据!");
             return null;
         }
     }
@@ -197,15 +189,19 @@ public class AddressQueryEngine {
     public AddressResult gdSearchByName(String address) {
         String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
         ResponseEntity response = AddressNetTools.getInstance().requestGet(geoUrl, null, null);
-        String body = response.getBody() + "";
-        if (!StringUtils.hasText(body))
-            return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
-        try {
-            JSONObject json = JSONObject.parseObject(body);
-            return TransfromDataTool.gdResultToResult(json);
-        } catch (Exception e) {
-            System.err.println(e);
-            return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
+        if (response != null && response.getBody() != null) {
+            String body = response.getBody() + "";
+            if (!StringUtils.hasText(body))
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
+            try {
+                JSONObject json = JSONObject.parseObject(body);
+                return TransfromDataTool.gdResultToResult(json);
+            } catch (Exception e) {
+                System.err.println(e);
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
+            }
+        } else {
+            return null;
         }
     }
 
@@ -216,37 +212,48 @@ public class AddressQueryEngine {
      */
     public AddressResult gdV3SearchByName(String address) {
         String geoUrl =
-//                + Constant.AMAP_SEARCH_TYPES  070500
                 Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
                         "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
-        System.out.println("geoUrl:" + geoUrl);
-        String body = null;
-        body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
-        if (!StringUtils.hasText(body)) {
-            return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
-        }
-        JSONArray pois = new JSONArray();
-        JSONObject json = JSONObject.parseObject(body);
-        pois.addAll(json.getJSONArray("pois"));
-
-        int count = Integer.valueOf(json.get("count") + "");
-        if (count > 20) {
-            for (int i = 2; i < (count % 20 + 1); i++) {
-                geoUrl =
-                        Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
-                                "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20&page=" + i;
-                body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
-                if (!StringUtils.hasText(body)) {
-                    return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
+        ResponseEntity responseEntity = AddressNetTools.getInstance().requestGet(geoUrl, null, null);
+        if (responseEntity.hasBody()) {
+            String body = responseEntity.getBody() + "";
+            if (!StringUtils.hasText(body)) {
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
+            }
+            JSONArray pois = new JSONArray();
+            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) {
+                    for (int i = 2; i < (count % 20 + 1); i++) {
+                        geoUrl =
+                                Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
+                                        "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20&page=" + i;
+                        ResponseEntity responseEntity2 = AddressNetTools.getInstance().requestGet(geoUrl, null, null);
+                        if (responseEntity2.hasBody()) {
+                            body = responseEntity2.getBody() + "";
+                        }
+                        if (!StringUtils.hasText(body)) {
+                            return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
+                        }
+                        JSONObject json2 = JSONObject.parseObject(body);
+                        if (json2.containsKey(pois)) {
+                            pois.addAll(JSONObject.parseObject(body).getJSONArray("pois"));
+                        }
+                    }
                 }
-                pois.addAll(JSONObject.parseObject(body).getJSONArray("pois"));
             }
-        }
-        try {
-            return TransfromDataTool.gdV3ResultToResult(pois);
-        } catch (Exception e) {
-            System.err.println(e);
-            return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
+            try {
+                return TransfromDataTool.gdV3ResultToResult(pois);
+            } catch (Exception e) {
+                System.err.println(e);
+                return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
+            }
+        } else {
+            return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "高德V3分页查询无结果");
         }
     }
 
@@ -262,12 +269,19 @@ public class AddressQueryEngine {
         } else {
             AreaService areaService = AreaService.getInstance();
             for (AddressResult.ContentBean content : result.getData()) {
-                GeoJsonBean cjBean = areaService.isInCJPolygon(content.getLon(), content.getLat());
-                content.setCjJson(cjBean == null ? new JSONObject() : cjBean.getProperties());
-                GeoJsonBean gridBean = areaService.isInGridPolygon(content.getLon(), content.getLat());
-                content.setWgwJson(gridBean == null ? new JSONObject() : gridBean.getProperties());
-                GeoJsonBean wgridBean = areaService.isInWGridPolygon(content.getLon(), content.getLat());
-                content.setWgwJson(wgridBean == null ? new JSONObject() : wgridBean.getProperties());
+                if (content.getLat() != null && content.getLon() != null) {
+                    // TODO 松江的话只跑行政区划和街镇
+                    /*GeoJsonBean cjBean = areaService.isInCJPolygon(content.getLon(), content.getLat());
+                    content.setCjJson(cjBean == null ? new JSONObject() : cjBean.getProperties());
+                    GeoJsonBean gridBean = areaService.isInGridPolygon(content.getLon(), content.getLat());
+                    content.setWgwJson(gridBean == null ? new JSONObject() : gridBean.getProperties());
+                    GeoJsonBean wgridBean = areaService.isInWGridPolygon(content.getLon(), content.getLat());
+                    content.setWgwJson(wgridBean == null ? new JSONObject() : wgridBean.getProperties());*/
+                    GeoJsonBean adBean = areaService.isInadPolygon(content.getLon(), content.getLat());
+                    content.setAdJson(adBean == null ? new JSONObject() : adBean.getProperties());
+                    GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
+                    content.setTownJson(townBean == null ? new JSONObject() : townBean.getProperties());
+                }
             }
             return result;
         }
@@ -303,10 +317,12 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        String address = addressReplaceAll(contentBean1.getAddress());
-                        String address2 = addressReplaceAll(addr);
-                        if (isNotEmptyOrBlank(address) && (address.contains(address2) || address2.contains(address))) {
-                            return contentBean1;
+                        if (contentBean1.getAddress() != null) {
+                            String address = townReplaceAll(addressReplaceAll(contentBean1.getAddress()));
+                            String address2 = townReplaceAll(addressReplaceAll(addr));
+                            if (isNotEmptyOrBlank(address) && address.contains(address2)) {
+                                return contentBean1;
+                            }
                         }
                     }
                 } else {
@@ -318,15 +334,17 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        Set<String> address = tokenizeString(contentBean1.getAddress()).get(1);
-                        if (address != null && address.size() > 1) {
-                            Set<String> address2 = tokenizeString(addr).get(1);
-                            int addressSize = address.size();
-                            for (String addr2 : address2) {
-                                if (address.contains(addr2)) {
-                                    addressSize--;
-                                    if (addressSize == 0) {
-                                        return contentBean1;
+                        if (contentBean1.getAddress() != null) {
+                            Set<String> address = tokenizeString(contentBean1.getAddress()).get(1);
+                            if (address != null && address.size() > 1) {
+                                Set<String> address2 = tokenizeString(addr).get(1);
+                                int addressSize = address.size();
+                                for (String addr2 : address2) {
+                                    if (address.contains(addr2)) {
+                                        addressSize--;
+                                        if (addressSize == 0) {
+                                            return contentBean1;
+                                        }
                                     }
                                 }
                             }
@@ -341,22 +359,24 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        Set<String> addressString = tokenizeString(contentBean1.getAddress()).get(0);
-                        Set<String> addressNumber = tokenizeString(contentBean1.getAddress()).get(1);
-                        Set<String> address2String = tokenizeString(addr).get(0);
-                        Set<String> address2Number = tokenizeString(addr).get(1);
-                        if (addressString != null && addressString.size() > 1) {
-                            int addressStrSize = addressString.size();
-                            for (String addr2str : address2String) {
-                                if (addressString.contains(addr2str)) {
-                                    addressStrSize--;
-                                    if (addressStrSize == 0) {
-                                        int addressNumSize = addressNumber.size();
-                                        for (String addr2Num : address2Number) {
-                                            if (addressNumber.contains(addr2Num)) {
-                                                addressNumSize--;
-                                                if (addressNumSize == 0) {
-                                                    return contentBean1;
+                        if (contentBean1.getAddress() != null) {
+                            Set<String> addressString = tokenizeString(contentBean1.getAddress()).get(0);
+                            Set<String> addressNumber = tokenizeString(contentBean1.getAddress()).get(1);
+                            Set<String> address2String = tokenizeString(addr).get(0);
+                            Set<String> address2Number = tokenizeString(addr).get(1);
+                            if (addressString != null && addressString.size() > 1) {
+                                int addressStrSize = addressString.size();
+                                for (String addr2str : address2String) {
+                                    if (addressString.contains(addr2str)) {
+                                        addressStrSize--;
+                                        if (addressStrSize == 0) {
+                                            int addressNumSize = addressNumber.size();
+                                            for (String addr2Num : address2Number) {
+                                                if (addressNumber.contains(addr2Num)) {
+                                                    addressNumSize--;
+                                                    if (addressNumSize == 0) {
+                                                        return contentBean1;
+                                                    }
                                                 }
                                             }
                                         }
@@ -374,10 +394,12 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        String address = addressReplaceAll(contentBean1.getAddress());
-                        String address2 = addressReplaceAll(addr);
-                        if (isNotEmptyOrBlank(address) && address.equals(address2)) {
-                            return contentBean1;
+                        if (contentBean1.getAddress() != null) {
+                            String address = addressReplaceAll(contentBean1.getAddress());
+                            String address2 = addressReplaceAll(addr);
+                            if (isNotEmptyOrBlank(address) && address.equals(address2)) {
+                                return contentBean1;
+                            }
                         }
                     }
                 } else {

+ 22 - 18
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -137,25 +137,29 @@ public class TransfromDataTool {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        for (int i = 0; i < array.size(); i++) {
-            JSONObject jsonObject = array.getJSONObject(i);
-            AddressResult.ContentBean content = new AddressResult.ContentBean();
-            content.setPname(jsonObject.getString("pname"));
-            content.setCityname(jsonObject.getString("cityname"));
-            content.setAdname(jsonObject.getString("adname"));
-            content.setType(jsonObject.getString("type"));
-            content.setAddress(content.getCityname() + content.getAdname() + jsonObject.getString("address"));
-            content.setName(jsonObject.getString("name"));
-            String[] loc = jsonObject.getString("location").split(",");
-            double[] points = CoordTransform2.getInstance().gcj02_to_wgs84(
-                    Double.valueOf(loc[0]), Double.valueOf(loc[1]));
-            content.setLocation(points[0] + "," + points[1]);
-            content.setLon(points[0]);
-            content.setLat(points[1]);
-            if (result.getData() == null) {
-                result.setData(new ArrayList<>());
+        try {
+            for (int i = 0; i < array.size(); i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                AddressResult.ContentBean content = new AddressResult.ContentBean();
+                content.setPname(jsonObject.getString("pname"));
+                content.setCityname(jsonObject.getString("cityname"));
+                content.setAdname(jsonObject.getString("adname"));
+                content.setType(jsonObject.getString("type"));
+                content.setAddress(content.getCityname() + content.getAdname() + jsonObject.getString("address"));
+                content.setName(jsonObject.getString("name"));
+                String[] loc = jsonObject.getString("location").split(",");
+                double[] points = CoordTransform2.getInstance().gcj02_to_wgs84(
+                        Double.parseDouble(loc[0]), Double.parseDouble(loc[1]));
+                content.setLocation(points[0] + "," + points[1]);
+                content.setLon(points[0]);
+                content.setLat(points[1]);
+                if (result.getData() == null) {
+                    result.setData(new ArrayList<>());
+                }
+                result.getData().add(content);
             }
-            result.getData().add(content);
+        } catch (Exception e) {
+            System.err.println("gdV3ResultToResult err:" + e);
         }
         result.setCode(AddressResultEnum.WDJA_SUCCESS);
 

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

@@ -54,6 +54,10 @@ public class AddressResult {
         private JSONObject wgJson;
         // 微格网信息
         private JSONObject wgwJson;
+        // 行政区划信息
+        private JSONObject adJson;
+        // 街镇信息
+        private JSONObject townJson;
     }
 
 }

+ 24 - 27
src/main/java/com/skyversation/poiaddr/controller/PoiAddressController.java

@@ -4,7 +4,9 @@ import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.entity.FileDataDto;
 import com.skyversation.poiaddr.entity.LegalPerson;
+import com.skyversation.poiaddr.entity.TestData;
 import com.skyversation.poiaddr.service.impl.LegalPersonServiceImpl;
+import com.skyversation.poiaddr.service.impl.TestDataServiceImpl;
 import com.skyversation.poiaddr.util.ExcelReaderUtils;
 import com.skyversation.poiaddr.util.RequestUtils;
 import com.skyversation.poiaddr.util.SerializationUtils;
@@ -40,6 +42,9 @@ public class PoiAddressController {
     @Resource
     private LegalPersonServiceImpl legalPersonServiceimpl;
 
+    @Resource
+    private TestDataServiceImpl testDataService;
+
     //    地址查询
     @GetMapping(value = "/selectAddressInfo/{address}")
     public Object selectAddressInfo(@PathVariable("address") String address) {
@@ -58,7 +63,7 @@ public class PoiAddressController {
 
     /**
      * (开发中)
-     * 定时器:每天都量更新法人库的地名地址数据
+     * 定时器:每天都量更新法人库的地名地址数据
      * 每次分页查询每批次处理1W条数据
      * 1、获取数据库连接
      * 2、查询数据
@@ -68,29 +73,15 @@ public class PoiAddressController {
      */
     @PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
     public Object updateDataBaseData(@RequestParam(name = "pageNum") Integer pageNum, @RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "level") Integer level, @RequestParam(name = "init") Integer init) {
-        if (init == 1) {
-//          恢复初始化
-            Page<LegalPerson> outData = legalPersonServiceimpl.getAllData(pageNum, pageSize);
-            List<LegalPerson> listData = outData.getContent();
-            for (LegalPerson item : listData) {
-                item.setInTheArea(null);
-                item.setTwon(null);
-                item.setResidentialCommittee(null);
-                item.setLat(null);
-                item.setLon(null);
-                item.setResultAddrKey(null);
-                item.setUpdateTime(null);
-            }
-            legalPersonServiceimpl.updateDatas(listData);
-        } else {
-//          批量处理数据
-            if (level == null) {
-                level = 1;
-            }
-            legalPersonServiceimpl.iterativeProcessing(pageNum, pageSize, level);
+        // 记录程序开始时间
+        long startTime = System.currentTimeMillis();
+//      批量处理数据
+        if (level == null) {
+            level = 1;
         }
-        System.out.println("处理完成!");
-        return "成功!";
+        testDataService.iterativeProcessing(pageNum, pageSize, level, init);// 记录程序结束时间
+        long endTime = System.currentTimeMillis();
+        return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
 
     /**
@@ -109,11 +100,10 @@ public class PoiAddressController {
      * *** matchingLevel: 匹配等级,详情见xmind文件【1、2、3、4、5】
      * *** regionalJudgment: 区域判断,geojson、shape文件[前端可以内置一些常用的区域文件,通过下拉框的方式进行选择]
      * <p>
-     * JDK版本要规定为11(已完成)
+     * JDK版本要规定为11(已完成)回退为8(已完成)
      * 需要使用request获取参数,参数校验不能太严格。(通过拦截器的方式也实现了参数乱斗并对必传参数的非空判断以及错误提示)
      * 接口调用要使用oauth认证,添加拦截器验证headers里面的token。(已完成,暂时使用的是121的Oauth系统,用户名:sj_test)
      * 任务开始和结束要操作DMS(开始时间-创建时间,结束时间-修改时间,文件名,任务状态,备注)。根据token调用接口就可以(待测试)
-     * 注意传入的文件可能数据量过大,可能导致保存xlsx或者csv数据丢失,还要注意字段对应是否正确。(待开发测试)
      *
      * @return Object
      */
@@ -252,8 +242,15 @@ public class PoiAddressController {
                 // 为每个元素提交任务
                 for (FileDataDto fileDataDto : fileDataDtoList) {
                     futures.add(executorService.submit(() -> {
-                        if (fileDataDto.getAddr1() != null || fileDataDto.getAddr2() != null) {
-                            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{fileDataDto.getAddr1().isEmpty() ? fileDataDto.getAddr2() : fileDataDto.getAddr1()}, AddressLevel.values()[fileDataDto.getMatchingLevel() - 1]);
+                        List<String> addrList = new ArrayList<>();
+                        if(fileDataDto.getAddr1() != null){
+                            addrList.add(fileDataDto.getAddr1());
+                        }
+                        if(fileDataDto.getAddr2() != null){
+                            addrList.add(fileDataDto.getAddr2());
+                        }
+                        if (addrList.size() > 0) {
+                            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList, AddressLevel.values()[fileDataDto.getMatchingLevel() - 1]);
                             if (addressResult != null) {
                                 if (addressResult.getData() == null || addressResult.getData().size() < 1) {
                                     fileDataDto.getProperties().put("所属街道", null);

+ 130 - 0
src/main/java/com/skyversation/poiaddr/entity/TestData.java

@@ -0,0 +1,130 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-03-13 13:38:37 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="test_data" , schema = "")
+public class TestData  implements Serializable {
+
+	private static final long serialVersionUID =  5402991726683110730L;
+
+	/**
+	 * 主键
+	 */
+	@Id
+   	@Column(name = "id" )
+	private String id;
+
+	/**
+	 * 实口地址
+	 */
+   	@Column(name = "sk_hjdz" )
+	private String skHjdz;
+
+	/**
+	 * 实口居住
+	 */
+   	@Column(name = "sk_jzdz" )
+	private String skJzdz;
+
+	/**
+	 * 基层户籍
+	 */
+   	@Column(name = "jc_hjdz" )
+	private String jcHjdz;
+
+	/**
+	 * 基层居住
+	 */
+   	@Column(name = "jc_jzdz" )
+	private String jcJzdz;
+
+	/**
+	 * 社区云户籍
+	 */
+   	@Column(name = "sqy_hjdz" )
+	private String sqyHjdz;
+
+	/**
+	 * 社区云居住
+	 */
+   	@Column(name = "sqy_jzdz" )
+	private String sqyJzdz;
+
+	/**
+	 * 匹配等级
+	 */
+   	@Column(name = "level" )
+	private String level;
+
+	/**
+	 * 行政区划
+	 */
+   	@Column(name = "administrative_division" )
+	private String administrativeDivision;
+
+	/**
+	 * 城市
+	 */
+   	@Column(name = "market" )
+	private String market;
+
+	/**
+	 * 所属街镇
+	 */
+   	@Column(name = "twon" )
+	private String twon;
+
+	/**
+	 * 经度
+	 */
+   	@Column(name = "lat" )
+	private String lat;
+
+	/**
+	 * 纬度
+	 */
+   	@Column(name = "lon" )
+	private String lon;
+
+	/**
+	 * 是否在松江区
+	 */
+   	@Column(name = "in_the_area" )
+	private String inTheArea;
+
+	/**
+	 * 更新时间
+	 */
+   	@Column(name = "update_time" )
+	private Date updateTime;
+
+	/**
+	 * 查询地址
+	 */
+   	@Column(name = "result_addr_key" )
+	private String resultAddrKey;
+
+	/**
+	 * 规范化地址
+	 */
+   	@Column(name = "standardized_address" )
+	private String standardizedAddress;
+}

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

@@ -65,24 +65,34 @@ public class AreaService {
     public List<GeoJsonBean> cjPolygonList = new ArrayList<>();
     public List<GeoJsonBean> wGridPolygonList = new ArrayList<>();
     public List<GeoJsonBean> gridPolygonList = new ArrayList<>();
+    public List<GeoJsonBean> shAllAdministrativeDivisionPolygonList = new ArrayList<>();
+    public List<GeoJsonBean> shAllToensPolygonList = new ArrayList<>();
 
     @PostConstruct
     public void initGeoData() {
         System.out.println("<<<<<<<<------AreaService>initGeoData------>>>>>>>>>");
         instance = this;
-        Thread thread1 = new Thread(this::runGeoData);
-        Thread thread2 = new Thread(this::runZEWLData);
-        Thread thread3 = new Thread(this::initPolygons);
+        if ("青浦".equals(area)) {
+            Thread thread1 = new Thread(this::runGeoData);
+            Thread thread2 = new Thread(this::runZEWLData);
+            thread1.start();
+            thread2.start();
 
-        // 启动三个线程
-        thread1.start();
-        thread2.start();
+            try {
+                // 等待三个线程执行完毕
+                if ("青浦".equals(area)) {
+                    thread1.join();
+                    thread2.join();
+                }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
+        Thread thread3 = new Thread(this::initPolygons);
         thread3.start();
 
         try {
-            // 等待三个线程执行完毕
-            thread1.join();
-            thread2.join();
             thread3.join();
         } catch (InterruptedException e) {
             e.printStackTrace();
@@ -96,7 +106,9 @@ public class AreaService {
 //      TODO 网络连通性测试,可以请求一下测试的市中心地址
         try {
             System.out.println("<<<<<<<<------开始网络连通性测试");
-            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{"上海市青浦区馨浦苑西区2号楼1201"}, AddressLevel.values()[0]);
+            List<String> addrs = new ArrayList<>();
+            addrs.add("上海市青浦区馨浦苑西区2号楼1201");
+            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs, AddressLevel.values()[0]);
             System.out.println("<<<<<<<<------网络连通性测试结果:" + addressResult);
         } catch (Exception e) {
             System.err.println("<<<<<<<<------网络连通性测试结果:" + e);
@@ -112,11 +124,21 @@ public class AreaService {
 
     public void initPolygons() {
         List<List<GeoJsonBean>> lis = new ArrayList<>();
-        lis.add(cjPolygonList);
-        lis.add(wGridPolygonList);
-        lis.add(gridPolygonList);
-        String[] path = new String[]{"geojson/qp_cunju.geojson", "geojson/青浦区微网格-wgs84.geojson",
-                "geojson/责任网格-wgs84.geojson"};
+        if ("青浦".equals(area)) {
+            lis.add(cjPolygonList);
+            lis.add(wGridPolygonList);
+            lis.add(gridPolygonList);
+        }
+        lis.add(shAllAdministrativeDivisionPolygonList);
+        lis.add(shAllToensPolygonList);
+        String[] path;
+        if ("青浦".equals(area)) {
+            path = new String[]{"geojson/qp_cunju.geojson", "geojson/青浦区微网格-wgs84.geojson",
+                    "geojson/责任网格-wgs84.geojson", "geojson/sh_all_administrative_division.geojson", "geojson/sh_all_towns.geojson"};
+        } else {
+            path = new String[]{"geojson/sh_all_administrative_division.geojson", "geojson/sh_all_towns.geojson"};
+        }
+
 
         for (int j = 0; j < path.length; j++) {
             BufferedReader reader = null;
@@ -172,6 +194,8 @@ public class AreaService {
                         geoJsonBean.setProperties(resultProp);
                     } else if (path[j].contains("责任网格")) {
                         geoJsonBean.setProperties(properties);
+                    } else if (path[j].contains("sh_all")) {
+                        geoJsonBean.setProperties(properties);
                     }
                     geoJsonBean.setMultiPolygon(multiPolygon);
                     lis.get(j).add(geoJsonBean);
@@ -238,6 +262,38 @@ public class AreaService {
         return null;
     }
 
+    public GeoJsonBean isInadPolygon(double lon, double lat) {
+        Geometry point = null;
+        try {
+            point = reader.read("POINT (" + lon + " " + lat + ")");
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        for (GeoJsonBean bean : shAllAdministrativeDivisionPolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
+                return bean;
+            }
+        }
+        return null;
+    }
+
+    public GeoJsonBean isInTownPolygon(double lon, double lat) {
+        Geometry point = null;
+        try {
+            point = reader.read("POINT (" + lon + " " + lat + ")");
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        for (GeoJsonBean bean : shAllToensPolygonList) {
+            if (bean.getMultiPolygon().contains(point)) {
+                return bean;
+            }
+        }
+        return null;
+    }
+
 
     /**
      * 初始化责任网络数据

+ 16 - 0
src/main/java/com/skyversation/poiaddr/service/TestDataRepository.java

@@ -0,0 +1,16 @@
+package com.skyversation.poiaddr.service;
+
+import com.skyversation.poiaddr.entity.TestData;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TestDataRepository extends JpaRepository<TestData,Long> {
+    // 使用原生 SQL 进行模糊查询并分页
+    @Query(value = "SELECT * FROM test_data WHERE address1 LIKE %:keyword%", nativeQuery = true)
+    Page<TestData> findByAddress1Containing(@Param("keyword") String keyword, Pageable pageable);
+}

+ 7 - 2
src/main/java/com/skyversation/poiaddr/service/impl/LegalPersonServiceImpl.java

@@ -22,6 +22,9 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
+/**
+ * 法人库测试查询
+ */
 @Service
 public class LegalPersonServiceImpl {
 
@@ -31,7 +34,7 @@ public class LegalPersonServiceImpl {
     //    查询所有
     @Transactional
     public Page<LegalPerson> getAllData(int page, int size) {
-        Pageable pageable = PageRequest.of(page - 1, size); // 第一页,每页 10 条记录
+        Pageable pageable = PageRequest.of(page - 1, size);
         return legalPersonRepository.findByAddressdb67Cf74Containing(Constant.getArea(), pageable);
     }
 
@@ -60,7 +63,9 @@ public class LegalPersonServiceImpl {
                 if ((!addr.isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(addr))) {
 //                  开始查询(先去除干扰字和行政区划)
                     addr = "上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(addr);
-                    AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{addr}, AddressLevel.values()[level - 1]);
+                    List<String> addrs = new ArrayList<>();
+                    addrs.add(addr);
+                    AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs, AddressLevel.values()[level - 1]);
                     if (addressResult != null) {
                         if (addressResult.getData() == null || addressResult.getData().size() < 1) {
                             item.setInTheArea("异常");

+ 157 - 0
src/main/java/com/skyversation/poiaddr/service/impl/TestDataServiceImpl.java

@@ -0,0 +1,157 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.addquery.Constant;
+import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.entity.TestData;
+import com.skyversation.poiaddr.service.TestDataRepository;
+import com.skyversation.poiaddr.util.ExcelReaderUtils;
+import com.skyversation.poiaddr.util.status.AddressLevel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+@Service
+public class TestDataServiceImpl {
+    @Autowired
+    private TestDataRepository testDataRepository;
+
+    //  分页查询地址表
+    public Page<TestData> getAllDataPage(int page, int size) {
+        Pageable pageable = PageRequest.of(page - 1, size);
+//        return testDataRepository.findByAddress1Containing(Constant.getArea(), pageable);
+        return testDataRepository.findAll(pageable);
+    }
+
+    //   批量修改地址表
+    public List<TestData> updateDatas(List<TestData> testDataList) {
+        return testDataRepository.saveAll(testDataList);
+    }
+
+
+    /**
+     * 首先要得到一个Page<T>对象,然后判断是否还有别的数据,有的话接着请求并返回新的Page<T>对象并迭代处理数据
+     */
+    public void iterativeProcessing(Integer pageNum, Integer pageSize, Integer level, Integer init) {
+        System.out.println("<<<<<<<<------iterativeProcessing{pageNum:" + pageNum + ",pageSize:" + pageSize + "}");
+        Page<TestData> outData = getAllDataPage(pageNum, pageSize);
+        List<TestData> listData = outData.getContent();
+        // 创建线程池
+        int threadCount = Runtime.getRuntime().availableProcessors();
+        ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
+        List<Future<?>> futures = new ArrayList<>();
+        for (TestData item : listData) {
+            futures.add(executorService.submit(() -> {
+                if (init == 1) {
+                    item.setInTheArea(null);
+                    item.setTwon(null);
+                    item.setLevel(null);
+                    item.setAdministrativeDivision(null);
+                    item.setLat(null);
+                    item.setLon(null);
+                    item.setResultAddrKey(null);
+                    item.setUpdateTime(null);
+                } else {
+                    List<String> addrList = new ArrayList<>();
+                    if (item.getSkHjdz() != null && !item.getSkHjdz().isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(item.getSkHjdz())) {
+//                      实口户籍地址
+                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getSkHjdz()));
+                    }
+                    if (item.getSkJzdz() != null && !item.getSkJzdz().isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(item.getSkJzdz())) {
+//                      实口居住地址
+                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getSkJzdz()));
+                    }
+                    if (item.getJcHjdz() != null && !item.getJcHjdz().isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(item.getJcHjdz())) {
+//                      基层户籍地址
+                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getJcHjdz()));
+                    }
+                    if (item.getJcJzdz() != null && !item.getJcJzdz().isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(item.getJcJzdz())) {
+//                      基层居住地址
+                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getJcJzdz()));
+                    }
+//                  判断地址是否属于松江区
+                    if (addrList.size() > 0) {
+//                      开始查询
+                        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList, AddressLevel.values()[level - 1]);
+                        if (addressResult != null) {
+                            if (addressResult.getData() == null || addressResult.getData().size() < 1) {
+                                item.setInTheArea("异常");
+                                item.setResultAddrKey("未匹配到符合规则的结果!");
+                            } else {
+                                try {
+                                    for (AddressResult.ContentBean contentBean : addressResult.getData()) {
+                                        String resultAddrKey = contentBean.getAddress();
+                                        if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null && ExcelReaderUtils.isOtherDistrictThanSongJiang(resultAddrKey)) {
+                                            String lng = contentBean.getLat() + "";
+                                            String lat = contentBean.getLon() + "";
+                                            item.setInTheArea("是");
+                                            if (contentBean.getAdJson() != null) {
+                                                if (contentBean.getAdJson().getString("name") != null) {
+                                                    item.setAdministrativeDivision(contentBean.getAdJson().getString("name"));
+                                                }
+                                            }
+                                            if (contentBean.getTownJson() != null) {
+                                                if (contentBean.getTownJson().getString("name") != null) {
+                                                    item.setTwon(contentBean.getTownJson().getString("name"));
+                                                }
+                                            }
+
+                                            item.setLat(lat);
+                                            item.setLon(lng);
+                                            item.setResultAddrKey(resultAddrKey);
+                                            break;
+                                        } else {
+                                            item.setInTheArea("异常");
+                                            item.setResultAddrKey("未查询到符合条件的结果!");
+                                        }
+                                    }
+                                } catch (Exception e) {
+                                    item.setInTheArea("异常");
+                                    System.err.println("查询结果处理异常:" + e);
+                                }
+                            }
+                        } else {
+                            item.setInTheArea("异常");
+                            item.setResultAddrKey("未查询到符合条件的结果!");
+                        }
+                    } else {
+//                  更新时间,添加是否松江判断字段为否
+                        item.setInTheArea("否");
+                    }
+                    item.setUpdateTime(new Date());
+                    item.setLevel(level.toString());
+                }
+            }));
+        }
+
+        // 等待所有任务完成
+        for (Future<?> future : futures) {
+            try {
+                if (future != null) {
+                    future.get();
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                System.err.println("线程异常:" + e);
+            }
+        }
+        // 关闭线程池
+        executorService.shutdown();
+        updateDatas(listData);
+//      多线程处理完成后,判断是否有其他分页并迭代
+        if ((long) pageNum * pageSize < outData.getTotalElements()) {
+            iterativeProcessing(pageNum + 1, pageSize, level, init);
+        } else {
+            System.out.println("<<<<<<<<------任务处理完成!");
+        }
+    }
+}

+ 3 - 4
src/main/java/com/skyversation/poiaddr/util/net/AddressNetTools.java

@@ -45,11 +45,10 @@ public class AddressNetTools {
     @Async
     public ResponseEntity requestGet(String url, MultiValueMap<String, String> params, Map<String, String> headerMap) {
         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
-        requestFactory.setConnectTimeout(3 * 1000);
-        requestFactory.setReadTimeout(3 * 1000);
+        requestFactory.setConnectTimeout(5 * 1000);
+        requestFactory.setReadTimeout(5 * 1000);
         RestTemplate client = new RestTemplate(requestFactory);
         client.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
-
         HttpHeaders headers = new HttpHeaders();
         //请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
@@ -65,7 +64,7 @@ public class AddressNetTools {
         try {
             response = client.exchange(url, HttpMethod.GET, requestEntity, String.class);
         } catch (Exception e) {
-            e.toString();
+            System.err.println("requestGet err:" + e);
         }
 
         return response;

+ 14 - 1
src/main/resources/application.properties

@@ -3,11 +3,24 @@ server.servlet.context-path=/poiApi/
 spring.application.name=poiAddr
 spring.servlet.multipart.max-file-size=300MB
 spring.servlet.multipart.max-request-size=300MB
+# \u6570\u636E\u5E93\u914D\u7F6E\uFF08\u672C\u5730\u8C03\u8BD5\u73AF\u5883\uFF09
 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/songjiang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
 spring.datasource.username=root
 spring.datasource.password=root
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-# JPA
+# \u6570\u636E\u5E93\u8FDE\u63A5\u4FE1\u606F\uFF08\u5F00\u53D1\u73AF\u5883\uFF09
+#spring.datasource.url=jdbc:transwarp2://172.30.75.126:31768/dws
+#spring.datasource.username=dev_sjbdc_kjyy
+#spring.datasource.password=30DFBEABYi#5
+#spring.datasource.driver-class-name=io.transwarp.jdbc.QuarkDriver
+# \u6570\u636E\u5E93\u8FDE\u63A5\u4FE1\u606F\uFF08\u751F\u4EA7\u73AF\u5883\uFF09
+#spring.datasource.url=jdbc:argoDb://172.30.75.126:31768/dws
+#spring.datasource.username=prd_sjbdc_kjyy
+#spring.datasource.password=B9344157Yi#5
+#spring.datasource.driver-class-name=com.argoDb.jdbc.Driver
+
+# JPA \u914D\u7F6E
+#spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
 spring.jpa.hibernate.ddl-auto=update
 spring.jpa.show-sql=false
 # \u677E\u6C5F\u8857\u9547

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
src/main/resources/geojson/sh_all_administrative_division.geojson


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 5 - 0
src/main/resources/geojson/sh_all_towns.geojson


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác