AreaService.java 27 KB

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