Browse Source

Merge branch '松江大数据中心专用' of http://47.103.92.60:3003/skyversation-public/place_name_search into 松江大数据中心专用

zhanghan 2 months ago
parent
commit
f900f617b0

+ 14 - 4
pom.xml

@@ -32,11 +32,16 @@
         <java.version>8</java.version>
     </properties>
     <dependencies>
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <version>3.1.0</version>
+        </dependency>
         <!-- Spring Data JPA 依赖,用于简化数据库操作 -->
-        <!--        <dependency>-->
-        <!--            <groupId>org.springframework.boot</groupId>-->
-        <!--            <artifactId>spring-boot-starter-data-jpa</artifactId>-->
-        <!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -52,6 +57,11 @@
         <!--            <artifactId>argoDb-jdbc-driver</artifactId>-->
         <!--            <version>8.37.3</version>-->
         <!--        </dependency>-->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.6.0</version> <!-- 你可以根据需要调整版本号 -->
+        </dependency>
         <dependency>
             <groupId>org.json</groupId>
             <artifactId>json</artifactId>

+ 2 - 0
src/main/java/com/skyversation/poiaddr/PoiAddrApplication.java

@@ -2,9 +2,11 @@ package com.skyversation.poiaddr;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.web.config.EnableSpringDataWebSupport;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
+@EnableSpringDataWebSupport // 以自动处理分页参数和 Page 的序列化:
 @EnableScheduling // 定时任务支持
 public class PoiAddrApplication {
     public static void main(String[] args) {

+ 42 - 13
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -11,8 +11,7 @@ import com.skyversation.poiaddr.util.status.AddressLevel;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
+import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.apache.commons.codec.binary.Base64;
 
@@ -46,7 +45,7 @@ public class AddressQueryEngine {
             return null;
         }
         AddressResult addressResult = new AddressResult();
-        for (String addr : addrs) {
+        /*for (String addr : addrs) {
             //  创建请求
             addressResult = sj_szxSearchByName(addr, 3);
             if (addressResult != null) {
@@ -54,6 +53,26 @@ public class AddressQueryEngine {
                 addressResult.setMessage("成功");
                 return getCjWgWgwByLoc(addressResult);
             }
+        }*/
+//      市中心转发的测绘院地名地址服务
+        /*for (String addr : addrs) {
+            //  创建请求
+            addressResult = szxSearchByName(addr);
+            if (addressResult != null) {
+                addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
+                addressResult.setMessage("成功");
+                return getCjWgWgwByLoc(addressResult);
+            }
+        }*/
+//      TODO 如果多次尝试请求市中心地址后,还是请求失败就使用高德地名地址搜索
+        for (String addr : addrs) {
+            //  创建请求(要返回对应的搜索地址,返回地址,总分,市:cityname,街道:adname,村居:community)
+            addressResult = gdV3SearchByName(addr);
+            if (addressResult != null) {
+                addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
+                addressResult.setMessage("成功");
+                return getCjWgWgwByLoc(addressResult);
+            }
         }
         addressResult.setCode(AddressResultEnum.RESULT_NULL);
         addressResult.setMessage("失败");
@@ -65,24 +84,24 @@ public class AddressQueryEngine {
      * @param address
      * @return
      */
-    public AddressResult szxSearchByName(String address){
-        System.out.println("<<<<<<<<<<----------开始四中心互联网地名地址搜索------------>>>>>>>>>>>>>");
-        if(address.startsWith("上海")){
+    public AddressResult szxSearchByName(String address) {
+        if (!address.startsWith("上海")) {
             address = "上海市" + address;
         }
-        System.out.println("<<<<<<<<<<---URL: " + address + "--->>>>>>>>>>>>>");
-        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, Constant.SZX_HLW_URL + address, null, null, 0);
-
-        if(response == null){
+        if (address.startsWith("中山") && !address.startsWith("中山街道")) {
+            address = address.replace("中山", "中山街道");
+        }
+        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, Constant.SZX_HLW_URL + address, null, null, 3);
+        if (response == null) {
             return null;
         }
         String body = response.getBody() + "";
-        if(!StringUtils.hasText(body))
+        if (!StringUtils.hasText(body))
             return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
         try {
             JSONObject json = JSONObject.parseObject(body);
             return TransfromDataTool.szxResultToResult(json, address);
-        } catch (Exception e){
+        } catch (Exception e) {
             return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
         }
     }
@@ -151,6 +170,13 @@ public class AddressQueryEngine {
         return sign;
     }
 
+    /**
+     * 关键字地名地址搜索,专用搜索处理逻辑
+     *
+     * @param address
+     * @param level
+     * @return
+     */
     public AddressResult sj_szxSearchByName(String address, Integer level) {
 //      鉴权
         JSONObject params = new JSONObject();
@@ -264,6 +290,9 @@ public class AddressQueryEngine {
      * @return
      */
     public AddressResult gdV3SearchByName(String address) {
+        if (address.startsWith("中山") && !address.startsWith("中山街道")) {
+            address = address.replace("中山", "中山街道");
+        }
         String geoUrl =
                 Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
                         "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
@@ -300,7 +329,7 @@ public class AddressQueryEngine {
                 }
             }
             try {
-                return TransfromDataTool.gdV3ResultToResult(pois);
+                return new TransfromDataTool().gdV3ResultToResult(address, pois);
             } catch (Exception e) {
                 System.err.println(e);
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");

+ 41 - 6
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -3,12 +3,16 @@ package com.skyversation.poiaddr.addquery;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.util.AddressTools;
 import com.skyversation.poiaddr.util.CoordTransform2;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 public class TransfromDataTool {
 
@@ -123,7 +127,7 @@ public class TransfromDataTool {
             content.setType(jsonObject.getString("type_name"));
             content.setAddress(jsonObject.getString("address"));
             content.setName(jsonObject.getString("name"));
-//          使用分词方法得到区名镇名
+//          使用分词方法得到区名镇名
             content.setCityname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[1]);
             double[] points = new double[]{jsonObject.getJSONObject("location").getDouble("lng"),
                     jsonObject.getJSONObject("location").getDouble("lat")};
@@ -187,16 +191,18 @@ public class TransfromDataTool {
         return result;
     }
 
-    public static AddressResult gdV3ResultToResult(JSONArray array) {
+    public AddressResult gdV3ResultToResult(String searchAddress, JSONArray array) {
         AddressResult result = new AddressResult();
         if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
         try {
-            for (int i = 0; i < array.size(); i++) {
-                JSONObject jsonObject = array.getJSONObject(i);
+            JSONObject jsonObject = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(searchAddress, array, "address");
+            if (jsonObject != null && jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
                 AddressResult.ContentBean content = new AddressResult.ContentBean();
+                content.setScore(jsonObject.getString("总分"));
+                content.setSearchAddress(jsonObject.getString("searchAddress"));
                 content.setPname(jsonObject.getString("pname"));
                 content.setCityname(jsonObject.getString("cityname"));
                 content.setAdname(jsonObject.getString("adname"));
@@ -214,11 +220,40 @@ public class TransfromDataTool {
                 }
                 result.getData().add(content);
             }
+//          TODO 将请求返回的高德结果入库到pgsql中
+            List<AmapAddressV3> amapAddressV3List = new ArrayList<>();
+            for (int i = 0; i < array.size(); i++) {
+                JSONObject item = array.getJSONObject(i);
+                AmapAddressV3 amapAddressV3 = new AmapAddressV3();
+                amapAddressV3.setId(UUID.randomUUID().toString());
+                amapAddressV3.setParent(item.get("parent").toString());
+                amapAddressV3.setChildtype(item.get("childtype").toString());
+                amapAddressV3.setName(item.get("name").toString());
+                amapAddressV3.setType(item.get("type").toString());
+                amapAddressV3.setTypecode(item.get("typecode").toString());
+                amapAddressV3.setBizType(item.get("biz_type").toString());
+                amapAddressV3.setAddress(item.get("address").toString());
+                amapAddressV3.setLocation(item.get("location").toString());
+                amapAddressV3.setTel(item.get("tel").toString());
+                amapAddressV3.setPname(item.get("pname").toString());
+                amapAddressV3.setAdname(item.get("adname").toString());
+                amapAddressV3.setImportance(item.get("importance").toString());
+                amapAddressV3.setShopid(item.get("shopid").toString());
+                amapAddressV3.setShopinfo(item.get("shopinfo").toString());
+                amapAddressV3.setPoiweight(item.get("poiweight").toString());
+                amapAddressV3.setDistance(item.get("distance").toString());
+                amapAddressV3.setBizExt(item.get("biz_ext").toString());
+                amapAddressV3.setPhotos(item.get("photos").toString());
+                amapAddressV3.setCreateTime(new Date());
+                amapAddressV3List.add(amapAddressV3);
+            }
+            if (amapAddressV3List.size() > 0) {
+                AreaService.getInstance().saveAmapAddressV3(amapAddressV3List);
+            }
         } catch (Exception e) {
+            e.printStackTrace();
             System.err.println("gdV3ResultToResult err:" + e);
         }
-        result.setCode(AddressResultEnum.WDJA_SUCCESS);
-
         result.setCode(AddressResultEnum.GDV3_SUCCESS);
         return result;
     }

+ 1 - 3
src/main/java/com/skyversation/poiaddr/config/DbConnection.java

@@ -3,7 +3,6 @@ package com.skyversation.poiaddr.config;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -32,7 +31,7 @@ public class DbConnection {
     @Value("${app.db.jdbc_url}")
     private String jdbcURL;
 
-    @PostConstruct
+//    @PostConstruct
     public void initDbConnection() throws SQLException {
 //      加载驱动
         System.out.println("加载驱动!");
@@ -46,7 +45,6 @@ public class DbConnection {
         System.out.println("配置文件中的数据库用户名:" + db_user_name + ";密码:" + db_password);
         connection = DriverManager.getConnection(jdbcURL, db_user_name, db_password);
         stmt = connection.createStatement();
-
     }
 
     //  插入、删除、更新

+ 41 - 3
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -1,5 +1,6 @@
 package com.skyversation.poiaddr.controller;
 
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.entity.YyskAddressStandardization;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
 import com.skyversation.poiaddr.util.ExcelReaderUtils;
@@ -11,6 +12,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -38,7 +40,7 @@ public class CorporateLibraryController {
      * 5、将结果保存为ser文件
      */
     @PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
-    public Object updateDataBaseData(@RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "pageNum") Integer pageNum, @RequestParam(name = "whereStr") String whereStr, @RequestParam(name = "init") Integer init, @RequestParam(name = "tableName") String tableName,@RequestParam(name = "updateToDataBase") Integer updateToDataBase) {
+    public Object updateDataBaseData(@RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "pageNum") Integer pageNum, @RequestParam(name = "whereStr") String whereStr, @RequestParam(name = "init") Integer init, @RequestParam(name = "tableName") String tableName, @RequestParam(name = "updateToDataBase") Integer updateToDataBase) {
         // 记录程序开始时间
         if (!ScheduledTasks.taskRunStatus) {
             long startTime = System.currentTimeMillis();
@@ -46,10 +48,10 @@ public class CorporateLibraryController {
             if (pageNum == null) {
                 pageNum = 0;
             }
-            if(updateToDataBase == null){
+            if (updateToDataBase == null) {
                 updateToDataBase = 0;
             }
-            yyskAddressStandardizationService.iterativeProcessing(pageSize, pageNum, init, tableName, whereStr,updateToDataBase);// 记录程序结束时间
+            yyskAddressStandardizationService.iterativeProcessing(pageSize, pageNum, init, tableName, whereStr, updateToDataBase);// 记录程序结束时间
             long endTime = System.currentTimeMillis();
             ScheduledTasks.taskRunStatus = false;
             return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
@@ -58,6 +60,31 @@ public class CorporateLibraryController {
         }
     }
 
+    /**
+     * 自定义规则处理地名地址文件
+     *
+     * @param fileRootPath   文件本目录
+     * @param startFileIndex 开始下标
+     * @param endFileIndex   结束下标
+     * @param sort           运行规则【1;-1】
+     * @return
+     */
+    @PostMapping(value = "/searchLoadFileData", produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object searchLoadFileData(@RequestParam(name = "fileRootPath") String fileRootPath, @RequestParam(name = "startFileIndex") Integer startFileIndex, @RequestParam(name = "endFileIndex") Integer endFileIndex, @RequestParam(name = "sort") Integer sort) {
+        // 记录程序开始时间
+        if (!ScheduledTasks.taskRunStatus) {
+            long startTime = System.currentTimeMillis();
+            ScheduledTasks.taskRunStatus = true;
+            yyskAddressStandardizationService.searchLoadFileData(fileRootPath, startFileIndex, endFileIndex, sort);// 记录程序结束时间
+            long endTime = System.currentTimeMillis();
+            ScheduledTasks.taskRunStatus = false;
+            return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
+        } else {
+            return "定时任务正在运行,暂不可以调用该方法!";
+        }
+    }
+
+
     /**
      * 1、解析xlsx得到所有数据
      * 2、根据主键address和标准化地址standardAddress直接跑规则,属于rule_4的要替换掉同时添加updateTag
@@ -100,5 +127,16 @@ public class CorporateLibraryController {
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
 
+    /**
+     * 直接输地址并返回结果
+     *
+     * @param address
+     * @return
+     * @throws SQLException
+     */
+    @GetMapping(value = "/searchByAddrStrToServer")
+    public Object searchByAddrStrToServer(@RequestParam(name = "address") String address) {
+        return AddressQueryEngine.getInstance().gdV3SearchByName(address);
+    }
 
 }

+ 94 - 0
src/main/java/com/skyversation/poiaddr/entity/AmapAddressV3.java

@@ -0,0 +1,94 @@
+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-04-10 16:15:14 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="amap_address_v3" , schema = "")
+public class AmapAddressV3  implements Serializable {
+
+	private static final long serialVersionUID =  7657028066806980374L;
+
+	@Id
+   	@Column(name = "id" )
+	private String id;
+
+   	@Column(name = "parent" )
+	private String parent;
+
+   	@Column(name = "childtype" )
+	private String childtype;
+
+   	@Column(name = "name" )
+	private String name;
+
+   	@Column(name = "type" )
+	private String type;
+
+   	@Column(name = "typecode" )
+	private String typecode;
+
+   	@Column(name = "biz_type" )
+	private String bizType;
+
+   	@Column(name = "address" )
+	private String address;
+
+   	@Column(name = "location" )
+	private String location;
+
+   	@Column(name = "tel" )
+	private String tel;
+
+   	@Column(name = "pname" )
+	private String pname;
+
+   	@Column(name = "cityname" )
+	private String cityname;
+
+   	@Column(name = "adname" )
+	private String adname;
+
+   	@Column(name = "importance" )
+	private String importance;
+
+   	@Column(name = "shopid" )
+	private String shopid;
+
+   	@Column(name = "shopinfo" )
+	private String shopinfo;
+
+   	@Column(name = "poiweight" )
+	private String poiweight;
+
+   	@Column(name = "distance" )
+	private String distance;
+
+   	@Column(name = "biz_ext" )
+	private String bizExt;
+
+   	@Column(name = "photos" )
+	private String photos;
+
+   	@Column(name = "update_time" )
+	private Date updateTime;
+
+   	@Column(name = "create_time" )
+	private Date createTime;
+}

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

@@ -0,0 +1,10 @@
+package com.skyversation.poiaddr.service;
+
+import com.skyversation.poiaddr.entity.AmapAddressV3;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import javax.annotation.Resource;
+
+@Resource
+public interface AmapAddressV3Repository extends JpaRepository<AmapAddressV3, String> {
+}

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

@@ -6,13 +6,15 @@ import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
-import com.skyversation.poiaddr.config.DbConnection;
+import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.service.impl.AmapAddressV3Service;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPolygon;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
@@ -25,6 +27,9 @@ import java.util.List;
 @Service
 public class AreaService {
 
+    @Autowired
+    private AmapAddressV3Service amapAddressV3Service;
+
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -77,26 +82,11 @@ public class AreaService {
         }
 //      TODO 数据库连通性测试
         try {
+            long startTime = System.currentTimeMillis();
             System.out.println("<<<<<<<<------开始数据库连通性测试");
-            /*String insertIntoSql = "INSERT INTO yysk_dmdz_address_standardization (address) \n" +
-                    "select real_address  FROM dws.fusion_nfrk_corp_info_partition_dsjzx_v1 where real_address is not NULL\n" +
-                    "UNION\n" +
-                    "select addr_area_name_gb FROM dws.fusion_nfrk_corp_info_partition_dsjzx_v1 where addr_area_name_gb is not NULL\n" +
-                    "UNION\n" +
-                    "select real_address  FROM dws.fusion_nfrk_corp_info_partition_dsjzx where real_address is not NULL\n" +
-                    "UNION\n" +
-                    "select addr_area_name_gb FROM dws.fusion_nfrk_corp_info_partition_dsjzx where addr_area_name_gb is not NULL\n" +
-                    "UNION\n" +
-                    "select before_conten from dws.fusion_nfrk_corp_change_partition_dsjzx where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更','主要经营场所','经营场所','注册地址(住所)') and before_conten is not NULL\n" +
-                    "UNION\n" +
-                    "select after_content from dws.fusion_nfrk_corp_change_partition_dsjzx where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更','主要经营场所','经营场所','注册地址(住所)') and after_content is not NULL\n" +
-                    "UNION\n" +
-                    "select before_conten from dws.fusion_nfrk_corp_change_partition_dsjzx_v2 where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更','主要经营场所','经营场所','注册地址(住所)') and before_conten is not NULL\n" +
-                    "UNION\n" +
-                    "select after_content from dws.fusion_nfrk_corp_change_partition_dsjzx_v2 where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更','主要经营场所','经营场所','注册地址(住所)') and after_content is not NULL\n";*/
-//            String insertIntoSql = "INSERT INTO yysk_dmdz_address_standardization (address) select address from yysk_wcb_address_standardization where address is not null";
-//            System.out.println(">>>>>>>>------数据库连通性测试结果:" + DbConnection.getInstance().updateSql(insertIntoSql));
-            System.out.println(">>>>>>>>------数据库连通性测试结果:" + DbConnection.getInstance().runSqlStr("select count(*) from yysk_dmdz_address_standardization").toString());
+            List<AmapAddressV3> amapAddressV3List = amapAddressV3Service.getAllData();
+            long endTime = System.currentTimeMillis();
+            System.out.println(">>>>>>>>------数据库连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!结果:" + amapAddressV3List.size());
         } catch (Exception e) {
             System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
         }
@@ -107,7 +97,7 @@ public class AreaService {
         lis.add(shAllAdministrativeDivisionPolygonList);
         lis.add(shAllToensPolygonList);
         lis.add(shAllResidentialCommitteeList);
-        String[] path = new String[]{"geojson/sh_all_administrative_division.geojson", "geojson/sh_all_towns.geojson", "geojson/sh_all_residential_committee.geojson"};
+        String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界.geojson"};
 
         for (int j = 0; j < path.length; j++) {
             BufferedReader reader = null;
@@ -148,6 +138,10 @@ public class AreaService {
         System.out.println("<<<<<<<<------run geo data complete------>>>>>>>>>");
     }
 
+    public void saveAmapAddressV3(List<AmapAddressV3> amapAddressV3List){
+        amapAddressV3Service.saveAmapAddressV3(amapAddressV3List);
+    }
+
     public GeoJsonBean isInadPolygon(double lon, double lat) {
         try {
             Geometry point = reader.read("POINT (" + lat + " " + lon + ")");

+ 23 - 0
src/main/java/com/skyversation/poiaddr/service/impl/AmapAddressV3Service.java

@@ -0,0 +1,23 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.service.AmapAddressV3Repository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class AmapAddressV3Service {
+
+    @Autowired
+    private AmapAddressV3Repository amapAddressV3Repository;
+
+    public List<AmapAddressV3> saveAmapAddressV3(List<AmapAddressV3> amapAddressV3List) {
+        return amapAddressV3Repository.saveAll(amapAddressV3List);
+    }
+
+    public List<AmapAddressV3> getAllData() {
+        return amapAddressV3Repository.findAll();
+    }
+}

+ 50 - 6
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationServiceImpl.java

@@ -5,6 +5,7 @@ import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.config.DbConnection;
 import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.util.AddressMatcher;
 import com.skyversation.poiaddr.util.AddressTools;
 import com.skyversation.poiaddr.util.ExcelReaderUtils;
 import org.springframework.stereotype.Service;
@@ -226,6 +227,41 @@ public class YyskAddressStandardizationServiceImpl {
         }
     }
 
+
+    public void searchLoadFileData(String fileRootPath, Integer startFileIndex, Integer endFileIndex, Integer sort) {
+        System.out.println("<<<<<<<<------searchLoadFileData{fileIndex:" + startFileIndex + "}");
+        long startTime = System.currentTimeMillis();
+        List<YyskAddressStandardization> listData = new ArrayList<>();
+        try {
+            List<Map<String, Object>> fileData = ExcelReaderUtils.readExcel(fileRootPath + "datas\\yysk_dmdz_address_standardization_200000_" + startFileIndex + ".xlsx");
+            for (Map<String, Object> item : fileData) {
+                YyskAddressStandardization yyskAddressStandardization = new YyskAddressStandardization();
+                yyskAddressStandardization.setAddress(item.get("address").toString());
+                yyskAddressStandardization.setDataTag(item.get("dataTag").toString());
+                listData.add(yyskAddressStandardization);
+            }
+        } catch (Exception e) {
+            listData = null;
+        }
+        if (listData != null && listData.size() > 0) {
+//              批量更新处理后的数据
+            List<YyskAddressStandardization> resultDataList = runExecutorService(listData);
+            if (resultDataList.size() > 0) {
+                ExcelReaderUtils.convertYYListToMapList(resultDataList, fileRootPath + "output\\yysk_dmdz_address_standardization_200000_result_" + startFileIndex + ".xlsx");
+            }
+            long endTime = System.currentTimeMillis();
+            System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!");
+            if (startFileIndex + sort != endFileIndex) {
+                startFileIndex += sort;
+                searchLoadFileData(fileRootPath, startFileIndex, endFileIndex, sort);
+            } else {
+                System.out.println("<<<<<<<<------任务处理完成!");
+            }
+        } else {
+            System.out.println("<<<<<<<<------任务处理完成!");
+        }
+    }
+
     public List<YyskAddressStandardization> runExecutorService(List<YyskAddressStandardization> listData) {
         // 创建线程池
         ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@@ -233,14 +269,22 @@ public class YyskAddressStandardizationServiceImpl {
         for (YyskAddressStandardization item : listData) {
             futures.add(executorService.submit(() -> {
                 List<String> addrList = new ArrayList<>();
-                if (item.getAddress() != null && !item.getAddress().isEmpty() && AddressTools.isOtherDistrictThanSongJiang2(item.getAddress())) {
-                    addrList.add(item.getAddress());
-                } else {
+                String[] addr = AddressMatcher.matchProvinceAndCity(item.getAddress());
+                if (addr != null && !addr[0].contains("上海")) {
 //                  匹配全国省名
-                    item.setProvinces(AddressTools.isOtherDistrictThanShangHai(item.getAddress()));
+                    item.setProvinces(addr[0]);
 //                  遍历全国城市名称匹配搜索地址市名
-                    item.setMarket(AddressTools.ifCITIES(item.getAddress()));
+                    item.setMarket(addr[1]);
                     item.setMatchLevel("rule_0");
+                } else {
+                    addrList.add(item.getAddress());
+                    String[] strs = AddressTools.parseAddressJZ(item.getAddress());
+                    if (strs != null) {
+                        item.setProvinces(strs[0] == null ? "" : strs[0]);
+                        item.setMarket(strs[0] == null ? "" : strs[0]);
+                        item.setDistinguish(strs[1] == null ? "" : strs[1]);
+                        item.setStreetTown(strs[2] == null ? "" : strs[2]);
+                    }
                 }
                 if (addrList.size() > 0) {
                     //  TODO 开始查询
@@ -291,7 +335,7 @@ public class YyskAddressStandardizationServiceImpl {
                                     } else {
                                         item.setResidentialCommittee("");
                                     }
-                                    String oldAddress = AddressTools.parseAddressJZ(contentBean.getSearchAddress())[3].replaceAll(item.getMarket(), "").replaceAll(item.getDistinguish(), "").replaceAll(item.getStreetTown(), "").replaceAll(item.getResidentialCommittee(), "");
+                                    String oldAddress = Objects.requireNonNull(AddressTools.parseAddressJZ(contentBean.getSearchAddress()))[3].replaceAll(item.getMarket(), "").replaceAll(item.getDistinguish(), "").replaceAll(item.getStreetTown(), "").replaceAll(item.getResidentialCommittee(), "");
                                     item.setStandardAddress(item.getMarket() + item.getDistinguish() + item.getStreetTown() + AddressQueryEngine.townReplace_ct(oldAddress));
                                     break;
                                 } else {

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

@@ -98,6 +98,7 @@ public class AddressMatcher {
                 if (isMunicipality(province)) {
                     return new String[]{province, province};
                 }
+                return new String[]{province, ""};
             }
         }
 
@@ -115,6 +116,7 @@ public class AddressMatcher {
                 if (isMunicipality(province)) {
                     return new String[]{province, province};
                 }
+                return new String[]{province, ""};
             }
         }
 
@@ -122,13 +124,12 @@ public class AddressMatcher {
         for (Map.Entry<String, String> entry : ABBREVIATION_CITY_MAP.entrySet()) {
             String cityAbbreviation = entry.getKey();
             String city = entry.getValue();
-            if(address.contains("开封")){
-                address.toString();
-            }
             if (address.contains(cityAbbreviation) &&!isPartOfRoadName(address, cityAbbreviation)) {
                 String province = CITY_PROVINCE_MAP.get(city);
                 if (province != null) {
                     return new String[]{province, city};
+                } else {
+                    return new String[]{"", city};
                 }
             }
         }

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

@@ -488,6 +488,7 @@ public class AddressTools {
 
     /***
      * 获取array中,指定字段与address匹配值最高的数据,特定方法,指定的jsonarray使用
+     * 数据结果准不准主要看这个方法
      * @param address 上海市松江区乐都路590号
      * @param array 地名地址接口返回的jsonarray数据
      * @param param jaonarray中地名地址字段的key

+ 84 - 84
src/main/java/com/skyversation/poiaddr/util/松江地名地址库治理.java

@@ -50,7 +50,7 @@ public class 松江地名地址库治理 {
         executorService.shutdown();
     }
 
-    public void sjAddressZL(int threadSize, String path, String outPath, String addressParam){
+    public void sjAddressZL(int threadSize, String path, String outPath, String addressParam) {
 
         List<Map<String, Object>> listAddr = null;
         try {
@@ -73,90 +73,90 @@ public class 松江地名地址库治理 {
         int size = (listAddr.size() / threadSize) + 1;
         System.out.println("<<<<<<<   " + size + "     >>>>>>>>>");
 //        ExecutorService executor = Executors.newFixedThreadPool(size);
-        for(int i = 0; i < size; i ++){
+        for (int i = 0; i < size; i++) {
 
-            List<Map<String, Object>> list = listAddr.subList(i * threadSize, (i+1)*threadSize > listAddr.size() ? listAddr.size(): (i+1)*threadSize);
+            List<Map<String, Object>> list = listAddr.subList(i * threadSize, (i + 1) * threadSize > listAddr.size() ? listAddr.size() : (i + 1) * threadSize);
 
 //            executor.execute(() ->{
 
             int jj = 1;
-                List<Map<String, Object>> result = new ArrayList<>();
-                for (Map<String, Object> map : list) {
-                    String address = map.get(addressParam) + "";
-
-                    if(StringUtils.hasText(address)){
-                        String[] addr = AddressMatcher.matchProvinceAndCity(address);
-                        if (addr != null && !addr[0].contains("上海")) {// 外地数据,记录省、市
-                            map.put("provinces", addr[0]);
-                            map.put("market", addr[1]);
+            List<Map<String, Object>> result = new ArrayList<>();
+            for (Map<String, Object> map : list) {
+                String address = map.get(addressParam) + "";
+
+                if (StringUtils.hasText(address)) {
+                    String[] addr = AddressMatcher.matchProvinceAndCity(address);
+                    if (addr != null && !addr[0].contains("上海")) {// 外地数据,记录省、市
+                        map.put("provinces", addr[0]);
+                        map.put("market", addr[1]);
+                        map.put("distinguish", "");
+                        map.put("streetTown", "");
+                        map.put("residentialCommittee", "");
+
+                        map.put("address", address);
+                        map.put("standardAddress", address);
+                        map.put("returnAddress", "");
+                        map.put("matchLevel", "rule_0");
+                        map.put("lon", "");
+                        map.put("lat", "");
+                        result.add(map);
+                    } else {// 上海市数据
+                        String strs[] = AddressTools.parseAddressJZ(address);
+                        map.put("provinces", strs[0] == null ? "" : strs[0]);
+                        map.put("market", strs[0] == null ? "" : strs[0]);
+                        map.put("distinguish", strs[1] == null ? "" : strs[1]);
+                        map.put("streetTown", strs[2] == null ? "" : strs[2]);
+                        map.put("address", address);
+
+                        if (!StringUtils.hasText(address)) {
+                            map.put("provinces", "");
+                            map.put("market", "");
                             map.put("distinguish", "");
                             map.put("streetTown", "");
                             map.put("residentialCommittee", "");
+                            resultYc(map, address, result);
+                        } else {
+                            String addressN = strs[3] == null ? address : strs[3];
+                            if (addressN.startsWith("中山") && !addressN.startsWith("中山街道")) {
+                                addressN = addressN.replace("中山", "中山街道");
+                            }
+                            System.out.println("《《《 查询地址是:  " + addressN + "   》》》");
+                            System.out.println("<<<<<<<   当前条数是:   " + jj + "   条     >>>>>>>>>");
 
-                            map.put("address", address);
-                            map.put("standardAddress", address);
-                            map.put("returnAddress", "");
-                            map.put("matchLevel", "rule_0");
-                            map.put("lon", "");
-                            map.put("lat", "");
-                            result.add(map);
-                        } else {// 上海市数据
-                            String strs[] = AddressTools.parseAddressJZ(address);
-                            map.put("provinces", strs[0] == null ? "" : strs[0]);
-                            map.put("market", strs[0] == null ? "" : strs[0]);
-                            map.put("distinguish", strs[1] == null ? "" : strs[1]);
-                            map.put("streetTown", strs[2] == null ? "" : strs[2]);
-                            map.put("address", address);
-
-                            if(!StringUtils.hasText(address)){
-                                map.put("provinces", "");
-                                map.put("market", "");
-                                map.put("distinguish", "");
-                                map.put("streetTown", "");
-                                map.put("residentialCommittee", "");
-                                resultYc(map, address, result);
-                            } else {
-                                String addressN = strs[3] == null ? address : strs[3];
-                                if(addressN.startsWith("中山") && !addressN.startsWith("中山街道")){
-                                    addressN = addressN.replace("中山", "中山街道");
-                                }
-                                System.out.println("《《《 查询地址是:  " + addressN + "   》》》");
-                                System.out.println("<<<<<<<   当前条数是:   " + jj + "   条     >>>>>>>>>");
-
-                                AddressResult addressResult = AddressQueryEngine.getInstance().szxSearchByName(addressN);// 使用四中心接口
-                                if(addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1){
-                                    addressResult = mutchNet(addressN);
-                                }
+                            AddressResult addressResult = AddressQueryEngine.getInstance().szxSearchByName(addressN);// 使用四中心接口
+                            if (addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1) {
+                                addressResult = mutchNet(addressN);
+                            }
 
-                                // 使用高德接口
-                                if(addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1){
-                                    addressResult = AddressQueryEngine.getInstance().gdV3SearchByName(addressN);
-                                }
+                            // 使用高德接口
+                            if (addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1) {
+                                addressResult = AddressQueryEngine.getInstance().gdV3SearchByName(addressN);
+                            }
 
-                                if (addressResult != null) {
-                                    addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
-                                    addressResult.setMessage("成功");
-                                    addressResult = AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult);
-                                    if(addressResult.getData() != null && addressResult.getData().size() > 0 && addressResult.getData().get(0) != null){
-                                        setResult(addressResult, map);
-                                        result.add(map);
-                                    } else {
-                                        resultYc(map, address, result);
-                                    }
+                            if (addressResult != null) {
+                                addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
+                                addressResult.setMessage("成功");
+                                addressResult = AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult);
+                                if (addressResult.getData() != null && addressResult.getData().size() > 0 && addressResult.getData().get(0) != null) {
+                                    setResult(addressResult, map);
+                                    result.add(map);
                                 } else {
                                     resultYc(map, address, result);
                                 }
+                            } else {
+                                resultYc(map, address, result);
                             }
                         }
-                    } else {
-                        map.put("provinces", "");
-                        map.put("market", "");
-                        map.put("distinguish", "");
-                        map.put("streetTown", "");
-                        map.put("residentialCommittee", "");
-                        resultYc(map, address, result);
                     }
-                    jj ++;
+                } else {
+                    map.put("provinces", "");
+                    map.put("market", "");
+                    map.put("distinguish", "");
+                    map.put("streetTown", "");
+                    map.put("residentialCommittee", "");
+                    resultYc(map, address, result);
+                }
+                jj++;
 
 //                    if(result.size() % 10000 == 9999){
 //                        System.out.println("<<<<<<<   写入数据,第" + num[0] + " 条    >>>>>>>>>");
@@ -171,17 +171,17 @@ public class 松江地名地址库治理 {
 //
 //                    }
 
-                }
-                System.out.println("<<<<<<<   写入数据,第" + num + " 条    >>>>>>>>>");
-                try {
+            }
+            System.out.println("<<<<<<<   写入数据,第" + num + " 条    >>>>>>>>>");
+            try {
 //                    ExcelReaderUtils.writeToExcel(result, outPath + "880w数据结果-" + num[0] + ".xlsx");
-                    ExcelReaderUtils.writeToExcel(result, outPath);
-                    num++;
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                } finally {
+                ExcelReaderUtils.writeToExcel(result, outPath);
+                num++;
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            } finally {
 
-                }
+            }
 
 //            });
 
@@ -190,16 +190,16 @@ public class 松江地名地址库治理 {
 
     }
 
-    public AddressResult mutchNet(String addressN){
-        for(int i = 0; i < 5; i ++){
+    public AddressResult mutchNet(String addressN) {
+        for (int i = 0; i < 5; i++) {
             AddressResult addressResult = AddressQueryEngine.getInstance().szxSearchByName(addressN);
-            if(addressResult != null)
+            if (addressResult != null)
                 return addressResult;
         }
         return null;
     }
 
-    public void resultYc(Map<String, Object> map, String address, List<Map<String, Object>> result){
+    public void resultYc(Map<String, Object> map, String address, List<Map<String, Object>> result) {
         map.put("residentialCommittee", "");
         map.put("standardAddress", "");
         map.put("returnAddress", "");
@@ -209,7 +209,7 @@ public class 松江地名地址库治理 {
         result.add(map);
     }
 
-    public void setResult(AddressResult addressResult, Map<String, Object> map){
+    public void setResult(AddressResult addressResult, Map<String, Object> map) {
         if (addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1) {
             map.put("matchLevel", "异常");
             map.put("returnAddress", "未匹配到符合规则的结果");
@@ -241,7 +241,7 @@ public class 松江地名地址库治理 {
                             map.put("distinguish", "");
                         }
 //                                  写入sh2000坐标系
-                        if(contentBean.getLat() != null && contentBean.getLon() != null){
+                        if (contentBean.getLat() != null && contentBean.getLon() != null) {
 //                            double[] coord = CoordTransform2.getInstance().wgs84_to_shcj(contentBean.getLon(), contentBean.getLat());
 //                            map.put("lon", coord[0]);
 //                            map.put("lat", coord[1]);
@@ -262,7 +262,7 @@ public class 松江地名地址库治理 {
                         String oldAddress = AddressTools.parseAddressJZ(contentBean.getSearchAddress())[3].
                                 replaceAll(map.get("market") + "", "").replaceAll(map.get("distinguish") + "", "").
                                 replaceAll(map.get("streetTown") + "", "").replaceAll(map.get("residentialCommittee") + "", "");
-                        map.put("standardAddress", "" + map.get("market") +  map.get("distinguish") + map.get("streetTown") + AddressQueryEngine.townReplace_ct(oldAddress));
+                        map.put("standardAddress", "" + map.get("market") + map.get("distinguish") + map.get("streetTown") + AddressQueryEngine.townReplace_ct(oldAddress));
                         break;
                     } else {
                         map.put("matchLevel", "异常");

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

@@ -9,20 +9,15 @@ spring.servlet.multipart.max-request-size=300MB
 #spring.datasource.password=root
 #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 # \u6570\u636E\u5E93\u914D\u7F6E\uFF08\u672C\u5730\u8C03\u8BD5\u73AF\u5883\uFF09
-#spring.datasource.url=jdbc:mysql://127.0.0.1:3307/songjiang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
-#spring.datasource.username=root
-#spring.datasource.password=yysk1234
-#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-# \u6570\u636E\u5E93\u8FDE\u63A5\u4FE1\u606F\uFF08\u5F00\u53D1\u73AF\u5883\uFF09
-#spring.datasource.url=jdbc:transwarp2://172.30.75.126:31768/kjyy_dev
-#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
+spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified&u003fuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false&tinyInt1isBit=false
+spring.datasource.username=postgres
+spring.datasource.password=WE176852439@lmx
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+# JPA\u914D\u7F6E
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=true
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
 # JPA \u914D\u7F6E
 #spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
 #spring.jpa.hibernate.ddl-auto=update

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/geojson/sh_all_administrative_division.geojson


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/geojson/sh_all_residential_committee.geojson


File diff suppressed because it is too large
+ 0 - 5
src/main/resources/geojson/sh_all_towns.geojson


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