/[projects]/dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java
ViewVC logotype

Contents of /dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2382 - (show annotations) (download)
Thu Feb 26 10:39:12 2015 UTC (9 years, 2 months ago) by torben
File size: 15214 byte(s)
Mere alias + tag højde for : og ; i adressefeltet ved vask
1 package dk.daoas.daoadresseservice;
2
3 import java.sql.SQLException;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Collections;
7 import java.util.Date;
8 import java.util.HashMap;
9 import java.util.HashSet;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.Set;
13 import java.util.concurrent.ConcurrentHashMap;
14
15 import org.apache.commons.lang3.StringUtils;
16
17 import dk.daoas.daoadresseservice.admin.ServiceConfig;
18 import dk.daoas.daoadresseservice.beans.Address;
19 import dk.daoas.daoadresseservice.beans.DataStatisticsBean;
20 import dk.daoas.daoadresseservice.beans.ExtendedBean;
21 import dk.daoas.daoadresseservice.beans.HundredePctBean;
22 import dk.daoas.daoadresseservice.beans.SearchResult;
23 import dk.daoas.daoadresseservice.beans.SearchResult.Status;
24 import dk.daoas.daoadresseservice.db.DatabaseLayer;
25
26 public class AdressSearch {
27
28 private Map<Integer, Map<String,Long>> searchPostnrVejnavnGadeid;
29 private Map<Long, Map<String,Address>> searchGadeidentAdresser;
30
31 private List<Address> alleAdresser;
32
33 private Map<String,Long> helperCache;
34
35 private DataStatisticsBean stats = new DataStatisticsBean();
36
37 ServiceConfig config;
38
39 public AdressSearch(ServiceConfig config) {
40 this.config = config;
41 }
42
43
44 public SearchResult search(String postnrStr, String adresse) {
45
46 SearchResult result = new SearchResult();
47
48 int postnr=0;
49
50 String helperSearchKey = "";
51
52 try {
53 postnr = Integer.parseInt(postnrStr);
54 } catch (Exception E) {
55 result.status = Status.ERROR_UNKNOWN_POSTAL;
56 return result;
57 }
58
59 Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);
60
61 if (postnrVeje == null) {
62 result.status = Status.ERROR_UNKNOWN_POSTAL;
63 return result;
64 }
65
66
67 result.splitResult = AddressUtils.splitAdresse(adresse);
68
69
70 if (result.splitResult.husnr.length() == 0) {
71 result.status = Status.ERROR_MISSING_HOUSENUMBER;
72 return result;
73 }
74
75 String vasketVejnavn = AddressUtils.vaskVejnavn( result.splitResult.vej );
76
77 Long gadeident = postnrVeje.get(vasketVejnavn);
78
79
80 if ( gadeident == null) {
81 helperSearchKey = "" + postnr + "/" + vasketVejnavn;
82 gadeident = helperCache.get(helperSearchKey);
83 }
84
85
86 if ( gadeident == null) {
87 if (config.useGoogle) {
88 result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej );
89 result.google = true;
90
91 if (result.googleVej != null) {
92 String googleVasket = AddressUtils.vaskVejnavn( result.googleVej );
93 gadeident = postnrVeje.get(googleVasket);
94
95 if (gadeident != null) {
96 helperCache.put(helperSearchKey, gadeident);
97 }
98 }
99 }
100 }
101
102 if ( gadeident == null) {
103 if (config.useOpenStreetMaps) {
104 result.osmVej = GeocodeHelper.openstreetmapHelper(config, postnr, result.splitResult.vej );
105 result.osm = true;
106
107 if (result.osmVej != null) {
108 String osmVasket = AddressUtils.vaskVejnavn( result.osmVej );
109 gadeident = postnrVeje.get(osmVasket);
110
111 if (gadeident != null) {
112 helperCache.put(helperSearchKey, gadeident);
113 }
114 }
115 }
116 }
117
118 if (gadeident == null) {
119 result.status = Status.ERROR_UNKNOWN_STREETNAME;
120 return result;
121 }
122
123 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
124 if (gade == null) { //Denne søgning må ikke fejle
125 result.status = Status.ERROR_INTERNAL;
126 return result;
127 }
128
129
130 String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra;
131 Address addr = gade.get(husnrSearch);
132
133 if (addr == null) {
134 result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
135 return result;
136 }
137
138 result.address = addr;
139
140
141 if ( StringUtils.equals(addr.distributor, "LUKKET") ) {
142 result.status = Status.STATUS_NOT_COVERED; //Skal vi have en special status til Lukkede adresser ?
143 return result;
144 }
145
146 if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
147 result.status = Status.STATUS_NOT_COVERED;
148 return result;
149 }
150
151
152 result.status = Status.STATUS_OK;
153
154 return result;
155 }
156
157
158 public void buildSearchStructures() throws SQLException{
159 searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
160 searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
161 helperCache = new ConcurrentHashMap<String,Long>();
162
163 long start1 = System.currentTimeMillis();
164 System.out.println("Build -- stage 1");
165
166 alleAdresser = DatabaseLayer.getAllAdresses();
167
168
169 /* Mapper mellem db Row ID og adresse noden */
170 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
171
172 for (Address a : alleAdresser) {
173 idAddressMap.put(a.id, a);
174
175 Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
176
177 if (postnrVeje == null) {
178 postnrVeje = new ConcurrentHashMap<String,Long>();
179 searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
180 }
181
182 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
183 Long gadeident = postnrVeje.get(vasketVejnavn);
184 if (gadeident == null) {
185 //postnrVeje.put(vasketVejnavn, a.gadeid);
186
187 Set<String> aliaser = findVejAliaser(a.vejnavn);
188 for(String alias : aliaser) {
189 String vasketAlias = AddressUtils.vaskVejnavn(alias);
190 postnrVeje.put(vasketAlias, a.gadeid);
191 }
192
193 }
194
195 Map<String, Address> gade = searchGadeidentAdresser.get(a.gadeid);
196 if (gade == null) {
197 gade = new HashMap<String, Address>();
198 searchGadeidentAdresser.put(a.gadeid, gade);
199 }
200 String husnrSearch = "" + a.husnr + a.husnrbogstav;
201 gade.put(husnrSearch, a);
202 }
203
204
205 ////////////////////////////////////////////////////////////////////////////////////////
206 long start2 = System.currentTimeMillis();
207 System.out.println("Build, stage1 elapsed: " + (start2-start1) );
208 System.out.println("Build -- stage 2 udvidet dækning");
209
210 List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
211 for (ExtendedBean eb : extDao) {
212
213 Address orgAddress = idAddressMap.get(eb.orgId);
214 if (orgAddress == null)
215 continue;
216
217 Address targetAddress = idAddressMap.get(eb.targetId);
218 if (targetAddress == null)
219 continue;
220
221 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
222 continue;
223 }
224
225 if (targetAddress.distributor.equals("LUKKET")) {
226 continue;
227 }
228
229 orgAddress.extTarget = targetAddress;
230 orgAddress.extAfstand = eb.afstand;
231
232 boolean covered = false;
233 if (targetAddress.distributor.equals("DAO")) {
234 orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
235 if (orgAddress.rute != null) {
236 orgAddress.koreliste = targetAddress.koreliste;
237 covered = true;
238 }
239 }
240
241 if (targetAddress.distributor.equals("BK")) {
242 orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
243 if (orgAddress.koreliste != null) {
244 orgAddress.rute = targetAddress.rute;
245 covered = true;
246 }
247 }
248
249 if (covered) { //Kopier resten af felterne
250 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
251 orgAddress.dbkBane = targetAddress.dbkBane;
252
253 /* Sådan gør den gamle service */
254 orgAddress.kommunekode = targetAddress.kommunekode;
255 orgAddress.vejkode = targetAddress.vejkode;
256
257 orgAddress.distributor = targetAddress.distributor;
258 }
259 }
260
261 // nu skal vi ikke bruge idAddressMap længere
262 idAddressMap = null;
263
264 //////////////////////////////////////////////////////////////////////////////////////
265 long start3 = System.currentTimeMillis();
266 System.out.println("Build, stage2 elapsed: " + (start3-start2) );
267 System.out.println("Build -- stage 3 - 100pct");
268
269 Map<Integer,HundredePctBean> hundredePct = DatabaseLayer.get100PctList();
270 for (Address addr : alleAdresser) {
271 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
272 continue;
273 }
274
275 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
276 continue;
277 }
278
279
280 HundredePctBean bean = hundredePct.get(addr.postnr);
281 if (bean == null) {
282 continue;
283 }
284
285 addr.daekningsType = DaekningsType.DAEKNING_100PCT;
286 addr.rute = bean.rute;
287 addr.koreliste = bean.koreliste;
288 addr.dbkBane = bean.dbkBane;
289 addr.distributor = bean.distributor;
290 }
291
292 ////////////////////////////////////////////////////////////////////////////////////
293 long stop = System.currentTimeMillis();
294 System.out.println("Build, stage3 elapsed: " + (stop-start3) );
295 System.out.println("Build -- Gathering statistics");
296
297 for (Address addr : alleAdresser) {
298 switch (addr.daekningsType) {
299 case DAEKNING_DIREKTE:
300 stats.direkteCount++;
301 break;
302 case DAEKNING_UDVIDET:
303 stats.extendedCount++;
304 break;
305 case DAEKNING_100PCT:
306 stats.hundredePctCount++;
307 break;
308 default:
309 stats.ikkeDaekketCount++;
310 }
311 }
312
313
314 stats.elapsed = stop-start1;
315 stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() );
316
317 System.out.println("Build: direkteCount: " + stats.direkteCount);
318 System.out.println("Build: extendedCount: " + stats.extendedCount);
319 System.out.println("Build: hundredePctCount: " + stats.hundredePctCount);
320 System.out.println("Build: ikkeDaekketCount: " + stats.ikkeDaekketCount);
321
322 System.out.println("Build: Total Elapsed: " + (stop-start1) );
323 System.out.println("Build Completed");
324
325 }
326
327 public DataStatisticsBean getStatistics() {
328 return stats;
329 }
330
331 public void clear() {
332 searchPostnrVejnavnGadeid.clear();
333 searchGadeidentAdresser.clear();
334 alleAdresser.clear();
335 helperCache.clear();
336 }
337
338
339 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
340
341 // ///////////////////////////////////////////////////////////////////
342 switch( eb.transport) {
343 case "cykel":
344 if (eb.afstand < 0.151) {
345 return "." + targetAddress.rute;
346 } else if (eb.afstand < 0.501) {
347 return ".." + targetAddress.rute;
348 } else if (eb.afstand < 0.701) {
349 return "..." + targetAddress.rute;
350 } else if (eb.afstand < 0.501) {
351 return "...." + targetAddress.rute;
352 }
353 break;
354 case "scooter":
355 if (eb.afstand < 0.151) {
356 return "." + targetAddress.rute;
357 } else if (eb.afstand < 0.801) {
358 return ".." + targetAddress.rute;
359 } else if (eb.afstand < 1.201) {
360 return "..." + targetAddress.rute;
361 } else if (eb.afstand < 2.101) {
362 return "...." + targetAddress.rute;
363 }
364 break;
365 case "bil":
366 if (eb.afstand < 0.151) {
367 return "." + targetAddress.rute;
368 } else if (eb.afstand < 1.001) {
369 return ".." + targetAddress.rute;
370 } else if (eb.afstand < 1.601) {
371 return "..." + targetAddress.rute;
372 } else if (eb.afstand < 2.601) {
373 return "...." + targetAddress.rute;
374 }
375 break;
376 }
377 return null;
378 }
379
380 public List<Address> getNonCoveredAddresses() {
381 List<Address> result = new ArrayList<Address>(60000);
382 for (Address a : alleAdresser) {
383 if ( a.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
384 result.add(a);
385 }
386 }
387 Collections.sort(result );
388 return result;
389 }
390
391 ///////////////////////////////////////////////////////////
392 private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
393 String inject;
394 if (eb.afstand <= 0.500) {
395 inject = ".";
396 } else {
397 inject = "..";
398 }
399 return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
400 }
401
402 private Set<String> findVejAliaser(String vejnavn) {
403 vejnavn = vejnavn.toLowerCase();
404 HashSet<String> aliasSet = new HashSet<String>();
405 aliasSet.add(vejnavn);
406
407 aliasSet.add(vejnavn.replace("u", "ü") );
408 aliasSet.add(vejnavn.replace("ü", "u") );
409
410 aliasSet.add(vejnavn.replace("alle", "allé") );
411 aliasSet.add(vejnavn.replace("allé", "alle") );
412
413 aliasSet.add(vejnavn.replace("dronningens", "dr") );
414 aliasSet.add(vejnavn.replace("dr.", "dronningens") );
415 aliasSet.add(vejnavn.replace("dr ", "dronningens") );
416
417 aliasSet.add(vejnavn.replace("kvt", "kvarter") );
418 aliasSet.add(vejnavn.replace("kvarter", "kvt") );
419
420 aliasSet.add(vejnavn.replace("gl", "gammel") );
421 aliasSet.add(vejnavn.replace("gammel", "gl") );
422
423 aliasSet.add(vejnavn.replace("lille", "ll") );
424 aliasSet.add(vejnavn.replace("ll ", "lille") );
425 aliasSet.add(vejnavn.replace("ll.", "lille") );
426
427 aliasSet.add(vejnavn.replace("store", "st") );
428 aliasSet.add(vejnavn.replace("st ", "store") );
429 aliasSet.add(vejnavn.replace("st.", "store") );
430
431 aliasSet.add(vejnavn.replace("søndre", "sdr") );
432 aliasSet.add(vejnavn.replace("sdr", "søndre") );
433
434
435 aliasSet.add(vejnavn.replace("nørre", "nr") );
436 aliasSet.add(vejnavn.replace("nr", "nørre") );
437
438 aliasSet.add(vejnavn.replace("nordre", "ndr") );
439 aliasSet.add(vejnavn.replace("ndr", "nordre") );
440
441 aliasSet.add(vejnavn.replace("sankt", "skt") );
442 aliasSet.add(vejnavn.replace("sankt", "sct") );
443 aliasSet.add(vejnavn.replace("skt", "sankt") );
444
445 aliasSet.add(vejnavn.replace("skt", "sct") );
446 aliasSet.add(vejnavn.replace("sct", "skt") );
447
448
449 //alternative måder at stave vej/gade/alle
450 aliasSet.add(vejnavn.replace("vej", "ve") );
451 aliasSet.add(vejnavn.replace("vej", "vj") );
452
453 aliasSet.add(vejnavn.replace("alle", "all") );
454 aliasSet.add(vejnavn.replace("allé", "all") );
455 aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo
456 aliasSet.add(vejnavn.replace("allé", "allú") );
457
458 aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo
459
460
461 // Opbyg æøå varianter over alle fundne aliaser
462
463 @SuppressWarnings("unchecked")
464 HashSet<String> variants = (HashSet<String>) aliasSet.clone();
465
466 for (String vVejnavn : variants) {
467 // danske tegn 1
468 aliasSet.add( vVejnavn.replace("æ", "ae") );
469 aliasSet.add( vVejnavn.replace("ø", "oe") );
470 aliasSet.add( vVejnavn.replace("å", "aa") );
471 aliasSet.add( vVejnavn.replace("ae", "æ") );
472 aliasSet.add( vVejnavn.replace("oe", "ø") );
473 aliasSet.add( vVejnavn.replace("aa", "å") );
474
475 //danske tegn 2
476 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") );
477 aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") );
478 aliasSet.add( vVejnavn.replace("ø", "ae").replace("å", "aa") );
479 aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") );
480 aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") );
481 aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
482
483 //danske tegn 3
484 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
485 aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
486 }
487
488 return aliasSet;
489 }
490
491
492 }

  ViewVC Help
Powered by ViewVC 1.1.20