瀏覽代碼

需求又变了,日了狗了

DESKTOP-6LTVLN7\Liumouren 5 天之前
父節點
當前提交
e3f3f08bc8

+ 128 - 6
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -207,9 +207,84 @@ public class AddressQueryEngine {
                             addrBean.setPname(content.getPname());
                             addrBean.setCityname(content.getCityname());
                             addrBean.setAdname(content.getAdname());
-                            addrBean.setAdname2(content.getAdname());
+                            addrBean.setAdname_sl(content.getAdname());
+                            addrBean.setCommunity(content.getCommunity());
+                            addrBean.setCommunity_sl(content.getCommunity_sl());
+                            addrBean.setStandAddr(content.getStandAddr());
+                            addressResult.setAddrBean(addrBean);
+                            break;
+                        }
+                    }
+                    return addressResult;
+                }
+            }
+        }
+        addressResult.setMessage("失败");
+        return addressResult;
+    }
+
+
+
+    /***
+     * 返回两个居委的方法
+     * @param addr
+     * @return
+     */
+    public AddressResult commonSearchByName_nwV3(String addr, int sl) {
+        AddressResult addressResult = new AddressResult();
+        if (!StringUtils.hasText(addr) || addr.length() < 3) {
+            addressResult.setMessage("非地址数据");
+            return addressResult;
+        }
+        AddrBean lmrAddrBean = AddrSplitLmrMap.outAddrMapInAddr(addr);
+        if (lmrAddrBean.getRule() != null && Integer.parseInt(lmrAddrBean.getRule()) <= 0 && !addr.contains("新城区")) {
+            addressResult.setMessage("非上海数据");
+            AddressResult.ContentBean content = new AddressResult.ContentBean();
+            content.setSearchAddress(addr);
+            content.setPname(lmrAddrBean.getProvinces());
+            content.setCityname(lmrAddrBean.getMarket());
+            content.setAdname(lmrAddrBean.getStreetTown());
+            content.setCommunity(lmrAddrBean.getResidentialCommittee());
+            content.setScore("rule_0");
+            addressResult.setData(new ArrayList<>());
+            addressResult.getData().add(content);
+            return addressResult;
+        }
+        SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
+        if (splitAddress.getStatus() == 3 && !addr.contains("新城区")) {// 不是地址
+            addressResult.setMessage("非地址数据");
+            return addressResult;
+        } else {
+            AddressResult.ContentBean addrBean = new AddressResult.ContentBean();
+            addrBean.setSearchAddress(addr);
+            addrBean.setPname(splitAddress.getProvince());
+            addrBean.setCityname(splitAddress.getCity());
+            addrBean.setDistance(splitAddress.getDistrict());
+            addrBean.setAdname(splitAddress.getStreet());
+            addrBean.setCommunity(splitAddress.getCommunity());
+            addrBean.setStandAddr(splitAddress.getCity() + splitAddress.getDistrict() + splitAddress.getStreet()
+                    + splitAddress.getCommunity() + splitAddress.getAddr());
+            addressResult.setAddrBean(addrBean);
+
+            // 优先进行数据库查询
+            List<YyskDmdzAddressStandardization> dbPois = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress, sl);
+            if (dbPois != null && dbPois.size() > 0) {
+                JSONArray pois = new JSONArray();
+                pois.addAll(dbPois);
+                SplitAddress splitAddress1 = ShanghaiAddressSplitUtil.splitBestAddress(addr);
+//              打分排序
+                addressResult = new TransfromDataTool().dbResultToResult(splitAddress1, addr, pois);
+                if (addressResult.getData() != null && addressResult.getData().size() > 0) {
+                    getCjWgWgwByLocV3(addressResult, splitAddress);
+                    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());
+                            addrBean.setAdname(content.getAdname());
                             addrBean.setCommunity(content.getCommunity());
-                            addrBean.setCommunity2(content.getCommunity2());
                             addrBean.setStandAddr(content.getStandAddr());
                             addressResult.setAddrBean(addrBean);
                             break;
@@ -421,14 +496,61 @@ public class AddressQueryEngine {
                         content.setPname("上海市");
                         content.setCityname(cjBean.getProperties().getString("所属区"));
                         content.setAdname(cjBean.getProperties().getString("所属街"));
-                        content.setCommunityCode(cjBean.getProperties().getString("居委会"));
                         content.setCommunity(cjBean.getProperties().getString("居委_1"));
                     }
 
-                    GeoJsonBean cjBean2 = areaService.isInResidentialCommitteePolygonV2(content.getLon(), content.getLat());
+                    GeoJsonBean cjBean2 = areaService.isInResidentialCommitteePolygonSl(content.getLon(), content.getLat());
                     if (cjBean2 != null && cjBean2.getProperties() != null) {
-                        content.setAdname2(cjBean2.getProperties().getString("所属街"));
-                        content.setCommunity2(cjBean2.getProperties().getString("居委_1"));
+                        content.setAdname_sl(cjBean2.getProperties().getString("所属街"));
+                        content.setCommunity_sl(cjBean2.getProperties().getString("居委_1"));
+                        content.setCommunityCode(cjBean.getProperties().getString("居委会"));
+                    }
+                    content.setStandAddr(content.getPname() + content.getCityname() + content.getAdname() + splitAddress.getAddr());
+                } else {
+                    System.err.println("没有经纬度参数,不能根据经纬度落点补充街镇等信息!");
+                }
+//              TODO 添加逻辑(路名等信息返回)
+                try {
+                    Map<String, String> roomInfo = AddrSplitLmrMap.parseAddress(splitAddress.getAddr());
+                    if (roomInfo != null) {
+                        content.setRoadName(roomInfo.get("路名"));
+                        content.setBuildingNumber(roomInfo.get("弄号"));
+                        content.setLaneNumber(roomInfo.get("楼栋号"));
+                        content.setRoomNumber(roomInfo.get("室号"));
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    System.err.println("getCjWgWgwByLoc方法获取路名室号等信息处理逻辑异常" + e);
+                }
+//              TODO 添加逻辑,(什么都有就是没有居委编码的话,要补全居委编码)
+                if (StringUtils.hasText(content.getCityname()) && StringUtils.hasText(content.getCommunity()) && StringUtils.hasText(content.getAdname()) && !StringUtils.hasText(content.getCommunityCode())) {
+                    content.setCommunityCode(AddrSplitLmrMap.outCommunityCodeByInfo(content.getCityname(), content.getAdname(), content.getCommunity()));
+                }
+            }
+            return result;
+        }
+    }
+
+
+    /***
+     * 根据搜索地址,赋值村居、网格、微格网信息
+     * @param result
+     * @return
+     */
+    public AddressResult getCjWgWgwByLocV3(AddressResult result, SplitAddress splitAddress) {
+        if (result == null || result.getData() == null || result.getData().size() < 1) {
+            return result;
+        } else {
+            AreaService areaService = AreaService.getInstance();
+            for (AddressResult.ContentBean content : result.getData()) {
+                if (content.getLat() != null && content.getLon() != null) {
+//                  判断是否存在村居数据
+                    GeoJsonBean cjBean = areaService.isInResidentialCommitteePolygon(content.getLon(), content.getLat());
+                    if (cjBean != null && cjBean.getProperties() != null) {
+                        content.setPname("上海市");
+                        content.setCityname(cjBean.getProperties().getString("所属区"));
+                        content.setAdname(cjBean.getProperties().getString("所属街"));
+                        content.setCommunity(cjBean.getProperties().getString("居委_1"));
                     }
                     content.setStandAddr(content.getPname() + content.getCityname() + content.getAdname() + splitAddress.getAddr());
                 } else {

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

@@ -35,10 +35,10 @@ public class AddressResult {
         private String adnameCode;
         // 居委
         private String community;
-        // 街镇名称
-        private String adname2;
-        // 居委
-        private String community2;
+        // 街镇名称(四中心geojson)
+        private String adname_sl;
+        // 居委(四中心geojson)
+        private String community_sl;
         // 居委编码
         private String communityCode;
         // 结果类型

+ 22 - 4
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -262,10 +262,28 @@ public class CorporateLibraryController {
             AreaService.getInstance().callBackErrorAddr(address);
             return MessageManage.getInstance().getResultContent(Constant.NO_DATA, "无数据", "无数据");
         } else {
-//          TODO 添加逻辑,数据相对有效性判断,默认关闭
-            if (ScheduledTasks.ifOpenLonLatStatus) {
-                AddressTools.ifTrueAddressByBeans(addressResult.getData().get(0));
-            }
+            return MessageManage.getInstance().getResultContent(Constant.SUCCESS, addressResult.getData().get(0), "成功");
+        }
+    }
+
+
+    /**
+     * 只返回四中心的居委,都要也就是等级1
+     *
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "/searchByNameOnly3")
+    public String searchByNameOnly3(HttpServletRequest request) {
+        String address = request.getParameter("address");
+        if (!StringUtils.hasText(address)) {
+            return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
+        }
+        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nwV3(address, 1);
+        if (addressResult == null || addressResult.getData() == null || addressResult.getData().get(0) == null) {
+            AreaService.getInstance().callBackErrorAddr(address);
+            return MessageManage.getInstance().getResultContent(Constant.NO_DATA, "无数据", "无数据");
+        } else {
             return MessageManage.getInstance().getResultContent(Constant.SUCCESS, addressResult.getData().get(0), "成功");
         }
     }

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

@@ -80,7 +80,7 @@ public class AreaService {
     public List<GeoJsonBean> shAllAdministrativeDivisionPolygonList = new ArrayList<>();
     public List<GeoJsonBean> shAllToensPolygonList = new ArrayList<>();
     public List<GeoJsonBean> shAllResidentialCommitteeList = new ArrayList<>();
-    public List<GeoJsonBean> shAllResidentialCommitteeList2 = new ArrayList<>();
+    public List<GeoJsonBean> shAllResidentialCommitteeListSL = new ArrayList<>();
     public List<GeoJsonBean> wgPolygonList = new ArrayList<>();
     public List<GeoJsonBean> wgwPolygonList = new ArrayList<>();
     public List<GeoJsonBean> zhwgPolygonList = new ArrayList<>();
@@ -262,11 +262,11 @@ public class AreaService {
         lis.add(shAllAdministrativeDivisionPolygonList);
         lis.add(shAllToensPolygonList);
         lis.add(shAllResidentialCommitteeList);
-        lis.add(shAllResidentialCommitteeList2);
+        lis.add(shAllResidentialCommitteeListSL);
         lis.add(wgPolygonList);
         lis.add(wgwPolygonList);
         lis.add(zhwgPolygonList);
-        String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界.geojson", "geojson/上海市_村居边界v2.geojson", "geojson/责任网格-wgs84.geojson", "geojson/青浦区微网格-wgs84.geojson", "geojson/青浦区综合网格.geojson"};
+        String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界szx.geojson", "geojson/上海市_村居边界sl.geojson", "geojson/责任网格-wgs84.geojson", "geojson/青浦区微网格-wgs84.geojson", "geojson/青浦区综合网格.geojson"};
 
         for (int j = 0; j < path.length; j++) {
             BufferedReader reader = null;
@@ -499,6 +499,8 @@ public class AreaService {
 //                      TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
                         if (key != null && key.contains(roadInfos.get("路名")) && returnDatas.size() < maxDataNum) {
                             returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                        } else if (returnDatas.size() >= maxDataNum) {
+                            return returnDatas;
                         }
                     }
                 }
@@ -516,21 +518,15 @@ public class AreaService {
 //                      TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
                         if (key != null && key.contains(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "")) && returnDatas.size() < maxDataNum) {
                             returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                        } else if (returnDatas.size() >= maxDataNum) {
+                            return returnDatas;
                         }
                     }
                 }
             } else {
                 if (ScheduledTasks.allDmdzData.containsKey(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : ""))) {
                     returnDatas.addAll(ScheduledTasks.allDmdzData.get(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "")));
-                }
-
-                if (returnDatas.size() < maxDataNum) {
-                    for (String key : ScheduledTasks.allDmdzData.keySet()) {
-//                      TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
-                        if (key != null && key.contains(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "")) && returnDatas.size() < maxDataNum) {
-                            returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
-                        }
-                    }
+                    return returnDatas;
                 }
             }
         } else {
@@ -538,6 +534,8 @@ public class AreaService {
 //              TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
                 if (key != null && key.contains(addr2) && returnDatas.size() < maxDataNum) {
                     returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                } else if (returnDatas.size() >= maxDataNum) {
+                    return returnDatas;
                 }
             }
         }
@@ -686,10 +684,10 @@ public class AreaService {
     }
 
 
-    public GeoJsonBean isInResidentialCommitteePolygonV2(double lon, double lat) {
+    public GeoJsonBean isInResidentialCommitteePolygonSl(double lon, double lat) {
         try {
             Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
-            for (GeoJsonBean bean : shAllResidentialCommitteeList2) {
+            for (GeoJsonBean bean : shAllResidentialCommitteeListSL) {
                 if (bean.getMultiPolygon().contains(point)) {
                     return bean;
                 }

+ 9 - 7
src/main/java/com/skyversation/poiaddr/util/tasks/ScheduledTasks.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import javax.transaction.Transactional;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -106,10 +107,10 @@ public class ScheduledTasks {
 
 
     /**
-     * 每10秒验证一次,是否已经缓存了1000条异常地址
+     * 每30秒验证一次,是否已经缓存了1000条异常地址
      * 是的话直接入库
      */
-    @Scheduled(cron = "*/10 * * * * *")
+    @Scheduled(cron = "*/30 * * * * *")
     public void setCallBackAddrs() {
         if (callBackDatas.size() >= 1000) {
             AreaService.getInstance().callBackAddrs();
@@ -146,7 +147,7 @@ public class ScheduledTasks {
 //              首先查询数据列表
                 callBackRunStatus = 1;
                 List<TAddressCallback> tAddressCallbacks = AreaService.getInstance().getCallbackDataByTag();
-                infoItem.put("用时(秒)", (System.currentTimeMillis() - startTime) / 1000);
+                infoItem.put("用时(秒)", System.currentTimeMillis() - startTime);
                 infoItem.put("备注", "数据条数" + tAddressCallbacks.size());
                 List<TAddressCallback> updateCallBackDatas = new ArrayList<>();
                 List<YyskDmdzAddressStandardization> addDmdzDataList = new ArrayList<>();
@@ -172,7 +173,7 @@ public class ScheduledTasks {
                                 if (addressResult != null && contentBean != null && contentBean.getLon() != null) {
                                     SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
 //                                  TODO 因为市中心返回的居委部分是错误的,所以,都要进行一下落点才能入库
-                                    if(addressResult != null){
+                                    if (addressResult != null) {
                                         for (AddressResult.ContentBean content : addressResult.getData()) {
                                             content.setCommunity(null);
                                             content.setCommunityCode(null);
@@ -221,7 +222,7 @@ public class ScheduledTasks {
                             updateCallBackDatas.clear();
                             long outBaseTime = System.currentTimeMillis();
                             infoItem3.put("结束时间", outBaseTime);
-                            infoItem3.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) / 1000 + "秒!");
+                            infoItem3.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) + "秒!");
                             ScheduledTasks.logInfos.add(infoItem3);
                             ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
                         }
@@ -239,8 +240,8 @@ public class ScheduledTasks {
                     AreaService.getInstance().updateCallbackData(updateCallBackDatas);
                     updateCallBackDatas.clear();
                     long outBaseTime = System.currentTimeMillis();
-                    infoItem.put("用时(秒)", (outBaseTime - inBaseTime) / 1000);
-                    infoItem.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) / 1000 + "秒!");
+                    infoItem.put("用时(秒)", (outBaseTime - inBaseTime));
+                    infoItem.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) + "秒!");
                     ScheduledTasks.logInfos.add(infoItem);
                     ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
                 }
@@ -253,6 +254,7 @@ public class ScheduledTasks {
             e.printStackTrace();
         } finally {
             System.out.println("loginfos:" + ScheduledTasks.logInfos);
+            callBackRunStatus = 0;
             try {
                 ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
             } catch (Exception e2) {

+ 0 - 0
src/main/resources/geojson/上海市_村居边界v2.geojson → src/main/resources/geojson/上海市_村居边界sl.geojson


+ 0 - 0
src/main/resources/geojson/上海市_村居边界.geojson → src/main/resources/geojson/上海市_村居边界szx.geojson