AddressQueryEngine.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. package com.skyversation.poiaddr.addquery;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.skyversation.poiaddr.bean.AddressResult;
  5. import com.skyversation.poiaddr.bean.GeoJsonBean;
  6. import com.skyversation.poiaddr.bean.WDToken;
  7. import com.skyversation.poiaddr.service.AreaService;
  8. import com.skyversation.poiaddr.util.ExcelReaderUtils;
  9. import com.skyversation.poiaddr.util.net.AddressNetTools;
  10. import com.skyversation.poiaddr.util.status.AddressLevel;
  11. import com.skyversation.poiaddr.util.status.AddressResultEnum;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.http.ResponseEntity;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.util.StringUtils;
  16. import javax.annotation.PostConstruct;
  17. import javax.annotation.Resource;
  18. import java.io.IOException;
  19. import java.util.*;
  20. import static com.skyversation.poiaddr.addquery.TransfromDataTool.yyszResultToResult;
  21. @Service
  22. public class AddressQueryEngine {
  23. private static AddressQueryEngine instance = new AddressQueryEngine();
  24. @Value("${app.net-type}")
  25. private String netType=null;
  26. @Value("${app.yysz-address-service}")
  27. private String yyszAddressService=null;
  28. @Resource
  29. private DataCallBack dataCallBack;
  30. @PostConstruct
  31. public void init(){
  32. if (netType == null) {
  33. netType = "internet";
  34. System.out.println("spring环境未初始化,使用默认网络环境"+netType);
  35. } else {
  36. // netType = netTypeInProp.getNetType();
  37. System.out.println("通过配置文件获取当前网络环境为:" + netType);
  38. }
  39. }
  40. private AddressQueryEngine() {
  41. }
  42. public synchronized static AddressQueryEngine getInstance() {
  43. if (instance == null) {
  44. instance = new AddressQueryEngine();
  45. }
  46. return instance;
  47. }
  48. private WDToken wdToken = null;
  49. /***
  50. * 单条地名搜索通用方法,搜索顺序 1. 武大吉奥; 2. 市四中心; 3. 高德搜索; 4. 高德高级搜索;
  51. * @param addrs
  52. * @param level 搜索等级:
  53. * 1. 搜索到结果就返回第一个;
  54. * 2. 搜索到结果去除行政区划后,存在包含关系,则使用;
  55. * 3. 搜索到结果,数字进行分词,数字匹配则使用;
  56. * 4. 搜索到结果,数字与文本均匹配,则使用;
  57. * 5. 结果与基准数据完全一致,则使用。
  58. * @return
  59. */
  60. public AddressResult commonSearchByName(List<String> addrs, AddressLevel level) {
  61. if (addrs == null || addrs.size() < 1) {
  62. return null;
  63. }
  64. //先走yysz_address
  65. AddressResult yyszAddressResult =null;
  66. yyszAddressResult = yyszMultiSearch(addrs, level );
  67. if (yyszAddressResult != null) return yyszAddressResult;
  68. if (!Objects.equals(netType, "internet")) {
  69. //武大
  70. if (Objects.equals(netType, "qingpu")) {
  71. AddressResult wdAddressResult = wdMultiSearch(addrs, level);
  72. if (wdAddressResult != null) {
  73. dataCallBack.successDataCallBack(wdAddressResult);
  74. return wdAddressResult;
  75. }
  76. }
  77. //四中心
  78. AddressResult szxAddressResult = szxMultiSearch(addrs, level);
  79. if (szxAddressResult != null) {
  80. dataCallBack.successDataCallBack(szxAddressResult);
  81. return szxAddressResult;
  82. }
  83. }else {
  84. //高德
  85. AddressResult gdAddressResult = gdMultiSearch(addrs, level);
  86. if (gdAddressResult != null) {
  87. dataCallBack.successDataCallBack(gdAddressResult);
  88. return gdAddressResult;
  89. }
  90. //高德高级
  91. AddressResult gdV3AddressResult = gdV3MultiSearch(addrs, level);
  92. if (gdV3AddressResult != null) {
  93. dataCallBack.successDataCallBack(gdV3AddressResult);
  94. return gdV3AddressResult;
  95. }
  96. }
  97. //失败
  98. AddressResult addressResult =new AddressResult();
  99. dataCallBack.failDataCallBack(addrs);
  100. addressResult.setCode(AddressResultEnum.RESULT_NULL);
  101. addressResult.setMessage("失败");
  102. return addressResult;
  103. }
  104. public AddressResult commonSearchByNameForTest(List<String> addrs, AddressLevel level) {
  105. if (addrs == null || addrs.size() < 1) {
  106. return null;
  107. }
  108. if (!Objects.equals(netType, "internet")) {
  109. //武大
  110. if (Objects.equals(netType, "qingpu")) {
  111. AddressResult wdAddressResult = wdMultiSearch(addrs, level);
  112. if (wdAddressResult != null) {
  113. return wdAddressResult;
  114. }
  115. }
  116. //四中心
  117. AddressResult szxAddressResult = szxMultiSearch(addrs, level);
  118. if (szxAddressResult != null) {
  119. return szxAddressResult;
  120. }
  121. }else {
  122. //高德
  123. AddressResult gdAddressResult = gdMultiSearch(addrs, level);
  124. if (gdAddressResult != null) {
  125. return gdAddressResult;
  126. }
  127. //高德高级
  128. AddressResult gdV3AddressResult = gdV3MultiSearch(addrs, level);
  129. if (gdV3AddressResult != null) {
  130. return gdV3AddressResult;
  131. }
  132. }
  133. //失败
  134. AddressResult addressResult =new AddressResult();
  135. addressResult.setCode(AddressResultEnum.RESULT_NULL);
  136. addressResult.setMessage("失败");
  137. return addressResult;
  138. }
  139. //多条搜索
  140. /**
  141. * yysz_address多条搜索
  142. */
  143. private AddressResult yyszMultiSearch(List<String> addrs, AddressLevel level) {
  144. try{
  145. for (String addr : addrs) {
  146. AddressResult.ContentBean contentBean = verificaData(yyszSearchByName(addr), level, addr);
  147. if (contentBean != null) {
  148. contentBean.setSearchAddress(addr);
  149. List<com.skyversation.poiaddr.bean.AddressResult.ContentBean> contentBeans = new ArrayList<>();
  150. contentBeans.add(contentBean);
  151. AddressResult addressResult = new AddressResult();
  152. addressResult.setData(contentBeans);
  153. addressResult.setCode(AddressResultEnum.YYSZ_SUCCESS);
  154. addressResult.setMessage("成功");
  155. return addressResult;
  156. }
  157. }
  158. }catch (Exception e){
  159. throw new RuntimeException("yysz_address服务异常");
  160. }
  161. return null;
  162. }
  163. /**
  164. * 武大多条搜索
  165. */
  166. private AddressResult wdMultiSearch(List<String> addrs, AddressLevel level) {
  167. try {
  168. for (String addr : addrs) {
  169. AddressResult.ContentBean contentBean = verificaData(wdjaSearchByName(addr), level, addr);
  170. if (contentBean != null) {
  171. contentBean.setSearchAddress(addr);
  172. List<com.skyversation.poiaddr.bean.AddressResult.ContentBean> contentBeans = new ArrayList<>();
  173. contentBeans.add(contentBean);
  174. AddressResult addressResult = new AddressResult();
  175. addressResult.setData(contentBeans);
  176. addressResult.setCode(AddressResultEnum.WDJA_SUCCESS);
  177. addressResult.setMessage("成功");
  178. return addressResult;
  179. }
  180. }
  181. } catch (Exception e) {
  182. System.err.println("武大吉奥:日常异常" + e);
  183. }
  184. return null;
  185. }
  186. /**
  187. * 四中心多条搜索
  188. */
  189. private AddressResult szxMultiSearch(List<String> addrs, AddressLevel level) {
  190. try {
  191. for (String addr : addrs) {
  192. AddressResult.ContentBean contentBean = verificaData(szxSearchByName(addr), level, addr);
  193. if (contentBean != null) {
  194. contentBean.setSearchAddress(addr);
  195. List<com.skyversation.poiaddr.bean.AddressResult.ContentBean> contentBeans = new ArrayList<>();
  196. contentBeans.add(contentBean);
  197. AddressResult addressResult = new AddressResult();
  198. addressResult.setData(contentBeans);
  199. addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
  200. addressResult.setMessage("成功");
  201. return addressResult;
  202. }
  203. }
  204. } catch (Exception e) {
  205. System.err.println(" 四中心异常" + e);
  206. }
  207. return null;
  208. }
  209. /**
  210. * 高德多条搜索
  211. */
  212. private AddressResult gdMultiSearch(List<String> addrs, AddressLevel level) {
  213. try {
  214. for (String addr : addrs) {
  215. AddressResult.ContentBean contentBean = verificaData(gdSearchByName(addr), level, addr);
  216. if (contentBean != null) {
  217. contentBean.setSearchAddress(addr);
  218. List<com.skyversation.poiaddr.bean.AddressResult.ContentBean> contentBeans = new ArrayList<>();
  219. contentBeans.add(contentBean);
  220. AddressResult addressResult = new AddressResult();
  221. addressResult.setData(contentBeans);
  222. addressResult.setCode(AddressResultEnum.GD_SUCCESS);
  223. addressResult.setMessage("成功");
  224. return addressResult;
  225. }
  226. }
  227. } catch (Exception e) {
  228. System.err.println("高德异常" + e);
  229. }
  230. return null;
  231. }/**
  232. * 高德高级多条搜索
  233. */
  234. private AddressResult gdV3MultiSearch(List<String> addrs, AddressLevel level) {
  235. try {
  236. for (String addr : addrs) {
  237. AddressResult.ContentBean contentBean = verificaData(gdV3SearchByName(addr), level, addr);
  238. if (contentBean != null) {
  239. contentBean.setSearchAddress(addr);
  240. List<com.skyversation.poiaddr.bean.AddressResult.ContentBean> contentBeans = new ArrayList<>();
  241. contentBeans.add(contentBean);
  242. AddressResult addressResult = new AddressResult();
  243. addressResult.setData(contentBeans);
  244. addressResult.setCode(AddressResultEnum.GDV3_SUCCESS);
  245. addressResult.setMessage("成功");
  246. return addressResult;
  247. }
  248. }
  249. } catch (Exception e) {
  250. System.err.println("高德高级异常" + e);
  251. }
  252. return null;
  253. }
  254. //单搜索
  255. /**
  256. * yysz_address地名搜索
  257. */
  258. public AddressResult yyszSearchByName(String address){
  259. ResponseEntity response = AddressNetTools.getInstance().requestGet(yyszAddressService+"/search/searchByName?address="+address, null, null, 10);
  260. if (response != null) {
  261. String body = response.getBody() + "";
  262. if (!StringUtils.hasText(body))
  263. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  264. try {
  265. AddressResult addressResult = yyszResultToResult(JSONObject.parseObject(body));
  266. if (addressResult==null)System.out.println("yysz_address地址[" + address + "]未查询到数据!");
  267. return addressResult;
  268. } catch (Exception e) {
  269. System.err.println(e);
  270. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  271. }
  272. } else {
  273. System.out.println("yysz_address地址[" + address + "]未查询到数据!");
  274. return null;
  275. }
  276. }
  277. /**
  278. * 武大吉奥单条地名搜索
  279. * @param address
  280. */
  281. public AddressResult wdjaSearchByName(String address) {
  282. System.out.println("<<<<<<<<<<----------开始武大吉奥地名地址搜索------------>>>>>>>>>>>>>");
  283. if (wdToken == null || System.currentTimeMillis() - wdToken.getTime() > 36000000) {
  284. wdToken = AddressTools.getInstance().getWDToken(Constant.WD_USER_NAME, Constant.WD_USER_PWD);
  285. if (wdToken == null) {
  286. return null;
  287. }
  288. wdToken.setTime(System.currentTimeMillis());
  289. }
  290. if (wdToken == null)
  291. return AddressTools.getInstance().faildQuery(AddressResultEnum.NO_TOKEN, "token获取失败");
  292. String token = wdToken.getToken();
  293. String url = Constant.GET_ADDRESS_MEG_URL + "?token=" + token + "&addr=" + address;
  294. String body = null;
  295. try {
  296. body = AddressNetTools.getInstance().wdSendGetRequest(url);
  297. } catch (Exception e) {
  298. e.toString();
  299. }
  300. if (body == null || body.equals("null") || !StringUtils.hasText(body))
  301. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  302. try {
  303. JSONObject json = JSONObject.parseObject(body);
  304. return TransfromDataTool.wdResultToResult(json);
  305. } catch (Exception e) {
  306. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  307. }
  308. }
  309. /**
  310. * 市四中心地名搜索
  311. * @param address
  312. * @return
  313. */
  314. public AddressResult szxSearchByName(String address) {
  315. ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.SZX_URL + "&region=" + Constant.getAMAP_CITY_CODE() + "&query=" + address, null, null, 10);
  316. if (response != null) {
  317. String body = response.getBody() + "";
  318. if (!StringUtils.hasText(body))
  319. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  320. try {
  321. return TransfromDataTool.szxResultToResult(JSONObject.parseObject(body));
  322. } catch (Exception e) {
  323. System.err.println(e);
  324. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  325. }
  326. } else {
  327. System.out.println("地址[" + address + "]未查询到数据!");
  328. return null;
  329. }
  330. }
  331. /*public AddressResult v4SearchByName(String address) {
  332. ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.V4_URL + address, null, null);
  333. if (response != null) {
  334. String body = response.getBody() + "";
  335. if (!StringUtils.hasText(body))
  336. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  337. try {
  338. JSONObject json = JSONObject.parseObject(body);
  339. return TransfromDataTool.szxResultToResult(json);
  340. } catch (Exception e) {
  341. System.err.println(e);
  342. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  343. }
  344. } else {
  345. System.out.println("地址" + address + "未查询到数据!");
  346. return null;
  347. }
  348. }*/
  349. /**
  350. * 高德普通地名搜索
  351. * @param address
  352. * @return
  353. */
  354. public AddressResult gdSearchByName(String address) {
  355. String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
  356. ResponseEntity response = AddressNetTools.getInstance().requestGet(geoUrl, null, null, 0);
  357. if (response != null && response.getBody() != null) {
  358. String body = response.getBody() + "";
  359. if (!StringUtils.hasText(body))
  360. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  361. try {
  362. JSONObject json = JSONObject.parseObject(body);
  363. return TransfromDataTool.gdResultToResult(json);
  364. } catch (Exception e) {
  365. System.err.println(e);
  366. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  367. }
  368. } else {
  369. return null;
  370. }
  371. }
  372. /**
  373. * 高德高级地名搜索
  374. * @param address
  375. * @return
  376. */
  377. public AddressResult gdV3SearchByName(String address) {
  378. String geoUrl =
  379. Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
  380. "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
  381. ResponseEntity responseEntity = AddressNetTools.getInstance().requestGet(geoUrl, null, null, 0);
  382. if (responseEntity.hasBody()) {
  383. String body = responseEntity.getBody() + "";
  384. if (!StringUtils.hasText(body)) {
  385. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
  386. }
  387. JSONArray pois = new JSONArray();
  388. JSONObject json = JSONObject.parseObject(body);
  389. if (json.containsKey("pois")) {
  390. pois.addAll(json.getJSONArray("pois"));
  391. }
  392. if (json.containsKey("count")) {
  393. int count = Integer.parseInt(json.get("count") + "");
  394. if (count > 20) {
  395. for (int i = 2; i < (count % 20 + 1); i++) {
  396. geoUrl =
  397. Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
  398. "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20&page=" + i;
  399. ResponseEntity responseEntity2 = AddressNetTools.getInstance().requestGet(geoUrl, null, null, 0);
  400. if (responseEntity2.hasBody()) {
  401. body = responseEntity2.getBody() + "";
  402. }
  403. if (!StringUtils.hasText(body)) {
  404. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
  405. }
  406. JSONObject json2 = JSONObject.parseObject(body);
  407. if (json2.containsKey(pois)) {
  408. pois.addAll(JSONObject.parseObject(body).getJSONArray("pois"));
  409. }
  410. }
  411. }
  412. }
  413. try {
  414. return TransfromDataTool.gdV3ResultToResult(pois);
  415. } catch (Exception e) {
  416. System.err.println(e);
  417. return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
  418. }
  419. } else {
  420. return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "高德V3分页查询无结果");
  421. }
  422. }
  423. /**
  424. * 根据搜索地址,赋值村居、网格、微格网信息
  425. * @param result
  426. * @return
  427. */
  428. public AddressResult getCjWgWgwByLoc(AddressResult result) {
  429. if (result == null || result.getData() == null || result.getData().size() < 1) {
  430. return result;
  431. } else {
  432. AreaService areaService = AreaService.getInstance();
  433. for (AddressResult.ContentBean content : result.getData()) {
  434. if (content.getLat() != null && content.getLon() != null) {
  435. // TODO 松江的话只跑行政区划和街镇
  436. /*GeoJsonBean cjBean = areaService.isInCJPolygon(content.getLon(), content.getLat());
  437. content.setCjJson(cjBean == null ? new JSONObject() : cjBean.getProperties());
  438. GeoJsonBean gridBean = areaService.isInGridPolygon(content.getLon(), content.getLat());
  439. content.setWgwJson(gridBean == null ? new JSONObject() : gridBean.getProperties());
  440. GeoJsonBean wgridBean = areaService.isInWGridPolygon(content.getLon(), content.getLat());
  441. content.setWgwJson(wgridBean == null ? new JSONObject() : wgridBean.getProperties());*/
  442. GeoJsonBean adBean = areaService.isInadPolygon(content.getLon(), content.getLat());
  443. content.setAdJson(adBean == null ? new JSONObject() : adBean.getProperties());
  444. GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
  445. content.setTownJson(townBean == null ? new JSONObject() : townBean.getProperties());
  446. }
  447. }
  448. return result;
  449. }
  450. }
  451. //
  452. public static boolean isNotEmptyOrBlank(String str) {
  453. return str != null && !str.trim().isEmpty();
  454. }
  455. /**
  456. * 1. 搜索到结果就返回第一个;
  457. * 2. 搜索到结果去除行政区划后,存在包含关系,则使用;
  458. * 3. 搜索到结果,数字进行分词,数字匹配则使用;
  459. * 4. 搜索到结果,数字与文本均匹配,则使用;
  460. * 5. 结果与基准数据完全一致,则使用。
  461. *
  462. * @param result
  463. * @param level
  464. * @return
  465. */
  466. public AddressResult.ContentBean verificaData(AddressResult result, AddressLevel level, String addr) {
  467. switch (level) {
  468. case LEVEL_1: {
  469. if (result != null && result.getData() != null && result.getData().size() > 0) {
  470. return result.getData().get(0);
  471. } else {
  472. return null;
  473. }
  474. }
  475. // 2. 搜索到结果去除行政区划后,存在包含关系,则使用;
  476. case LEVEL_CONTAINS_2: {
  477. if (result != null && result.getData() != null && result.getData().size() > 0) {
  478. List<AddressResult.ContentBean> contentBean = result.getData();
  479. for (AddressResult.ContentBean contentBean1 : contentBean) {
  480. if (contentBean1.getAddress() != null) {
  481. String address = townReplaceAll(addressReplaceAll(contentBean1.getAddress()));
  482. String address2 = townReplaceAll(addressReplaceAll(addr));
  483. if (isNotEmptyOrBlank(address) && address.contains(address2)) {
  484. return contentBean1;
  485. }
  486. }
  487. }
  488. } else {
  489. return null;
  490. }
  491. }
  492. // 3. 搜索到结果,数字进行分词,数字匹配则使用;
  493. case LEVLE_NUMBER_3: {
  494. if (result != null && result.getData() != null && result.getData().size() > 0) {
  495. List<AddressResult.ContentBean> contentBean = result.getData();
  496. for (AddressResult.ContentBean contentBean1 : contentBean) {
  497. if (contentBean1.getAddress() != null) {
  498. Set<String> address = tokenizeString(contentBean1.getAddress()).get(1);
  499. if (address != null && address.size() > 1) {
  500. Set<String> address2 = tokenizeString(addr).get(1);
  501. int addressSize = address.size();
  502. for (String addr2 : address2) {
  503. if (address.contains(addr2)) {
  504. addressSize--;
  505. if (addressSize == 0) {
  506. return contentBean1;
  507. }
  508. }
  509. }
  510. }
  511. }
  512. }
  513. } else {
  514. return null;
  515. }
  516. }
  517. // 4. 搜索到结果,数字与文本均匹配,则使用;
  518. case LEVEL_NUMBER_TEXT_4: {
  519. if (result != null && result.getData() != null && result.getData().size() > 0) {
  520. List<AddressResult.ContentBean> contentBean = result.getData();
  521. for (AddressResult.ContentBean contentBean1 : contentBean) {
  522. if (contentBean1.getAddress() != null) {
  523. Set<String> addressString = tokenizeString(contentBean1.getAddress()).get(0);
  524. Set<String> addressNumber = tokenizeString(contentBean1.getAddress()).get(1);
  525. Set<String> address2String = tokenizeString(addr).get(0);
  526. Set<String> address2Number = tokenizeString(addr).get(1);
  527. if (addressString != null && addressString.size() > 1) {
  528. int addressStrSize = addressString.size();
  529. for (String addr2str : address2String) {
  530. if (addressString.contains(addr2str)) {
  531. addressStrSize--;
  532. if (addressStrSize == 0) {
  533. int addressNumSize = addressNumber.size();
  534. for (String addr2Num : address2Number) {
  535. if (addressNumber.contains(addr2Num)) {
  536. addressNumSize--;
  537. if (addressNumSize == 0) {
  538. return contentBean1;
  539. }
  540. }
  541. }
  542. }
  543. }
  544. }
  545. }
  546. }
  547. }
  548. } else {
  549. return null;
  550. }
  551. }
  552. // 结果与基准数据完全一致,则使用。
  553. case LEVEL_TOTAL_CONTAINS_5: {
  554. if (result != null && result.getData() != null && result.getData().size() > 0) {
  555. List<AddressResult.ContentBean> contentBean = result.getData();
  556. for (AddressResult.ContentBean contentBean1 : contentBean) {
  557. if (contentBean1.getAddress() != null) {
  558. String address = addressReplaceAll(contentBean1.getAddress());
  559. String address2 = addressReplaceAll(addr);
  560. if (isNotEmptyOrBlank(address) && address.equals(address2)) {
  561. return contentBean1;
  562. }
  563. }
  564. }
  565. } else {
  566. return null;
  567. }
  568. }
  569. default: {
  570. return null;
  571. }
  572. }
  573. }
  574. public static String addressReplaceAll(String address) {
  575. return address.replaceAll("上海市", "").replaceAll(Constant.getArea() + "区", "").replaceAll("-", "").replaceAll("_", "").replaceAll("/", "").replaceAll(" ", "").replaceAll(",", "").replaceAll("\\.", "").replaceAll(",", "").replaceAll("。", "").replaceAll("\\+", "").replaceAll("\\*", "");
  576. }
  577. public static String townReplaceAll(String address) {
  578. String[] towns = Constant.getTowns();
  579. for (String town : towns) {
  580. address = address.replaceAll(town, "");
  581. }
  582. return address.replaceAll("号", "0").replaceAll("弄", "0").replaceAll("室", "0").replaceAll("户", "0").replaceAll("单元", "0").replaceAll("幢", "0");
  583. }
  584. /**
  585. * 数字和文字分词返回List<Set<String>>
  586. *
  587. * @param input
  588. * @return
  589. */
  590. public static List<Set<String>> tokenizeString(String input) {
  591. input = townReplaceAll(input);
  592. // 初始化两个集合,一个用于存储非数字字符串,一个用于存储数字字符串
  593. Set<String> nonNumberSet = new HashSet<>();
  594. Set<String> numberSet = new HashSet<>();
  595. StringBuilder currentToken = new StringBuilder();
  596. for (int i = 0; i < input.length(); i++) {
  597. char c = input.charAt(i);
  598. if (Character.isDigit(c)) {
  599. // 如果当前字符是数字
  600. if (currentToken.length() > 0 && !Character.isDigit(currentToken.charAt(0))) {
  601. // 如果之前的 token 是非数字,将其添加到非数字集合中
  602. nonNumberSet.add(currentToken.toString());
  603. currentToken.setLength(0);
  604. }
  605. currentToken.append(c);
  606. } else {
  607. // 如果当前字符不是数字
  608. if (currentToken.length() > 0 && Character.isDigit(currentToken.charAt(0))) {
  609. // 如果之前的 token 是数字,将其添加到数字集合中
  610. numberSet.add(currentToken.toString());
  611. currentToken.setLength(0);
  612. }
  613. if (!Character.isWhitespace(c)) {
  614. currentToken.append(c);
  615. }
  616. }
  617. }
  618. // 处理最后一个 token
  619. if (currentToken.length() > 0) {
  620. if (Character.isDigit(currentToken.charAt(0))) {
  621. numberSet.add(currentToken.toString());
  622. } else {
  623. nonNumberSet.add(currentToken.toString());
  624. }
  625. }
  626. // 将两个集合添加到列表中
  627. List<Set<String>> result = new ArrayList<>();
  628. result.add(nonNumberSet);
  629. result.add(numberSet);
  630. return result;
  631. }
  632. }