Bladeren bron

修改初始化Map逻辑,每个路名、弄号和楼栋号大小不设限制。
添加两套geojson和接口。
添加接口实时修改地址库和缓存数据。
调整打分和返回列表大小逻辑,打分更加精准、返回列表限制最多10条,避免大量低评分地址占用系统资源。
搜索结果逻辑增强,当允许优先返回精确地址,其次模糊地址,并按照打分从高到低排序。

DESKTOP-6LTVLN7\Liumouren 1 week geleden
bovenliggende
commit
b90b0354c3

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

@@ -79,7 +79,7 @@ public class AddressQueryEngine {
      * @param addr
      * @return
      */
-    public AddressResult commonSearchByName_nw(String addr,int sl) {
+    public AddressResult commonSearchByName_nw(String addr, int sl) {
         AddressResult addressResult = new AddressResult();
         if (!StringUtils.hasText(addr) || addr.length() < 3) {
             addressResult.setMessage("非地址数据");
@@ -116,7 +116,7 @@ public class AddressQueryEngine {
             addressResult.setAddrBean(addrBean);
 
             // 优先进行数据库查询
-            List<YyskDmdzAddressStandardization> dbPois = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress,sl);
+            List<YyskDmdzAddressStandardization> dbPois = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress, sl);
             if (dbPois != null && dbPois.size() > 0) {
                 JSONArray pois = new JSONArray();
                 pois.addAll(dbPois);
@@ -147,6 +147,82 @@ public class AddressQueryEngine {
         return addressResult;
     }
 
+
+    /***
+     * 返回两个居委的方法
+     * @param addr
+     * @return
+     */
+    public AddressResult commonSearchByName_nwV2(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) {
+                    getCjWgWgwByLocV2(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.setAdname2(content.getAdname());
+                            addrBean.setCommunity(content.getCommunity());
+                            addrBean.setCommunity2(content.getCommunity2());
+                            addrBean.setStandAddr(content.getStandAddr());
+                            addressResult.setAddrBean(addrBean);
+                            break;
+                        }
+                    }
+                    return addressResult;
+                }
+            }
+        }
+        addressResult.setMessage("失败");
+        return addressResult;
+    }
+
     public static Map<String, String> initSigns() {
         Map<String, String> headerMap = new HashMap<>();
         String timestamp = System.currentTimeMillis() + "";
@@ -327,6 +403,60 @@ public class AddressQueryEngine {
     }
 
 
+    /***
+     * 根据搜索地址,赋值村居、网格、微格网信息
+     * @param result
+     * @return
+     */
+    public AddressResult getCjWgWgwByLocV2(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.setCommunityCode(cjBean.getProperties().getString("居委会"));
+                        content.setCommunity(cjBean.getProperties().getString("居委_1"));
+                    }
+
+                    GeoJsonBean cjBean2 = areaService.isInResidentialCommitteePolygonV2(content.getLon(), content.getLat());
+                    if (cjBean2 != null && cjBean2.getProperties() != null) {
+                        content.setAdname2(cjBean2.getProperties().getString("所属街"));
+                        content.setCommunity2(cjBean2.getProperties().getString("居委_1"));
+                    }
+                    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;
+        }
+    }
+
+
     public AddressResult.ContentBean addContentWGWGrid(AddressResult.ContentBean content) {
         AreaService areaService = AreaService.getInstance();
         if (content != null && content.getLat() != null && content.getLon() != null) {
@@ -506,7 +636,7 @@ public class AddressQueryEngine {
 
     public static String townReplaceAll(String address) {
         address = townReplace_ct(address);
-        return address.replaceAll("小区", "0").replaceAll("号", "0").replaceAll("弄", "0").replaceAll("室", "0").replaceAll("户", "0").replaceAll("单元", "0").replaceAll("幢", "0");
+        return address.replaceAll("小区", "-").replaceAll("号", "-").replaceAll("弄", "-").replaceAll("室", "-").replaceAll("户", "-").replaceAll("单元", "-").replaceAll("幢", "-");
     }
 
     /**

+ 2 - 30
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.util.AddressTools;
+import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 
@@ -13,35 +14,6 @@ import java.util.Set;
 
 public class TransfromDataTool {
 
-    public static void main(String[] args) {
-//      搜索地址
-        String searchAddress = "王家浜路130号101室";
-        System.out.println("》》搜索地址:" + searchAddress);
-        System.out.println();
-//      返回的参考地址列表
-        Set<String> arrayAddress = new HashSet<>();
-        arrayAddress.add("旗杆村平桥王家浜路658号");
-        arrayAddress.add("王家浜路与光星路交叉口东200米");
-        arrayAddress.add("上海市松江区叶榭镇四村村701号102室");
-        System.out.println("》》返回参考地址列表:" + arrayAddress);
-        System.out.println();
-//      新建JSONArray对象
-        JSONArray array = new JSONArray();
-//      把Set对象转换为接口接收的JSONArray对象
-        for (String key : arrayAddress) {
-            JSONObject item_ = new JSONObject();
-            item_.put("sourceaddress", key);
-            array.add(item_);
-        }
-        JSONArray reData = AddressTools.getInstance().findBestMatch2(searchAddress, array, "sourceaddress");
-        System.out.println("------------------打分后从高到低显示》》》》》》》》》》》》");
-        System.out.println();
-        for (int i = 0; i < reData.size(); i++) {
-            JSONObject jo = reData.getJSONObject(i);
-            System.out.println("返回参考地址:" + jo.getString("sourceaddress") + "\t打分:" + jo.getString("总分"));
-        }
-    }
-
     public AddressResult dbResultToResult(SplitAddress SplitAddress, String searchAddress, JSONArray array) {
         AddressResult result = new AddressResult();
         try {
@@ -52,7 +24,7 @@ public class TransfromDataTool {
             }
 //          打分(应该从大到小)
             JSONArray resultArray = AddressTools.getInstance().findBestMatch2(searchAddress, array, "sourceaddress");
-            for (int i = 0; i < resultArray.size(); i++) {
+            for (int i = 0; i < Math.min(resultArray.size(), 10); i++) {
                 JSONObject jsonObject = resultArray.getJSONObject(i);
                 if (jsonObject != null && jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
 //                  TODO 映射输出

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

@@ -35,6 +35,10 @@ public class AddressResult {
         private String adnameCode;
         // 居委
         private String community;
+        // 街镇名称
+        private String adname2;
+        // 居委
+        private String community2;
         // 居委编码
         private String communityCode;
         // 结果类型

+ 92 - 7
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -6,8 +6,6 @@ import com.skyversation.poiaddr.addquery.TransfromDataTool;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
 import com.skyversation.poiaddr.bean.YyskDmdzAddressStandardization;
-import com.skyversation.poiaddr.config.DbConnection;
-import com.skyversation.poiaddr.entity.YyskAddressStandardization;
 import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
 import com.skyversation.poiaddr.util.*;
@@ -21,7 +19,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
 import java.util.*;
 
 /**
@@ -157,7 +154,7 @@ public class CorporateLibraryController {
         if (StringUtils.hasText(district)) {
             splitAddress.setDistrict(district);
         }
-        List<YyskDmdzAddressStandardization> list = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress,3);
+        List<YyskDmdzAddressStandardization> list = AreaService.getInstance().getAddressPoiOnlyDB(splitAddress, 3);
         AddressResult addressResult = null;
         if (list == null || list.size() < 1) {
 //          写入回流表
@@ -184,7 +181,7 @@ public class CorporateLibraryController {
         if (!StringUtils.hasText(address)) {
             return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
         }
-        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(address,1);
+        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(address, 1);
         if (addressResult == null) {
             AreaService.getInstance().callBackErrorAddr(address);
             return MessageManage.getInstance().getResultContent(Constant.NO_DATA, "无数据", "无数据");
@@ -212,7 +209,7 @@ public class CorporateLibraryController {
         int sl = 3;
         String searchLevel = request.getParameter("searchLevel");
         try {
-            if(StringUtils.hasText(searchLevel)){
+            if (StringUtils.hasText(searchLevel)) {
                 sl = Integer.parseInt(searchLevel);
                 if (sl < 1 || sl > 3) {
                     return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
@@ -221,7 +218,7 @@ public class CorporateLibraryController {
         } catch (Exception e) {
             return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
         }
-        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(address,sl);
+        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(address, sl);
         if (addressResult == null || addressResult.getData() == null || addressResult.getData().get(0) == null) {
             AreaService.getInstance().callBackErrorAddr(address);
             return MessageManage.getInstance().getResultContent(Constant.NO_DATA, "无数据", "无数据");
@@ -234,6 +231,94 @@ public class CorporateLibraryController {
         }
     }
 
+
+    /**
+     * 只返回bean的接口,其中返回两个geojson结果
+     *
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "/searchByNameOnly2")
+    public String searchByNameOnly2(HttpServletRequest request) {
+        String address = request.getParameter("address");
+        if (!StringUtils.hasText(address)) {
+            return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
+        }
+//      搜索等级:【1:路名、2:弄号、3:楼栋号】
+        int sl = 3;
+        String searchLevel = request.getParameter("searchLevel");
+        try {
+            if (StringUtils.hasText(searchLevel)) {
+                sl = Integer.parseInt(searchLevel);
+                if (sl < 1 || sl > 3) {
+                    return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
+                }
+            }
+        } catch (Exception e) {
+            return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
+        }
+        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nwV2(address, sl);
+        if (addressResult == null || addressResult.getData() == null || addressResult.getData().get(0) == null) {
+            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), "成功");
+        }
+    }
+
+    /**
+     * 手动添加或删除地址库和缓存中的地址
+     * 添加【address,lon,lat】添加比较快
+     * 删除【address,oid】删除比较慢
+     *
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "/changeDMDZdatas")
+    public String changeDMDZdatas(HttpServletRequest request) {
+        String address = request.getParameter("address");
+        if (StringUtils.hasText(address)) {
+            String oid = request.getParameter("oid");
+            if (StringUtils.hasText(oid)) {
+//              删除操作,首先要删除缓存中的数据,然后执行del操作删除数据库中对应的数据
+                AreaService.getInstance().delDmdzAddressByRoadInfos(address, Long.parseLong(oid));
+                return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "地址" + address + "删除成功!", "成功");
+            } else {
+//              添加操作
+                String lon = request.getParameter("lon");
+                String lat = request.getParameter("lat");
+                if (StringUtils.hasText(lon) && StringUtils.hasText(lat)) {
+                    GeoJsonBean cjBean = AreaService.getInstance().isInResidentialCommitteePolygon(Double.parseDouble(lon), Double.parseDouble(lat));
+                    if (cjBean != null && cjBean.getProperties() != null) {
+                        YyskDmdzAddressStandardization yyskDmdzAddressStandardization = new YyskDmdzAddressStandardization();
+                        yyskDmdzAddressStandardization.setSourceaddress(address);
+                        yyskDmdzAddressStandardization.setCity("上海市");
+                        yyskDmdzAddressStandardization.setCounty(cjBean.getProperties().getString("所属区"));
+                        yyskDmdzAddressStandardization.setTown(cjBean.getProperties().getString("所属街"));
+                        yyskDmdzAddressStandardization.setCommunity(cjBean.getProperties().getString("居委_1"));
+                        yyskDmdzAddressStandardization.setCommunity_code(cjBean.getProperties().getString("居委会"));
+                        yyskDmdzAddressStandardization.setCreatetime(new Date());
+                        yyskDmdzAddressStandardization.setLon(Float.parseFloat(lon));
+                        yyskDmdzAddressStandardization.setLat(Float.parseFloat(lat));
+                        yyskDmdzAddressStandardization.setData_type("diyBack");
+                        yyskDmdzAddressStandardization.setType("zl_v4");
+                        yyskDmdzAddressStandardization = AreaService.getInstance().insertCallbackData(yyskDmdzAddressStandardization);
+                        ScheduledTasks.yyskDmdzAddressStandardizationPutDmdz(yyskDmdzAddressStandardization);
+                    }
+                    return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "地址" + address + "添加成功!", "成功");
+                } else {
+                    return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "添加操作:lon或lat不能为空", "参数错误");
+                }
+            }
+        } else {
+            return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "删除操作:address不能为空", "参数错误");
+        }
+    }
+
     /**
      * 处理待处理表接口
      * 首先要使用JDBC写一个sql语句,验证同批次的地址不能重复,和null,重复或者为null的话直接返回(sql执行)

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

@@ -80,6 +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> wgPolygonList = new ArrayList<>();
     public List<GeoJsonBean> wgwPolygonList = new ArrayList<>();
     public List<GeoJsonBean> zhwgPolygonList = new ArrayList<>();
@@ -261,10 +262,11 @@ public class AreaService {
         lis.add(shAllAdministrativeDivisionPolygonList);
         lis.add(shAllToensPolygonList);
         lis.add(shAllResidentialCommitteeList);
+        lis.add(shAllResidentialCommitteeList2);
         lis.add(wgPolygonList);
         lis.add(wgwPolygonList);
         lis.add(zhwgPolygonList);
-        String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界.geojson", "geojson/责任网格-wgs84.geojson", "geojson/青浦区微网格-wgs84.geojson", "geojson/青浦区综合网格.geojson"};
+        String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界.geojson", "geojson/上海市_村居边界v2.geojson", "geojson/责任网格-wgs84.geojson", "geojson/青浦区微网格-wgs84.geojson", "geojson/青浦区综合网格.geojson"};
 
         for (int j = 0; j < path.length; j++) {
             BufferedReader reader = null;
@@ -476,41 +478,113 @@ public class AreaService {
     public List<YyskDmdzAddressStandardization> getDmdzAddressByRoadInfos(String addr2, int sl) {
         List<YyskDmdzAddressStandardization> returnDatas = new ArrayList<>();
         Map<String, String> roadInfos = AddrSplitLmrMap.parseAddress(addr2);
+        int maxDataNum = 200;
         if (roadInfos != null && roadInfos.containsKey("路名") && roadInfos.get("路名") != null && StringUtils.hasText(roadInfos.get("路名"))) {
 //          搜索等级:【1:路名、2:弄号、3:楼栋号】
-            switch (sl) {
-                case 1:
-                    addr2 = roadInfos.get("路名");
-                    break;
-                case 2:
-                    addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "");
-                    break;
-                case 3:
-                    addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "");
-                    break;
-            }
-            if (ScheduledTasks.allDmdzData.containsKey(addr2)) {
-                returnDatas = ScheduledTasks.allDmdzData.get(addr2);
+            if (sl == 1) {
+                if (StringUtils.hasText(roadInfos.get("楼栋号")) && 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 && StringUtils.hasText(roadInfos.get("弄号")) && ScheduledTasks.allDmdzData.containsKey(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : ""))) {
+                    returnDatas.addAll(ScheduledTasks.allDmdzData.get(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "")));
+                }
+
+                if (returnDatas.size() < maxDataNum && ScheduledTasks.allDmdzData.containsKey(roadInfos.get("路名"))) {
+                    returnDatas.addAll(ScheduledTasks.allDmdzData.get(roadInfos.get("路名")));
+                }
+
+                if (returnDatas.size() < maxDataNum) {
+                    for (String key : ScheduledTasks.allDmdzData.keySet()) {
+//                      TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
+                        if (key != null && key.contains(roadInfos.get("路名")) && returnDatas.size() < maxDataNum) {
+                            returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                        }
+                    }
+                }
+            } else if (sl == 2) {
+                if (StringUtils.hasText(roadInfos.get("楼栋号")) && 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 && StringUtils.hasText(roadInfos.get("弄号")) && ScheduledTasks.allDmdzData.containsKey(roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : ""))) {
+                    returnDatas.addAll(ScheduledTasks.allDmdzData.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("弄号") : "")) && returnDatas.size() < maxDataNum) {
+                            returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                        }
+                    }
+                }
             } else {
-                for (String key : ScheduledTasks.allDmdzData.keySet()) {
-//                      TODO 地址库有离谱的骚东西
-                    if (key != null && key.contains(addr2) && returnDatas.size() < 20) {
-                        returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                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));
+                        }
                     }
                 }
             }
         } else {
             for (String key : ScheduledTasks.allDmdzData.keySet()) {
-//              TODO 地址库有离谱的骚东西
-                if (key != null && addr2 != null && key.contains(addr2)) {
+//              TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
+                if (key != null && key.contains(addr2) && returnDatas.size() < maxDataNum) {
                     returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
-                    break;
                 }
             }
         }
         return returnDatas;
     }
 
+    /**
+     * 删除缓存和地址库中的数据
+     *
+     * @param addr2
+     * @return
+     */
+    public boolean delDmdzAddressByRoadInfos(String addr2, Long delId) {
+        try {
+            Map<String, String> roadInfos = AddrSplitLmrMap.parseAddress(addr2);
+            if (roadInfos != null && roadInfos.containsKey("路名") && roadInfos.get("路名") != null && StringUtils.hasText(roadInfos.get("路名"))) {
+                addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "");
+            }
+//          删除数据库的数据
+            YyskDmdzAddressStandardization delItem = new YyskDmdzAddressStandardization();
+            delItem.setOid(delId);
+            yyszAddressRepository.delete(delItem);
+//          找到key可以最快删除,地址直接输入路名和弄号等信息
+            for (String key : ScheduledTasks.allDmdzData.keySet()) {
+//          TODO 地址库有离谱的骚东西(常见的就是不同的区或镇有相同的路名),这样会导致速度变慢,但是兼容性更强
+                if (key != null && addr2 != null && key.contains(addr2)) {
+                    ScheduledTasks.allDmdzData.get(key).removeIf(item -> Objects.equals(item.getOid(), delId));
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * 地址库添加数据
+     *
+     * @param item
+     * @return
+     */
+    public YyskDmdzAddressStandardization insertCallbackData(YyskDmdzAddressStandardization item) {
+        return yyszAddressRepository.save(item);
+    }
+
     public List<YyskDmdzAddressStandardization> getAddressPoiOnlyDB(SplitAddress splitAddress, int sl) {
 //      TODO 数据库查询逻辑调整为内存处理的方式
         String addr = splitAddress.getAddr();
@@ -612,6 +686,22 @@ public class AreaService {
     }
 
 
+    public GeoJsonBean isInResidentialCommitteePolygonV2(double lon, double lat) {
+        try {
+            Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
+            for (GeoJsonBean bean : shAllResidentialCommitteeList2) {
+                if (bean.getMultiPolygon().contains(point)) {
+                    return bean;
+                }
+            }
+            return null;
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+
+        }
+    }
+
+
     public GeoJsonBean isInWGPolygon(double lon, double lat) {
         Geometry point = null;
         try {

+ 13 - 11
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -975,18 +975,20 @@ public class AddressTools {
         content.setType(json.getString("source"));
         content.setAddress(json.getString("sourceaddress"));
         content.setSearchAddress(json.getString("searchAddress"));
-        content.setDistance("");
+        content.setDistance(json.getString("oid"));
         content.setName(json.getString("address"));
-        content.setLocation(json.get("lon") + "," + json.get("lat"));
-        content.setLat(json.getDoubleValue("lat"));
-        content.setLon(json.getDoubleValue("lon"));
-        if (json.get("x") != null && json.get("y") != null) {
-            content.setX(Double.parseDouble(json.getString("x")));
-            content.setY(Double.parseDouble(json.getString("y")));
-        } else if (content.getLon() != null && content.getLat() != null) {
-            double[] xy = Coordinate.wgs84_to_shcj(json.getDoubleValue("lon"), json.getDoubleValue("lat"));
-            content.setX(xy[0]);
-            content.setY(xy[1]);
+        if (json.get("lon") != null && json.get("lat") != null) {
+            content.setLocation(json.get("lon") + "," + json.get("lat"));
+            content.setLat(json.getDoubleValue("lat"));
+            content.setLon(json.getDoubleValue("lon"));
+            if (json.get("x") != null && json.get("y") != null) {
+                content.setX(Double.parseDouble(json.getString("x")));
+                content.setY(Double.parseDouble(json.getString("y")));
+            } else if (content.getLon() != null && content.getLat() != null) {
+                double[] xy = Coordinate.wgs84_to_shcj(json.getDoubleValue("lon"), json.getDoubleValue("lat"));
+                content.setX(xy[0]);
+                content.setY(xy[1]);
+            }
         }
         content.setScore("rule_3");
 

+ 29 - 0
src/main/java/com/skyversation/poiaddr/util/ShanghaiAddressSplitUtil.java

@@ -1,5 +1,7 @@
 package com.skyversation.poiaddr.util;
 
+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.entity.AddrBean;
@@ -586,6 +588,33 @@ public class ShanghaiAddressSplitUtil {
     */
     public static void main(String[] args) throws Exception {
         new ShanghaiAddressSplitUtil().init();
+//      搜索地址
+        String searchAddress = "王家浜路130号101室";
+        System.out.println("》》搜索地址:" + searchAddress);
+        System.out.println();
+//      返回的参考地址列表
+        Set<String> arrayAddress = new HashSet<>();
+        arrayAddress.add("茸梅路与王家浜路交叉口西北140米");
+        arrayAddress.add("茸梅路与王家浜路交叉口东南100米");
+        arrayAddress.add("上海市松江区中山街道五龙居民委员会王家浜路130号101室");
+        arrayAddress.add("王家浜路80号101室");
+        System.out.println("》》返回参考地址列表:" + arrayAddress);
+        System.out.println();
+//      新建JSONArray对象
+        JSONArray array = new JSONArray();
+//      把Set对象转换为接口接收的JSONArray对象
+        for (String key : arrayAddress) {
+            JSONObject item_ = new JSONObject();
+            item_.put("sourceaddress", key);
+            array.add(item_);
+        }
+        JSONArray reData = AddressTools.getInstance().findBestMatch2(searchAddress, array, "sourceaddress");
+        System.out.println("------------------打分后从高到低显示》》》》》》》》》》》》");
+        System.out.println();
+        for (int i = 0; i < reData.size(); i++) {
+            JSONObject jo = reData.getJSONObject(i);
+            System.out.println("返回参考地址:" + jo.getString("sourceaddress") + "\t打分:" + jo.getString("总分"));
+        }
         /*AddrSplitLmrMap addrSplitLmrMap = new AddrSplitLmrMap();
         addrSplitLmrMap.initFile();
         String testAddress = "上海市嘉定区兴庆路1551号";

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

@@ -314,7 +314,7 @@ public class ScheduledTasks {
                 List<YyskDmdzAddressStandardization> datas = new ArrayList<>();
                 datas.add(item);
                 ScheduledTasks.allDmdzData.put(addr, datas);
-            } else if (ScheduledTasks.allDmdzData.get(addr).size() < 20) {
+            } else {
                 ScheduledTasks.allDmdzData.get(addr).add(item);
             }
         }

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/geojson/上海市_村居边界.geojson


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/geojson/上海市_村居边界v2.geojson


Some files were not shown because too many files changed in this diff