Переглянути джерело

添加接口(手动添加回流地址、数据清洗、手动更新是否检查结果经纬度状态(默认关闭)),添加逻辑:当用户查询完地址要输出的时候,也会验证经纬度是否正确。

DESKTOP-6LTVLN7\Liumouren 1 місяць тому
батько
коміт
09ef1f30ad

+ 2 - 3
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -8,6 +8,7 @@ import com.skyversation.poiaddr.bean.YyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.entity.AddrBean;
 import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.util.AddrSplitLmrMap;
+import com.skyversation.poiaddr.util.AddressTools;
 import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
 import com.skyversation.poiaddr.util.net.AddressNetTools;
@@ -128,7 +129,7 @@ public class AddressQueryEngine {
                     addressResult.setCode(AddressResultEnum.DB_SUCCESS);
                     addressResult.setMessage("成功");
                     for (AddressResult.ContentBean content : addressResult.getData()) {
-                        //                  地址库中可能存在外地脏数据
+                        //                  地址库中可能存在外地脏数据(后来发现可能经纬度也有点不准)
                         if (content.getCityname() != null && content.getAdname() != null) {
                             addrBean.setPname(content.getPname());
                             addrBean.setCityname(content.getCityname());
@@ -141,8 +142,6 @@ public class AddressQueryEngine {
                     }
                     return addressResult;
                 }
-            }else{
-//              开始互联网请求并自动入库和加入缓存
             }
         }
         addressResult.setMessage("失败");

