AreaService.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. package com.skyversation.poiaddr.service;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.skyversation.poiaddr.addquery.AddressQueryEngine;
  5. import com.skyversation.poiaddr.addquery.Constant;
  6. import com.skyversation.poiaddr.bean.*;
  7. import com.skyversation.poiaddr.config.DbConnection;
  8. import com.skyversation.poiaddr.service.impl.GrTableRepository;
  9. import com.skyversation.poiaddr.service.impl.PgTableRepository;
  10. import com.skyversation.poiaddr.service.impl.TAddressCallbackRepository;
  11. import com.skyversation.poiaddr.service.impl.YyszAddressRepository;
  12. import com.skyversation.poiaddr.util.MessageManage;
  13. import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
  14. import com.skyversation.poiaddr.util.SplitAddress;
  15. import com.skyversation.poiaddr.util.tasks.ScheduledTasks;
  16. import org.geotools.geojson.geom.GeometryJSON;
  17. import org.geotools.geometry.jts.JTSFactoryFinder;
  18. import org.locationtech.jts.geom.Geometry;
  19. import org.locationtech.jts.geom.MultiPolygon;
  20. import org.locationtech.jts.io.ParseException;
  21. import org.locationtech.jts.io.WKTReader;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.core.io.ClassPathResource;
  24. import org.springframework.data.domain.Page;
  25. import org.springframework.data.domain.PageRequest;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import org.springframework.util.StringUtils;
  29. import javax.annotation.PostConstruct;
  30. import javax.annotation.Resource;
  31. import java.io.*;
  32. import java.util.*;
  33. @Service
  34. public class AreaService {
  35. private static AreaService instance;
  36. @Resource
  37. private YyszAddressRepository yyszAddressRepository;
  38. @Resource
  39. private TAddressCallbackRepository tAddressCallbackRepository;
  40. @Resource
  41. private GrTableRepository grTableRepository;
  42. @Resource
  43. private PgTableRepository pgTableRepository;
  44. public static AreaService getInstance() {
  45. if (instance == null) {
  46. return new AreaService();
  47. }
  48. return instance;
  49. }
  50. @Value("${app.area}")
  51. private String area;
  52. @Value("${app.town}")
  53. private String town;
  54. @Value("${app.db.search_table_name}")
  55. private String searchTableName;
  56. @Value("${app.db.pgi_table}")
  57. private String pgi_table;
  58. @Value("${app.db.gr_table}")
  59. private String gr_table;
  60. @Value("${app.db.rp_table}")
  61. private String rp_table;
  62. WKTReader reader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
  63. public List<GeoJsonBean> shAllAdministrativeDivisionPolygonList = new ArrayList<>();
  64. public List<GeoJsonBean> shAllToensPolygonList = new ArrayList<>();
  65. public List<GeoJsonBean> shAllResidentialCommitteeList = new ArrayList<>();
  66. public List<GeoJsonBean> wgPolygonList = new ArrayList<>();
  67. public List<GeoJsonBean> wgwPolygonList = new ArrayList<>();
  68. public List<GeoJsonBean> zhwgPolygonList = new ArrayList<>();
  69. @PostConstruct
  70. public void initGeoData() {
  71. System.out.println("<<<<<<<<------AreaService>initGeoData------>>>>>>>>>");
  72. instance = this;
  73. Thread thread3 = new Thread(this::initPolygons);
  74. thread3.start();
  75. try {
  76. thread3.join();
  77. } catch (InterruptedException e) {
  78. e.printStackTrace();
  79. }
  80. // TODO 初始化配置文件变量
  81. Constant.setTowns(town.split(","));
  82. Constant.setArea(area);
  83. Constant.setSearchTableName(searchTableName);
  84. Constant.setGrTable(gr_table);
  85. Constant.setPgiTable(pgi_table);
  86. Constant.setRpTable(rp_table);
  87. System.out.println("<<<<<<<<------根据配置文件为AREA赋值:" + Constant.getArea());
  88. System.out.println("<<<<<<<<------当前AMAP_CITY_CODE:" + Constant.getAMAP_CITY_CODE());
  89. System.out.println("<<<<<<<<------结果总表:" + Constant.getGrTable());
  90. System.out.println("<<<<<<<<------中间表:" + Constant.getPgiTable());
  91. System.out.println("<<<<<<<<------回匹表:" + Constant.getRpTable());
  92. // TODO 网络连通性测试,可以请求一下测试的市中心地址
  93. try {
  94. System.out.println("电脑最大线程数:" + Runtime.getRuntime().availableProcessors());
  95. System.out.println("<<<<<<<<------开始网络连通性测试");
  96. long startTime = System.currentTimeMillis();
  97. List<String> addrs = new ArrayList<>();
  98. addrs.add("上海市松江区乐都路339号");
  99. AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs);
  100. long endTime = System.currentTimeMillis();
  101. System.out.println(">>>>>>>>------网络连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!结果:" + addressResult);
  102. } catch (Exception e) {
  103. System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
  104. }
  105. // 查询callback表中最大的id和添加到callBackAllErrorAddrs列表中
  106. try {
  107. List<TAddressCallback> tAddressCallbacks = tAddressCallbackRepository.findAll();
  108. if (tAddressCallbacks.size() > 0) {
  109. for (TAddressCallback tAddressCallback : tAddressCallbacks) {
  110. ScheduledTasks.callBackAllErrorAddrs.add(tAddressCallback.getSearchAddress());
  111. }
  112. }
  113. } catch (Exception e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. public void initPolygons() {
  118. List<List<GeoJsonBean>> lis = new ArrayList<>();
  119. lis.add(shAllAdministrativeDivisionPolygonList);
  120. lis.add(shAllToensPolygonList);
  121. lis.add(shAllResidentialCommitteeList);
  122. lis.add(wgPolygonList);
  123. lis.add(wgwPolygonList);
  124. lis.add(zhwgPolygonList);
  125. String[] path = new String[]{"geojson/上海市_区县边界.geojson", "geojson/上海市_乡镇边界.geojson", "geojson/上海市_村居边界.geojson", "geojson/责任网格-wgs84.geojson", "geojson/青浦区微网格-wgs84.geojson", "geojson/青浦区综合网格.geojson"};
  126. for (int j = 0; j < path.length; j++) {
  127. BufferedReader reader = null;
  128. try {
  129. // 创建 ClassPathResource 对象,指定静态文件的路径
  130. ClassPathResource resource = new ClassPathResource(path[j]);
  131. // 获取文件的输入流
  132. reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
  133. String line;
  134. StringBuilder sb = new StringBuilder();
  135. while ((line = reader.readLine()) != null) {
  136. sb.append(line).append("\r\n");
  137. }
  138. reader.close();
  139. JSONObject json = JSONObject.parseObject(sb.toString());
  140. JSONArray featrues = json.getJSONArray("features");
  141. for (int i = 0; i < featrues.size(); i++) {
  142. JSONObject properties = featrues.getJSONObject(i).getJSONObject("properties");
  143. JSONObject geoJson = new JSONObject();
  144. geoJson.put("type", "MultiPolygon");
  145. geoJson.put("coordinates",
  146. featrues.getJSONObject(i).getJSONObject("geometry").getJSONArray("coordinates"));
  147. GeometryJSON geometryJSON = new GeometryJSON();
  148. MultiPolygon multiPolygon = geometryJSON.readMultiPolygon(geoJson.toJSONString());
  149. GeoJsonBean geoJsonBean = new GeoJsonBean();
  150. geoJsonBean.setProperties(properties);
  151. geoJsonBean.setMultiPolygon(multiPolygon);
  152. lis.get(j).add(geoJsonBean);
  153. }
  154. } catch (IOException e) {
  155. e.printStackTrace();
  156. System.out.println("<<<<<<<<------run geo data error------>>>>>>>>>");
  157. }
  158. }
  159. System.out.println("<<<<<<<<------run geo data complete------>>>>>>>>>");
  160. }
  161. public void putAllDmdzData(String addr, YyskDmdzAddressStandardization item) {
  162. if (StringUtils.hasText(addr)) {
  163. if (addr.contains("号")) {
  164. addr = addr.substring(0, addr.indexOf("号"));
  165. }
  166. if (addr.contains("弄")) {
  167. addr = addr.substring(0, addr.indexOf("弄"));
  168. }
  169. if (!ScheduledTasks.allDmdzData.containsKey(addr)) {
  170. List<YyskDmdzAddressStandardization> datas = new ArrayList<>();
  171. datas.add(item);
  172. ScheduledTasks.allDmdzData.put(addr, datas);
  173. } else if (ScheduledTasks.allDmdzData.get(addr).size() < 20) {
  174. ScheduledTasks.allDmdzData.get(addr).add(item);
  175. }
  176. }
  177. }
  178. /**
  179. * 缓存地址库数据
  180. */
  181. public void getAllDmdzAddressDatas() {
  182. long startTime = System.currentTimeMillis();
  183. // 先查询到所有数据
  184. getDmdzDataByPage(0, 10000);
  185. System.out.println("ScheduledTasks.allDmdzData初始化完成,有" + ScheduledTasks.allDmdzData.size() + "条记录保存到缓存中,用时" + (System.currentTimeMillis() - startTime) / 1000 + "秒");
  186. }
  187. /**
  188. * JPA的形式加载所有地址信息到缓存
  189. *
  190. * @param maxOid
  191. * @param pageSize
  192. */
  193. @Transactional(readOnly = true)
  194. public void getDmdzDataByPage(int maxOid, int pageSize) {
  195. System.out.println("maxOid:" + maxOid + "pageSize:" + pageSize);
  196. long sTime = System.currentTimeMillis();
  197. List<YyskDmdzAddressStandardization> dataList = yyszAddressRepository.getAllByOidPage(maxOid, pageSize);
  198. System.out.println("当前OID" + maxOid + "查询完成,用时:" + (System.currentTimeMillis() - sTime) + "毫秒!");
  199. // TODO 经测试发现一次性读全表,内存根本吃不消
  200. for (YyskDmdzAddressStandardization item : dataList) {
  201. if (item.getAddress() != null && StringUtils.hasText(item.getAddress())) {
  202. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(item.getAddress());
  203. putAllDmdzData(splitAddress.getAddr(), item);
  204. if (item.getSourceaddress() != null && StringUtils.hasText(item.getSourceaddress())) {
  205. SplitAddress splitAddress2 = ShanghaiAddressSplitUtil.splitBestAddress(item.getSourceaddress());
  206. if (!splitAddress.getAddr().equals(splitAddress2.getAddr())) {
  207. putAllDmdzData(splitAddress2.getAddr(), item);
  208. }
  209. }
  210. } else if (item.getSourceaddress() != null && StringUtils.hasText(item.getSourceaddress())) {
  211. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(item.getSourceaddress());
  212. putAllDmdzData(splitAddress.getAddr(), item);
  213. }
  214. if (item.getOid() > maxOid) {
  215. maxOid = item.getOid();
  216. }
  217. }
  218. System.out.println("当前OID" + maxOid + "缓存处理完成,ScheduledTasks.allDmdzData.size():" + ScheduledTasks.allDmdzData.size() + ",用时:" + (System.currentTimeMillis() - sTime) / 1000 + "秒!");
  219. if (dataList.size() > 0) {
  220. getDmdzDataByPage(maxOid, pageSize);
  221. } else {
  222. System.out.println("分页查询结束");
  223. }
  224. }
  225. public void selectLimitData(int page, int pageSize) {
  226. Map<String, Object> loginfoMap = new HashMap<>();
  227. loginfoMap.put("page", page);
  228. loginfoMap.put("pageSize", pageSize);
  229. try {
  230. long startTime = System.currentTimeMillis();
  231. loginfoMap.put("startTime", startTime);
  232. // 分页查询中间表数据
  233. List<PendingGovernanceIntermediateTable> dataList = pgTableRepository.getAllgovernance_statusPage(pageSize);
  234. List<GovernanceResultsTable> governanceResultsTables = new ArrayList<>();
  235. System.out.println("page:" + page + ",pageSize:" + pageSize + ",共查询待处理表数据:" + dataList.size() + "条数据,用时:" + (System.currentTimeMillis() - startTime) + "毫秒");
  236. int i = 0;
  237. if (dataList.size() > 0) {
  238. for (PendingGovernanceIntermediateTable item : dataList) {
  239. i++;
  240. System.out.print(">" + i);
  241. AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(item.getOriginalAddress());
  242. GovernanceResultsTable governanceResultsTable = new GovernanceResultsTable();
  243. governanceResultsTable.setOriginalAddress(item.getOriginalAddress());
  244. governanceResultsTable.setBatchNumber(item.getBatchNumber());
  245. governanceResultsTable.setDataTable(item.getDataTable());
  246. governanceResultsTable.setInData(new Date());
  247. governanceResultsTable.setDataTag(item.getDataTag());
  248. if (addressResult == null || addressResult.getData() == null || addressResult.getData().get(0) == null) {
  249. // 自动的
  250. AreaService.getInstance().callBackErrorAddr(item.getOriginalAddress());
  251. governanceResultsTable.setMatchLevel("异常");
  252. } else {
  253. AddressResult.ContentBean contentBean = addressResult.getData().get(0);
  254. // 然后把匹配到的数据放到结果表
  255. governanceResultsTable.setStandardAddress(contentBean.getStandAddr());
  256. governanceResultsTable.setAbbreviatedAddress(contentBean.getAddress());
  257. governanceResultsTable.setCity(contentBean.getPname());
  258. governanceResultsTable.setCounty(contentBean.getCityname());
  259. governanceResultsTable.setTown(contentBean.getAdname());
  260. governanceResultsTable.setCommunity(contentBean.getCommunity());
  261. governanceResultsTable.setLon(contentBean.getLon());
  262. governanceResultsTable.setLat(contentBean.getLat());
  263. governanceResultsTable.setMatchLevel(contentBean.getScore());
  264. }
  265. governanceResultsTables.add(governanceResultsTable);
  266. item.setGovernanceStatus(1L);
  267. }
  268. long startTime2 = System.currentTimeMillis();
  269. pgTableRepository.saveAll(dataList);
  270. long startTime3 = System.currentTimeMillis();
  271. grTableRepository.saveAll(governanceResultsTables);
  272. long endTime = System.currentTimeMillis();
  273. loginfoMap.put("endTime", endTime);
  274. String logStrMsg = "数据库查询待处理表page:" + page + ",pageSize:" + pageSize + ",处理数据条数:" + dataList.size() + "条,用时:" + (startTime2 - startTime) + "毫秒," +
  275. "更新状态用时" + (startTime3 - startTime2) / 1000 + "秒!" +
  276. "入库数据:" + governanceResultsTables.size() + "条,用时" + (endTime - startTime3) / 1000 + "秒!" +
  277. "总用时" + (endTime - startTime) / 1000 + "秒!";
  278. loginfoMap.put("message", logStrMsg);
  279. System.out.println(logStrMsg);
  280. // TODO 要使用JDBC的方式去查询待处理表的数据,然后有个sql需要执行一下,筛选出结果表中不存在的数据,然后进行下一步处理。
  281. if (dataList.size() >= pageSize) {
  282. page++;
  283. selectLimitData(page, pageSize);
  284. }
  285. }
  286. } catch (Exception e) {
  287. e.printStackTrace();
  288. loginfoMap.put("endTime", System.currentTimeMillis());
  289. loginfoMap.put("message", "异常页码:" + page + ",error:" + e);
  290. } finally {
  291. ScheduledTasks.logInfos.add(loginfoMap);
  292. }
  293. }
  294. /**
  295. * 批量插入数据到callback表
  296. */
  297. public void callBackAddrs() {
  298. // TOOD jpa
  299. try {
  300. List<TAddressCallback> tAddressCallbacks = tAddressCallbackRepository.saveAll(ScheduledTasks.callBackDatas);
  301. if (tAddressCallbacks.size() > 0) {
  302. ScheduledTasks.callBackDatas.clear();
  303. System.out.println("数据回流成功");
  304. }
  305. } catch (Exception e) {
  306. e.printStackTrace();
  307. System.out.println("数据回流异常:" + e);
  308. }
  309. // TODO sql
  310. /*StringBuilder sql = new StringBuilder("insert into t_address_callback (id,create_time,address,name,provice_name,city_name,town_name,community_name,status,process_status,is_new) values ");
  311. for (String addr : ScheduledTasks.callBackAddrs) {
  312. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
  313. ScheduledTasks.callBackMaxId++;
  314. sql.append("(").append(ScheduledTasks.callBackMaxId).append(1).append(",'").append(ScheduledTasks.getCurrentDateTime()).append("','").append(addr).append("','").append(splitAddress.getAddr()).append("','").append(splitAddress.getProvince()).append("','").append(splitAddress.getCity()).append("','").append(splitAddress.getStreet()).append("','").append(splitAddress.getCommunity()).append("',").append(0).append(",").append(0).append(",").append(1).append(") ,");
  315. }
  316. try {
  317. DbConnection.getInstance().updateSql(sql.substring(0, sql.toString().length() - 2));
  318. ScheduledTasks.callBackAddrs.clear();
  319. System.out.println("数据回流成功");
  320. } catch (Exception e) {
  321. e.printStackTrace();
  322. System.out.println("数据回流异常:" + e);
  323. }*/
  324. }
  325. /**
  326. * 是否写入callBack表判断
  327. *
  328. * @param addrStr
  329. */
  330. public void callBackErrorAddr(String addrStr) {
  331. // System.out.println("尝试回流无结果数据:" + addrStr);
  332. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addrStr);
  333. if (splitAddress.getStatus() == 3 || splitAddress.getStatus() == -1) {
  334. // System.out.println("拒绝回流,检测到非地址");
  335. return;
  336. } else {
  337. // 查询回流列表中是否存在
  338. if (!ScheduledTasks.callBackAllErrorAddrs.contains(addrStr)) {
  339. TAddressCallback tAddressCallback = new TAddressCallback();
  340. tAddressCallback.setSearchAddress(addrStr);
  341. ScheduledTasks.callBackDatas.add(tAddressCallback);
  342. ScheduledTasks.callBackAllErrorAddrs.add(addrStr);
  343. // System.out.println("回流成功,等待进一检查处理");
  344. } else {
  345. // System.out.println("回流列表中已存在该数据!");
  346. }
  347. }
  348. }
  349. /**
  350. * 数据库查询 尝试给出推荐结果
  351. *
  352. * @param splitAddress
  353. * @return
  354. */
  355. /*public List<Address> getRecommendAddress(SplitAddress splitAddress) {
  356. if (splitAddress.getCity() == null) {
  357. splitAddress.setCity("");
  358. }
  359. if (splitAddress.getDistrict() == null) {
  360. splitAddress.setDistrict("");
  361. }
  362. if (splitAddress.getStreet() == null) {
  363. splitAddress.setStreet("");
  364. }
  365. if (splitAddress.getCommunity() == null) {
  366. splitAddress.setCommunity("");
  367. }
  368. String sql = "select * from " + Constant.getSearchTableName() + " WHERE city like '%" + splitAddress.getCity() + "%' " +
  369. "and county like '%" + splitAddress.getDistrict() + "%' and town like '%" + splitAddress.getStreet() + "%' " +
  370. "and community like '%" + splitAddress.getCommunity() + "%' order by updatetime desc LIMIT 20";
  371. try {
  372. return odsToAddr(DbConnection.getInstance().runSqlStr(sql));
  373. } catch (Exception e) {
  374. return null;
  375. }
  376. }*/
  377. // 进行数据库查询
  378. /*public List<Address> getAddressPoisByAddr(SplitAddress splitAddress) {
  379. if (splitAddress.getAddr().contains("号")) {
  380. splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().lastIndexOf("号")));
  381. }
  382. if (splitAddress.getAddr().contains("弄")) {
  383. splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().lastIndexOf("弄")));
  384. }
  385. if (splitAddress.getSearchAddr() == null) {
  386. splitAddress.setSearchAddr(splitAddress.getAddr());
  387. }
  388. List<Address> list = null;
  389. if (StringUtils.hasText(splitAddress.getDistrict())) {
  390. String sql = "select * from " + Constant.getSearchTableName() + " WHERE county like '%" + splitAddress.getDistrict() + "%' " +
  391. "and (sourceaddress like '%" + splitAddress.getSearchAddr() + "%' or address like '%" + splitAddress.getSearchAddr() + "%') order by updatetime desc LIMIT 20";
  392. try {
  393. list = odsToAddr(DbConnection.getInstance().runSqlStr(sql));
  394. } catch (Exception e) {
  395. list = null;
  396. }
  397. }
  398. if (list == null) {
  399. String sql = "select * from " + Constant.getSearchTableName() + " WHERE sourceaddress like '%" + splitAddress.getSearchAddr() + "%' or address like '%" + splitAddress.getSearchAddr() + "%' order by updatetime desc LIMIT 20";
  400. try {
  401. list = odsToAddr(DbConnection.getInstance().runSqlStr(sql));
  402. } catch (Exception e) {
  403. list = null;
  404. }
  405. }
  406. return list;
  407. }*/
  408. /**
  409. * 根据地址关键字查询数据库结果
  410. *
  411. * @return
  412. */
  413. /*public List<Address> getAddressPoiOnlyDB(String addr) {
  414. try {
  415. return odsToAddr(DbConnection.getInstance().runSqlStr("select * from " + Constant.getSearchTableName() + " WHERE sourceaddress LIKE '%" + addr + "%' or address LIKE '%" + addr + "%' order by updatetime desc LIMIT 20"));
  416. } catch (Exception e) {
  417. e.printStackTrace();
  418. }
  419. return null;
  420. }*/
  421. public List<YyskDmdzAddressStandardization> getAddressPoisByAddr(SplitAddress splitAddress) {
  422. if (splitAddress.getAddr().contains("号")) {
  423. splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().indexOf("号")));
  424. }
  425. if (splitAddress.getAddr().contains("弄")) {
  426. splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().indexOf("弄")));
  427. }
  428. if (splitAddress.getSearchAddr() == null) {
  429. splitAddress.setSearchAddr(splitAddress.getAddr());
  430. }
  431. List<YyskDmdzAddressStandardization> list = new ArrayList<>();
  432. if (StringUtils.hasText(splitAddress.getDistrict())) {
  433. // TODO 数据库查询逻辑调整为内存处理的方式
  434. List<YyskDmdzAddressStandardization> dmdzList = new ArrayList<>();
  435. if (ScheduledTasks.allDmdzData.containsKey(splitAddress.getSearchAddr())) {
  436. dmdzList = ScheduledTasks.allDmdzData.get(splitAddress.getSearchAddr());
  437. } else {
  438. for (String key : ScheduledTasks.allDmdzData.keySet()) {
  439. if (splitAddress.getSearchAddr().contains(key)) {
  440. dmdzList = ScheduledTasks.allDmdzData.get(key);
  441. }
  442. }
  443. }
  444. for (YyskDmdzAddressStandardization item : dmdzList) {
  445. if (item.getCounty().contains(splitAddress.getDistrict())) {
  446. if (list.size() < 20) {
  447. list.add(item);
  448. } else {
  449. break;
  450. }
  451. }
  452. }
  453. // TODO 数据库查询的方式
  454. // list = yyszAddressRepository.getAddressPoisByAddrAQX(splitAddress.getDistrict(), splitAddress.getSearchAddr());
  455. }
  456. if (list.size() == 0) {
  457. list = getAddressPoiOnlyDB(splitAddress.getSearchAddr());
  458. }
  459. return list;
  460. }
  461. public List<YyskDmdzAddressStandardization> getAddressPoiOnlyDB(String addr) {
  462. // TODO 数据库查询逻辑调整为内存处理的方式
  463. List<YyskDmdzAddressStandardization> returnDatas = new ArrayList<>();
  464. if (ScheduledTasks.allDmdzData.containsKey(addr)) {
  465. returnDatas = ScheduledTasks.allDmdzData.get(addr);
  466. } else {
  467. for (String key : ScheduledTasks.allDmdzData.keySet()) {
  468. if (key.contains(addr)) {
  469. returnDatas = ScheduledTasks.allDmdzData.get(key);
  470. }
  471. }
  472. if (returnDatas == null || returnDatas.size() == 0) {
  473. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
  474. if (splitAddress.getAddr() != null && splitAddress.getAddr().length() > 0 && StringUtils.hasText(splitAddress.getAddr()))
  475. for (String key : ScheduledTasks.allDmdzData.keySet()) {
  476. if (key.contains(splitAddress.getAddr())) {
  477. returnDatas = ScheduledTasks.allDmdzData.get(key);
  478. }
  479. }
  480. }
  481. }
  482. return returnDatas;
  483. // TODO 数据库查询的方式
  484. // return yyszAddressRepository.getAddressPoisByAddr(addr);
  485. }
  486. public List<YyskDmdzAddressStandardization> getRecommendAddress(SplitAddress splitAddress) {
  487. if (splitAddress.getCity() == null) {
  488. splitAddress.setCity("");
  489. }
  490. if (splitAddress.getDistrict() == null) {
  491. splitAddress.setDistrict("");
  492. }
  493. if (splitAddress.getStreet() == null) {
  494. splitAddress.setStreet("");
  495. }
  496. if (splitAddress.getCommunity() == null) {
  497. splitAddress.setCommunity("");
  498. }
  499. return yyszAddressRepository.getAddressPoisByDivisions(splitAddress.getCity(), splitAddress.getDistrict(), splitAddress.getStreet(), splitAddress.getCommunity());
  500. }
  501. public List<TAddressCallback> getCallbackDataByTag(Integer tag) {
  502. return tAddressCallbackRepository.getCallbackByTag(tag);
  503. }
  504. public List<TAddressCallback> updateCallbackData(List<TAddressCallback> datas) {
  505. return tAddressCallbackRepository.saveAll(datas);
  506. }
  507. public List<Map<String, Object>> getUniScDatas() {
  508. try {
  509. return DbConnection.getInstance().runSqlStr("select * from songjiang_uni_sc_id_v1"); // where real_address is not null and street_town_name is null
  510. } catch (Exception e) {
  511. e.printStackTrace();
  512. }
  513. return null;
  514. }
  515. public static List<Address> odsToAddr(List<Map<String, Object>> datas) {
  516. if (datas == null || datas.size() == 0) {
  517. return null;
  518. }
  519. List<Address> addresses = new ArrayList<>();
  520. for (Map<String, Object> item : datas) {
  521. Address address = new Address();
  522. address.setCity(item.get("city") != null ? item.get("city").toString() : "");
  523. address.setCounty(item.get("county") != null ? item.get("county").toString() : "");
  524. address.setTown(item.get("town") != null ? item.get("town").toString() : "");
  525. address.setTown_code(item.get("town_code") != null ? item.get("town_code").toString() : "");
  526. address.setCommunity(item.get("community") != null ? item.get("community").toString() : "");
  527. address.setCommunity_code(item.get("community_code") != null ? item.get("community_code").toString() : "");
  528. address.setGrid_name(item.get("grid_name") != null ? item.get("grid_name").toString() : "");
  529. address.setGrid_code(item.get("grid_code") != null ? item.get("grid_code").toString() : "");
  530. address.setSource(item.get("source") != null ? item.get("source").toString() : "");
  531. address.setSourceaddress(item.get("sourceaddress") != null ? item.get("sourceaddress").toString() : "");
  532. address.setAddress(item.get("address") != null ? item.get("address").toString() : "");
  533. address.setLon(item.get("lon") != null ? Float.valueOf(item.get("lon").toString()) : null);
  534. address.setLat(item.get("lat") != null ? Float.valueOf(item.get("lat").toString()) : null);
  535. addresses.add(address);
  536. }
  537. return addresses;
  538. }
  539. public GeoJsonBean isInadPolygon(double lon, double lat) {
  540. try {
  541. Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
  542. for (GeoJsonBean bean : shAllAdministrativeDivisionPolygonList) {
  543. if (bean.getMultiPolygon().contains(point)) {
  544. return bean;
  545. }
  546. }
  547. return null;
  548. } catch (ParseException e) {
  549. throw new RuntimeException(e);
  550. }
  551. }
  552. public GeoJsonBean isInTownPolygon(double lon, double lat) {
  553. try {
  554. Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
  555. for (GeoJsonBean bean : shAllToensPolygonList) {
  556. if (bean.getMultiPolygon().contains(point)) {
  557. return bean;
  558. }
  559. }
  560. return null;
  561. } catch (ParseException e) {
  562. throw new RuntimeException(e);
  563. }
  564. }
  565. public GeoJsonBean isInResidentialCommitteePolygon(double lon, double lat) {
  566. try {
  567. Geometry point = reader.read("POINT (" + lon + " " + lat + ")");
  568. for (GeoJsonBean bean : shAllResidentialCommitteeList) {
  569. if (bean.getMultiPolygon().contains(point)) {
  570. return bean;
  571. }
  572. }
  573. return null;
  574. } catch (ParseException e) {
  575. throw new RuntimeException(e);
  576. }
  577. }
  578. public GeoJsonBean isInWGPolygon(double lon, double lat) {
  579. Geometry point = null;
  580. try {
  581. point = reader.read("POINT (" + lon + " " + lat + ")");
  582. } catch (ParseException e) {
  583. throw new RuntimeException(e);
  584. }
  585. for (GeoJsonBean bean : wgPolygonList) {
  586. try {
  587. if (bean.getMultiPolygon().contains(point)) {
  588. return bean;
  589. }
  590. } catch (Exception e) {
  591. e.toString();
  592. }
  593. }
  594. return null;
  595. }
  596. public GeoJsonBean isInWGWPolygon(double lon, double lat) {
  597. Geometry point = null;
  598. try {
  599. point = reader.read("POINT (" + lon + " " + lat + ")");
  600. } catch (ParseException e) {
  601. throw new RuntimeException(e);
  602. }
  603. for (GeoJsonBean bean : wgwPolygonList) {
  604. try {
  605. if (bean.getMultiPolygon().contains(point)) {
  606. return bean;
  607. }
  608. } catch (Exception e) {
  609. e.toString();
  610. }
  611. }
  612. return null;
  613. }
  614. public GeoJsonBean isInZHGWPolygon(double lon, double lat) {
  615. Geometry point = null;
  616. try {
  617. point = reader.read("POINT (" + lon + " " + lat + ")");
  618. } catch (ParseException e) {
  619. throw new RuntimeException(e);
  620. }
  621. for (GeoJsonBean bean : zhwgPolygonList) {
  622. try {
  623. if (bean.getMultiPolygon().contains(point)) {
  624. return bean;
  625. }
  626. } catch (Exception e) {
  627. e.toString();
  628. }
  629. }
  630. return null;
  631. }
  632. }