|
@@ -9,18 +9,26 @@ import com.skyversation.poiaddr.service.AreaService;
|
|
|
import com.skyversation.poiaddr.util.net.AddressNetTools;
|
|
|
import com.skyversation.poiaddr.util.status.AddressLevel;
|
|
|
import com.skyversation.poiaddr.util.status.AddressResultEnum;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
|
|
public class AddressQueryEngine {
|
|
|
|
|
|
private static AddressQueryEngine instance = new AddressQueryEngine();
|
|
|
- private AddressQueryEngine(){}
|
|
|
- public synchronized static AddressQueryEngine getInstance(){
|
|
|
- if(instance == null){
|
|
|
+
|
|
|
+ private AddressQueryEngine() {
|
|
|
+ }
|
|
|
+
|
|
|
+ public synchronized static AddressQueryEngine getInstance() {
|
|
|
+ if (instance == null) {
|
|
|
instance = new AddressQueryEngine();
|
|
|
}
|
|
|
return instance;
|
|
@@ -29,8 +37,9 @@ public class AddressQueryEngine {
|
|
|
private WDToken wdToken = null;
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
-
|
|
|
- AddressQueryEngine.getInstance().gdV3SearchByName("上海市青浦区徐泾镇尚茂路226弄通用昱慧苑");
|
|
|
+ String[] address = new String[]{"上海市青浦区未来城"};
|
|
|
+ AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(address,AddressLevel.values()[1]);
|
|
|
+ System.out.println(addressResult);
|
|
|
}
|
|
|
|
|
|
/***
|
|
@@ -44,26 +53,77 @@ public class AddressQueryEngine {
|
|
|
* 5. 结果与基准数据完全一致,则使用。
|
|
|
* @return
|
|
|
*/
|
|
|
- public AddressResult commonSearchByName(String[] addrs, AddressLevel level){
|
|
|
- if(addrs == null || addrs.length < 1){
|
|
|
+ public AddressResult commonSearchByName(String[] addrs, AddressLevel level) {
|
|
|
+ if (addrs == null || addrs.length < 1) {
|
|
|
return null;
|
|
|
}
|
|
|
- for(String addr : addrs){
|
|
|
- verificaData(wdjaSearchByName(addr), level);
|
|
|
+ AddressResult addressResult = new AddressResult();
|
|
|
+ List<AddressResult.ContentBean> contentBeans = new ArrayList<>();
|
|
|
+ for (String addr : addrs) {
|
|
|
+ AddressResult.ContentBean contentBean = verificaData(wdjaSearchByName(addr), level, addr);
|
|
|
+ if (contentBean != null) {
|
|
|
+ contentBeans.add(contentBean);
|
|
|
+ addressResult.setData(contentBeans);
|
|
|
+ addressResult.setCode(AddressResultEnum.WDJA_SUCCESS);
|
|
|
+ addressResult.setMessage("成功");
|
|
|
+ return addressResult;
|
|
|
+ }
|
|
|
}
|
|
|
+ if (addressResult.getData() == null || addressResult.getData().size() == 0) {
|
|
|
+ for (String addr : addrs) {
|
|
|
+ AddressResult.ContentBean contentBean = verificaData(szxSearchByName(addr), level, addr);
|
|
|
+ if (contentBean != null) {
|
|
|
+ contentBeans.add(contentBean);
|
|
|
+ addressResult.setData(contentBeans);
|
|
|
+ addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
|
|
|
+ addressResult.setMessage("成功");
|
|
|
+ return addressResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (addressResult.getData() == null || addressResult.getData().size() == 0) {
|
|
|
+ for (String addr : addrs) {
|
|
|
+ AddressResult.ContentBean contentBean = verificaData(gdSearchByName(addr), level, addr);
|
|
|
+ if (contentBean != null) {
|
|
|
+ contentBeans.add(contentBean);
|
|
|
+ addressResult.setData(contentBeans);
|
|
|
+ addressResult.setCode(AddressResultEnum.GD_SUCCESS);
|
|
|
+ addressResult.setMessage("成功");
|
|
|
+ return addressResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (addressResult.getData() == null || addressResult.getData().size() == 0) {
|
|
|
+ for (String addr : addrs) {
|
|
|
+ AddressResult.ContentBean contentBean = verificaData(gdV3SearchByName(addr), level, addr);
|
|
|
+ if (contentBean != null) {
|
|
|
+ contentBeans.add(contentBean);
|
|
|
+ addressResult.setData(contentBeans);
|
|
|
+ addressResult.setCode(AddressResultEnum.GD_SUCCESS);
|
|
|
+ addressResult.setMessage("成功");
|
|
|
+ return addressResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ addressResult.setCode(AddressResultEnum.RESULT_NULL);
|
|
|
+ addressResult.setMessage("失败");
|
|
|
+ return addressResult;
|
|
|
}
|
|
|
|
|
|
/***
|
|
|
* 武大吉奥单条地名搜索
|
|
|
* @param address
|
|
|
*/
|
|
|
- public AddressResult wdjaSearchByName(String address){
|
|
|
+ public AddressResult wdjaSearchByName(String address) {
|
|
|
System.out.println("<<<<<<<<<<----------开始武大吉奥地名地址搜索------------>>>>>>>>>>>>>");
|
|
|
- if(wdToken == null || System.currentTimeMillis() - wdToken.getTime() > 36000000){
|
|
|
+ if (wdToken == null || System.currentTimeMillis() - wdToken.getTime() > 36000000) {
|
|
|
wdToken = AddressTools.getInstance().getWDToken(Constant.WD_USER_NAME, Constant.WD_USER_PWD);
|
|
|
+ if(wdToken == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
wdToken.setTime(System.currentTimeMillis());
|
|
|
}
|
|
|
- if(wdToken == null)
|
|
|
+ if (wdToken == null)
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.NO_TOKEN, "token获取失败");
|
|
|
String token = wdToken.getToken();
|
|
|
|
|
@@ -74,12 +134,12 @@ public class AddressQueryEngine {
|
|
|
} catch (Exception e) {
|
|
|
e.toString();
|
|
|
}
|
|
|
- if(body == null || body.equals("null") || !StringUtils.hasText(body))
|
|
|
+ if (body == null || body.equals("null") || !StringUtils.hasText(body))
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
try {
|
|
|
JSONObject json = JSONObject.parseObject(body);
|
|
|
return TransfromDataTool.wdResultToResult(json);
|
|
|
- } catch (Exception e){
|
|
|
+ } catch (Exception e) {
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
}
|
|
|
}
|
|
@@ -89,16 +149,41 @@ public class AddressQueryEngine {
|
|
|
* @param address
|
|
|
* @return
|
|
|
*/
|
|
|
- public AddressResult szxSearchByName(String address){
|
|
|
+ public AddressResult szxSearchByName(String address) {
|
|
|
ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.SZX_URL + address, null, null);
|
|
|
- String body = response.getBody() + "";
|
|
|
- if(!StringUtils.hasText(body))
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
- try {
|
|
|
- JSONObject json = JSONObject.parseObject(body);
|
|
|
- return TransfromDataTool.szxResultToResult(json);
|
|
|
- } catch (Exception e){
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ if (response != null) {
|
|
|
+ String body = response.getBody() + "";
|
|
|
+ if (!StringUtils.hasText(body))
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
+ try {
|
|
|
+ JSONObject json = JSONObject.parseObject(body);
|
|
|
+ return getCjWgWgwByLoc(TransfromDataTool.szxResultToResult(json));
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println(e);
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ System.out.println("地址" + address + "未查询到数据!");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public AddressResult v4SearchByName(String address) {
|
|
|
+ ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.V4_URL + address, null, null);
|
|
|
+ if (response != null) {
|
|
|
+ String body = response.getBody() + "";
|
|
|
+ if (!StringUtils.hasText(body))
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
+ try {
|
|
|
+ JSONObject json = JSONObject.parseObject(body);
|
|
|
+ return TransfromDataTool.szxResultToResult(json);
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println(e);
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ System.out.println("地址" + address + "未查询到数据!");
|
|
|
+ return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -107,14 +192,19 @@ public class AddressQueryEngine {
|
|
|
* @param address
|
|
|
* @return
|
|
|
*/
|
|
|
- public AddressResult gdSearchByName(String address){
|
|
|
+ public AddressResult gdSearchByName(String address) {
|
|
|
String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&output=JSON";
|
|
|
ResponseEntity response = AddressNetTools.getInstance().requestGet(geoUrl, null, null);
|
|
|
String body = response.getBody() + "";
|
|
|
- if(!StringUtils.hasText(body))
|
|
|
+ if (!StringUtils.hasText(body))
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
- JSONObject json = JSONObject.parseObject(body);
|
|
|
- return TransfromDataTool.gdResultToResult(json);
|
|
|
+ try {
|
|
|
+ JSONObject json = JSONObject.parseObject(body);
|
|
|
+ return getCjWgWgwByLoc(TransfromDataTool.gdResultToResult(json));
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println(e);
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/***
|
|
@@ -122,14 +212,15 @@ public class AddressQueryEngine {
|
|
|
* @param address
|
|
|
* @return
|
|
|
*/
|
|
|
- public AddressResult gdV3SearchByName(String address){
|
|
|
+ public AddressResult gdV3SearchByName(String address) {
|
|
|
String geoUrl =
|
|
|
+// + Constant.AMAP_SEARCH_TYPES 070500
|
|
|
Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
|
|
|
"&keywords=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&offset=20";
|
|
|
System.out.println("geoUrl:" + geoUrl);
|
|
|
String body = null;
|
|
|
- body = AddressNetTools.getInstance().requestGet(geoUrl,null, null).getBody() + "";
|
|
|
- if(!StringUtils.hasText(body)){
|
|
|
+ body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
|
|
|
+ if (!StringUtils.hasText(body)) {
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
}
|
|
|
JSONArray pois = new JSONArray();
|
|
@@ -137,19 +228,24 @@ public class AddressQueryEngine {
|
|
|
pois.addAll(json.getJSONArray("pois"));
|
|
|
|
|
|
int count = Integer.valueOf(json.get("count") + "");
|
|
|
- if(count > 20){
|
|
|
- for(int i = 2; i < (count % 20 + 1); i ++){
|
|
|
+ if (count > 20) {
|
|
|
+ for (int i = 2; i < (count % 20 + 1); i++) {
|
|
|
geoUrl =
|
|
|
Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
|
|
|
"&keywords=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&offset=20&page=" + i;
|
|
|
- body = AddressNetTools.getInstance().requestGet(geoUrl,null, null).getBody() + "";
|
|
|
- if(!StringUtils.hasText(body)){
|
|
|
+ body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
|
|
|
+ if (!StringUtils.hasText(body)) {
|
|
|
return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
|
|
|
}
|
|
|
pois.addAll(JSONObject.parseObject(body).getJSONArray("pois"));
|
|
|
}
|
|
|
}
|
|
|
- return TransfromDataTool.gdV3ResultToResult(pois);
|
|
|
+ try {
|
|
|
+ return getCjWgWgwByLoc(TransfromDataTool.gdV3ResultToResult(pois));
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println(e);
|
|
|
+ return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -158,47 +254,124 @@ public class AddressQueryEngine {
|
|
|
* @param result
|
|
|
* @return
|
|
|
*/
|
|
|
- public AddressResult getCjWgWgwByLoc(AddressResult result){
|
|
|
- if(result == null || result.getData() == null || result.getData().size() < 1){
|
|
|
+ public AddressResult getCjWgWgwByLoc(AddressResult result) {
|
|
|
+ if (result == null || result.getData() == null || result.getData().size() < 1) {
|
|
|
return result;
|
|
|
} else {
|
|
|
- for(AddressResult.ContentBean content : result.getData()){
|
|
|
- GeoJsonBean cjBean = AreaService.getInstance().isInCJPolygon(content.getLon(), content.getLat());
|
|
|
+ AreaService areaService = AreaService.getInstance();
|
|
|
+ for (AddressResult.ContentBean content : result.getData()) {
|
|
|
+ GeoJsonBean cjBean = areaService.isInCJPolygon(content.getLon(), content.getLat());
|
|
|
content.setCjJson(cjBean == null ? new JSONObject() : cjBean.getProperties());
|
|
|
- GeoJsonBean gridBean = AreaService.getInstance().isInGridPolygon(content.getLon(), content.getLat());
|
|
|
+ GeoJsonBean gridBean = areaService.isInGridPolygon(content.getLon(), content.getLat());
|
|
|
content.setWgwJson(gridBean == null ? new JSONObject() : gridBean.getProperties());
|
|
|
- GeoJsonBean wgridBean = AreaService.getInstance().isInWGridPolygon(content.getLon(), content.getLat());
|
|
|
+ GeoJsonBean wgridBean = areaService.isInWGridPolygon(content.getLon(), content.getLat());
|
|
|
content.setWgwJson(wgridBean == null ? new JSONObject() : wgridBean.getProperties());
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public AddressResult.ContentBean verificaData(AddressResult result, AddressLevel level){
|
|
|
- switch (level){
|
|
|
+ /**
|
|
|
+ * 1. 搜索到结果就返回第一个;
|
|
|
+ * 2. 搜索到结果去除行政区划后,存在包含关系,则使用;
|
|
|
+ * 3. 搜索到结果,数字进行分词,数字匹配则使用;
|
|
|
+ * 4. 搜索到结果,数字与文本均匹配,则使用;
|
|
|
+ * 5. 结果与基准数据完全一致,则使用。
|
|
|
+ *
|
|
|
+ * @param result
|
|
|
+ * @param level
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public AddressResult.ContentBean verificaData(AddressResult result, AddressLevel level, String addr) {
|
|
|
+ switch (level) {
|
|
|
case LEVEL_1 -> {
|
|
|
- if(result != null && result.getData() != null && result.getData().size() > 0){
|
|
|
+ if (result != null && result.getData() != null && result.getData().size() > 0) {
|
|
|
return result.getData().get(0);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
case LEVEL_CONTAINS_2 -> {
|
|
|
-
|
|
|
+ if (result != null && result.getData() != null && result.getData().size() > 0) {
|
|
|
+ List<AddressResult.ContentBean> contentBean = result.getData();
|
|
|
+ for (AddressResult.ContentBean contentBean1 : contentBean) {
|
|
|
+ String address = contentBean1.getAddress().replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", "");
|
|
|
+ String address2 = addr.replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", "");
|
|
|
+ if (address.contains(address2)) {
|
|
|
+ return contentBean1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
case LEVLE_NUMBER_3 -> {
|
|
|
-
|
|
|
+ if (result != null && result.getData() != null && result.getData().size() > 0) {
|
|
|
+ List<AddressResult.ContentBean> contentBean = result.getData();
|
|
|
+ for (AddressResult.ContentBean contentBean1 : contentBean) {
|
|
|
+ String address = extractNumbers(contentBean1.getAddress(), false);
|
|
|
+ String address2 = extractNumbers(addr, false);
|
|
|
+ if (address.contains(address2)) {
|
|
|
+ return contentBean1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
case LEVEL_NUMBER_TEXT_4 -> {
|
|
|
-
|
|
|
+ if (result != null && result.getData() != null && result.getData().size() > 0) {
|
|
|
+ List<AddressResult.ContentBean> contentBean = result.getData();
|
|
|
+ for (AddressResult.ContentBean contentBean1 : contentBean) {
|
|
|
+ String address = extractNumbers(contentBean1.getAddress().replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", ""), true);
|
|
|
+ String address2 = extractNumbers(addr.replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", ""), true);
|
|
|
+ String addressNumber = extractNumbers(contentBean1.getAddress(), false);
|
|
|
+ String addressNumber2 = extractNumbers(addr, false);
|
|
|
+ if (address.contains(address2) && addressNumber.contains(addressNumber2)) {
|
|
|
+ return contentBean1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
case LEVEL_TOTAL_CONTAINS_5 -> {
|
|
|
-
|
|
|
+ if (result != null && result.getData() != null && result.getData().size() > 0) {
|
|
|
+ List<AddressResult.ContentBean> contentBean = result.getData();
|
|
|
+ for (AddressResult.ContentBean contentBean1 : contentBean) {
|
|
|
+ String address = contentBean1.getAddress().replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", "");
|
|
|
+ String address2 = addr.replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", "");
|
|
|
+ if (address.equals(address2)) {
|
|
|
+ return contentBean1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
default -> {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 得到字符串中所有的数字
|
|
|
+ *
|
|
|
+ * @param input
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String extractNumbers(String input, boolean ifString) {
|
|
|
+ // 定义正则表达式,用于匹配一个或多个数字
|
|
|
+ Pattern pattern = Pattern.compile(ifString ? "\\D+" : "\\d+");
|
|
|
+ Matcher matcher = pattern.matcher(input);
|
|
|
+ String out = "";
|
|
|
+ // 查找所有匹配的数字
|
|
|
+ while (matcher.find()) {
|
|
|
+ out += matcher.group();
|
|
|
+ }
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
}
|