+ 71 - 2
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -36,6 +36,71 @@ public class CorporateLibraryController {
     @Resource
     private YyskAddressStandardizationServiceImpl yyskAddressStandardizationService;
 
+    //  手动添加回流地址
+    @RequestMapping(value = "/addCallBackAddress")
+    public String addCallBackAddress(HttpServletRequest request) {
+        String address = request.getParameter("address");
+        if (!StringUtils.hasText(address)) {
+            return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
+        }
+        AreaService.getInstance().callBackErrorAddr(address);
+        return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "地址" + address + "写入回流表", "成功");
+    }
+
+    //  手动更新是否检查结果经纬度状态
+    @RequestMapping(value = "/changeIfOpenLonLatStatus")
+    public String changeIfOpenLonLatStatus(HttpServletRequest request) {
+        String status = request.getParameter("status");
+        if (status.contains("true")) {
+            ScheduledTasks.ifOpenLonLatStatus = true;
+        } else {
+            ScheduledTasks.ifOpenLonLatStatus = false;
+        }
+        return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "状态已更新为:" + ScheduledTasks.ifOpenLonLatStatus, "成功");
+    }
+
+    /**
+     * 数据清洗:
+     * 首先遍历缓存中的所有地址,然后得到经纬度,如果经纬度得到的区划和街镇和字段中的区划和街镇不一致或者和地址中的区划和街镇(优先以地址中的区划和街镇为准)不一致,先修改数据库中对应的数据状态
+     *
+     * @return
+     */
+    @RequestMapping(value = "/dmdzAddressClear")
+    public String dmdzAddressClear() {
+        long sum = 0L;
+        for (String addressStr : ScheduledTasks.allDmdzData.keySet()) {
+            List<YyskDmdzAddressStandardization> updateDatas = new ArrayList<>();
+            List<YyskDmdzAddressStandardization> yyskDmdzAddressStandardizations = ScheduledTasks.allDmdzData.get(addressStr);
+            for (YyskDmdzAddressStandardization item : yyskDmdzAddressStandardizations) {
+                String address = item.getSourceaddress();
+                SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(address);
+                try {
+                    String xzqh = StringUtils.hasText(splitAddress.getCity()) ? splitAddress.getCity() : item.getCounty();
+                    String town = StringUtils.hasText(splitAddress.getStreet()) ? splitAddress.getStreet() : item.getTown();
+//                  得到经纬度,落点判断是否是这个区划和街道,不属于的话
+                    Float lon = item.getLon();
+                    Float lat = item.getLat();
+                    Double lonDb = Double.parseDouble(lon.toString());
+                    Double latDb = Double.parseDouble(lat.toString());
+                    GeoJsonBean cjBean = AreaService.getInstance().isInResidentialCommitteePolygon(lonDb, latDb);
+                    if (cjBean != null && cjBean.getProperties() != null && (!cjBean.getProperties().getString("所属区").contains(xzqh) || !cjBean.getProperties().getString("所属街").contains(town))) {
+                        item.setType("zl_lonLatErr");
+                        sum++;
+                        updateDatas.add(item);
+                        AreaService.getInstance().callBackErrorAddr(item.getSourceaddress());
+                    }
+                } catch (Exception e) {
+                    continue;
+                }
+            }
+            if (updateDatas.size() > 0) {
+//              更新数据
+                AreaService.getInstance().updateYyszAddressRepository(updateDatas);
+            }
+        }
+        return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "清洗了经纬度错误的地址" + sum + "条", "成功");
+    }
+
     //    地址查询
     @RequestMapping(value = "/searchByName")
     public String searchByName(HttpServletRequest request) {
@@ -46,7 +111,7 @@ public class CorporateLibraryController {
 //      数据库查询
         SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(address);
         String district = request.getParameter("district");
-        if(StringUtils.hasText(district)){
+        if (StringUtils.hasText(district)) {
             splitAddress.setDistrict(district);
         }
         List<YyskDmdzAddressStandardization> list = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress);
@@ -101,7 +166,11 @@ public class CorporateLibraryController {
             return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
         }
         AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(address);
-        if (addressResult == null || addressResult.getData() == null || addressResult.getData().get(0) == null) {
+        if (addressResult == null && addressResult.getData() == null && addressResult.getData().get(0) == null) {
+//          TODO 添加逻辑,数据相对有效性判断,默认关闭
+            if (ScheduledTasks.ifOpenLonLatStatus) {
+                AddressTools.ifTrueAddressByBeans(addressResult.getData().get(0));
+            }
             AreaService.getInstance().callBackErrorAddr(address);
             return MessageManage.getInstance().getResultContent(Constant.NO_DATA, "无数据", "无数据");
         } else {

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

@@ -109,7 +109,10 @@ public class AreaService {
             List<TAddressCallback> tAddressCallbacks = tAddressCallbackRepository.findAll();
             if (tAddressCallbacks.size() > 0) {
                 for (TAddressCallback tAddressCallback : tAddressCallbacks) {
-                    ScheduledTasks.callBackAllErrorAddrs.add(tAddressCallback.getSearchAddress());
+//                  添加缓存逻辑,如果状态为2,也放到缓存
+                    if (tAddressCallback.getStatusTag() == null || tAddressCallback.getStatusTag() != 2) {
+                        ScheduledTasks.callBackAllErrorAddrs.add(tAddressCallback.getSearchAddress());
+                    }
                 }
             }
             long endTime = System.currentTimeMillis();
@@ -206,6 +209,16 @@ public class AreaService {
         }
     }
 
+    /**
+     * 更新或保存标准地址库数据
+     *
+     * @param datas
+     */
+    @Transactional(readOnly = true)
+    public void updateYyszAddressRepository(List<YyskDmdzAddressStandardization> datas) {
+        yyszAddressRepository.saveAll(datas);
+    }
+
     /**
      * -- 第二部分:将匹配数据写入治理回匹表
      * INSERT INTO TABLE 治理回匹表
@@ -324,7 +337,7 @@ public class AreaService {
         String addr = splitAddress.getAddr();
         String addr2 = addr + "";
         AddrBean lmrAddrBean = AddrSplitLmrMap.outAddrMapInAddr(addr2);
-        if(lmrAddrBean.getAddress() != null){
+        if (lmrAddrBean.getAddress() != null) {
             addr2 = lmrAddrBean.getAddress();
         }
         Map<String, String> roadInfos = AddrSplitLmrMap.parseAddress(addr2);

+ 30 - 0
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.service.AreaService;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 import java.util.regex.Matcher;
@@ -900,6 +902,34 @@ public class AddressTools {
         return resultArray;
     }
 
+    /**
+     * 地址是否有限判断条件,有效的话返回true
+     *
+     * @return
+     */
+    public static void ifTrueAddressByBeans(AddressResult.ContentBean bean) {
+//      结果列表是否存在相对有效地址
+        SplitAddress splitAddress1 = ShanghaiAddressSplitUtil.splitBestAddress(bean.getSearchAddress());
+        SplitAddress splitAddress2 = ShanghaiAddressSplitUtil.splitBestAddress(bean.getStandAddr());
+        SplitAddress splitAddress3 = ShanghaiAddressSplitUtil.splitBestAddress(bean.getAddress());
+//      验证行政区划是否一致(也许是错误的输入地址呢?不过概率很小,不强制)
+        if (StringUtils.hasText(splitAddress1.getDistrict()) && StringUtils.hasText(splitAddress2.getDistrict()) && !splitAddress1.getDistrict().contains(splitAddress2.getDistrict())) {
+            AreaService.getInstance().callBackErrorAddr(bean.getSearchAddress());
+        }
+//      验证街镇是否一致(这个很关键,如果用户输入的是正确的地址,但是搜索完地址导致街镇不对,就需要注意了:是不是数据库中的这个路的数据量太少导致强行匹配了别的镇的数据,或者数据库里面的定位就不准)
+        if (StringUtils.hasText(splitAddress1.getStreet()) && StringUtils.hasText(splitAddress2.getStreet()) && !splitAddress1.getStreet().contains(splitAddress2.getStreet())) {
+            AreaService.getInstance().callBackErrorAddr(bean.getSearchAddress());
+        }
+//      验证路牌号是否一致(加上了这个判断大概率会导致很多地址回流)
+        Map<String, String> roomInfo1 = AddrSplitLmrMap.parseAddress(splitAddress1.getAddr());
+        Map<String, String> roomInfo2 = AddrSplitLmrMap.parseAddress(splitAddress3.getAddr());
+        if (roomInfo1 != null && roomInfo2 != null) {
+            if (!roomInfo1.get("弄号").contains(roomInfo2.get("弄号"))) {
+                AreaService.getInstance().callBackErrorAddr(bean.getSearchAddress());
+            }
+        }
+    }
+
     public static void sortByTotalScoreDescending(JSONArray array) {
         // 将 JSONArray 转换为 List<JSONObject>
         List<JSONObject> list = new ArrayList<>();

+ 5 - 0
src/main/java/com/skyversation/poiaddr/util/tasks/ScheduledTasks.java

@@ -37,6 +37,11 @@ public class ScheduledTasks {
      */
     public static boolean taskServiceErr = false;
 
+    /**
+     * 是否打开经纬度判断
+     */
+    public static boolean ifOpenLonLatStatus = false;
+
     /**
      * 本地数据分页页码记录
      */