AddressQueryEngine.java 30 KB

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