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

Contents of /dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2778 - (show annotations) (download)
Fri Nov 20 16:31:01 2015 UTC (8 years, 5 months ago) by torben
File size: 26385 byte(s)
Implementer en (double)metaphone hjælper
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.Map.Entry;
13 import java.util.Set;
14 import java.util.TreeMap;
15 import java.util.TreeSet;
16 import java.util.concurrent.ConcurrentHashMap;
17
18 import org.apache.commons.lang3.StringUtils;
19
20 import dk.daoas.daoadresseservice.admin.ServiceConfig;
21 import dk.daoas.daoadresseservice.beans.Address;
22 import dk.daoas.daoadresseservice.beans.AliasBean;
23 import dk.daoas.daoadresseservice.beans.DataStatisticsBean;
24 import dk.daoas.daoadresseservice.beans.ExtendedBean;
25 import dk.daoas.daoadresseservice.beans.HundredePctBean;
26 import dk.daoas.daoadresseservice.beans.SearchRequest;
27 import dk.daoas.daoadresseservice.beans.SearchResult;
28 import dk.daoas.daoadresseservice.beans.SearchResult.Status;
29 import dk.daoas.daoadresseservice.db.DatabaseLayer;
30 import dk.daoas.daoadresseservice.util.DaoUtils;
31 import dk.daoas.daoadresseservice.util.DeduplicateHelper;
32 import dk.daoas.daoadresseservice.util.NaturalOrderComparator;
33
34 public class AddressSearch {
35
36 private Map<Short, Map<String,Integer>> searchPostnrVejnavnGadeid;
37 private Map<Integer, Map<String,Address>> searchGadeidentAdresser;
38
39 private List<Address> alleAdresser;
40
41 private Map<String,Integer> helperCache;
42
43 private DataStatisticsBean stats = new DataStatisticsBean();
44
45 private DatabaseLayer db;
46
47
48 StreetnameHelper levenshteinHelper;
49 StreetnameHelper metaphoneHelper;
50 StreetnameHelper googleHelper;
51 StreetnameHelper osmHelper;
52
53
54 public AddressSearch(DatabaseLayer db, ServiceConfig config) {
55
56 this.db = db;
57
58 levenshteinHelper = new LevenshteinStreetnameHelper( this );
59 metaphoneHelper = new DoubleMetaphoneStreetnameHelper(config);
60 googleHelper = new GoogleStreetnameHelper( config );
61 osmHelper = new OSMStreetnameHelper( config );
62 }
63
64 public Address getAddressSafe(int gadeid, String husnr) throws Exception {
65
66 Map<String,Address> gade = searchGadeidentAdresser.get(gadeid);
67
68 if (gade == null) {
69 throw new Exception("GadeID ikke fundet");
70 }
71
72 Address addr = gade.get(husnr);
73
74 if (addr == null) {
75 throw new Exception("Adresse ikke ikke fundet");
76 }
77
78 return addr;
79 }
80
81
82 public SearchResult search(String postnrStr, String adresse) {
83
84 postnrStr = postnrStr.trim();
85 adresse = adresse.trim();
86
87
88 SearchRequest request = new SearchRequest();
89 SearchResult result = new SearchResult();
90
91
92 try {
93 request.postnr = Short.parseShort(postnrStr);
94 } catch (Exception E) {
95 result.status = Status.ERROR_UNKNOWN_POSTAL;
96 return result;
97 }
98
99
100 request.streetNames = searchPostnrVejnavnGadeid.get(request.postnr);
101
102 if (request.streetNames == null) {
103 result.status = Status.ERROR_UNKNOWN_POSTAL;
104 return result;
105 }
106
107
108 result.splitResult = AddressUtils.splitAdresse(adresse);
109 request.vejnavn = result.splitResult.vej;
110
111
112
113 if (result.splitResult.husnr.length() == 0) {
114 result.status = Status.ERROR_MISSING_HOUSENUMBER;
115 return result;
116 }
117
118 result.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn );
119
120
121 if (result.vasketVejnavn.indexOf("pakkebo") > -1
122 || result.vasketVejnavn.indexOf("pakkepost") > -1
123 || result.vasketVejnavn.indexOf("postbo") > -1 // postbox/postboks
124 || result.vasketVejnavn.indexOf("døgnpost") > -1
125 || result.vasketVejnavn.indexOf("døgnbo") > -1 // døgnbox // døgnboks
126 || result.vasketVejnavn.equals("id")
127 ) {
128 result.status = Status.ERROR_POSTBOX;
129 return result;
130 }
131
132 // LookupStreetname er en indkapsling af alm + levenstein + google + osm
133 Integer gadeident = lookupStretname(request, result, true);
134
135
136 /*
137 * Hvis der ikke er direkte hits, prøver vi at skære ord af vejnavn
138 *
139 * <strike>Denne sektion er MEGET experimental da den øger antallet af kald til google/OSM væsentligt</strike>*/
140 if (gadeident == null) {
141 final int MAX_TRIES = 4;
142
143 String vejnavnParts[] = request.vejnavn.split(" ");
144
145 for (int i=1; i<=MAX_TRIES && i<vejnavnParts.length; i++) {
146 String subVejnavn = DaoUtils.joinHelper(vejnavnParts, i);
147
148 request.vejnavn = subVejnavn;
149 result.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn );
150
151 gadeident = lookupStretname(request, result, false);//prøv opslag MEN UDEN GOOGLE/OSM !!!
152
153 //hvis vi fandt vejen ud fra substrengen
154 if (gadeident != null) {
155 break;
156 }
157
158 //hvis vi ikke fandt kopierer vi vejnavn fra split igen
159 request.vejnavn = result.splitResult.vej;
160 result.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn );
161 }
162 }
163
164
165
166 if (gadeident == null) {
167 result.status = Status.ERROR_UNKNOWN_STREETNAME;
168 return result;
169 }
170
171 result.gadeident = gadeident;
172
173
174 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
175 if (gade == null) { //Denne søgning må ikke fejle
176 result.status = Status.ERROR_INTERNAL;
177 return result;
178 }
179
180
181 //Kunne evt klares med Iterables.get fra Guava/Collections
182 Address firstAddress = gade.values().iterator().next();
183 result.vej = firstAddress.vejnavn;
184
185 String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra;
186 Address addr = gade.get(husnrSearch);
187
188 if (addr == null) {
189 result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
190 return result;
191 }
192
193 result.address = addr;
194
195
196 if ( StringUtils.equals(addr.distributor, "LUKKET") ) {
197 result.status = Status.STATUS_NOT_COVERED; //Skal vi have en special status til Lukkede adresser ?
198 return result;
199 }
200
201 if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
202 result.status = Status.STATUS_NOT_COVERED;
203 return result;
204 }
205
206
207 result.status = Status.STATUS_OK;
208
209 return result;
210 }
211
212
213 private Integer lookupStretname(SearchRequest request, SearchResult result, boolean useExternal) {
214 String helperSearchKey = "";
215
216 Integer gadeident = request.streetNames.get(result.vasketVejnavn);
217
218
219 if ( gadeident == null) {
220 helperSearchKey = "" + request.postnr + "/" + result.vasketVejnavn;
221 gadeident = helperCache.get(helperSearchKey);
222 }
223
224 if (gadeident == null) {
225 String vej = levenshteinHelper.proposeStreetName(request, result);
226 if (vej != null) {
227 gadeident = request.streetNames.get(vej);
228 }
229 }
230
231 if (gadeident == null) {
232 String vej = levenshteinHelper.proposeStreetName(request, result);
233 if (vej != null) {
234 gadeident = request.streetNames.get(vej);
235 }
236 }
237
238
239 // Brug OpenStreetMap før vi prøver google
240 // For google har en request limit, det har OSM ikke!
241 if ( gadeident == null && useExternal) {
242 String vej = osmHelper.proposeStreetName(request, result);
243 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
244 }
245
246 if ( gadeident == null && useExternal) {
247 String vej = googleHelper.proposeStreetName(request, result);
248 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
249 }
250 return gadeident;
251 }
252
253 private Integer helperWrapper(String vej, Map<String,Integer> postnrVeje, String helperSearchKey) {
254 if (vej == null)
255 return null;
256
257 String vejVasket = AddressUtils.vaskVejnavn( vej );
258 Integer gadeident = postnrVeje.get(vejVasket);
259
260 if (gadeident != null) {
261 helperCache.put(helperSearchKey, gadeident);
262 }
263 return gadeident;
264
265 }
266
267 public Map<String,Integer> getStretsByPostal(short zip) {
268 return searchPostnrVejnavnGadeid.get(zip);
269 }
270
271
272
273 public void buildSearchStructures() throws SQLException{
274 searchPostnrVejnavnGadeid = new HashMap<Short, Map<String,Integer>>();
275 searchGadeidentAdresser = new HashMap<Integer, Map<String,Address>>();
276 helperCache = new ConcurrentHashMap<String,Integer>();
277
278 long start1 = System.currentTimeMillis();
279 System.out.println("Build -- stage 1");
280
281 alleAdresser = db.getAllAdresses();
282
283
284 /* Mapper mellem db Row ID og adresse noden */
285 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
286 DeduplicateHelper<String> aliasHelper = new DeduplicateHelper<String>();
287 DeduplicateHelper<String> husnrHelper = new DeduplicateHelper<String>();
288
289 for (Address a : alleAdresser) {
290 idAddressMap.put(a.id, a);
291
292 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
293
294 if (postnrVeje == null) {
295 postnrVeje = new ConcurrentHashMap<String,Integer>();
296 searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
297 }
298
299
300 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
301 Integer gadeident = postnrVeje.get(vasketVejnavn);
302 if (gadeident == null) {
303 //postnrVeje.put(vasketVejnavn, a.gadeid);
304
305 gadeident = a.gadeid;
306
307 Set<String> aliaser = findVejAliaser(a.vejnavn);
308 for(String alias : aliaser) {
309 String vasketAlias = AddressUtils.vaskVejnavn(alias);
310 vasketAlias = aliasHelper.getInstance(vasketAlias);
311
312 postnrVeje.put(vasketAlias, gadeident);
313 }
314 }
315
316 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
317 if (gade == null) {
318 gade = new HashMap<String, Address>();
319 searchGadeidentAdresser.put(gadeident, gade);
320 }
321 String husnrSearch = "" + a.husnr + a.husnrbogstav;
322 husnrSearch = husnrHelper.getInstance(husnrSearch);
323 gade.put(husnrSearch, a);
324 }
325
326 ////////////////////////////////////////////////////////////////////////////////////////
327 long start2 = System.currentTimeMillis();
328 System.out.println("Build, stage1 elapsed: " + (start2-start1) );
329 System.out.println("Build -- stage 2 alias tabel");
330
331 int vaskCount = 0;
332 List<AliasBean> aliasList = db.getAliasList();
333 for (AliasBean alias : aliasList) {
334 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(alias.postnr);
335
336 if (postnrVeje == null) {
337 //Burde ikke kunne ske - men better safe than sorry
338 continue;
339 }
340
341 String vasketVej = AddressUtils.vaskVejnavn(alias.vejnavn);
342 String vasketAlias = AddressUtils.vaskVejnavn(alias.aliasVejnavn);
343
344 Integer gadeident = postnrVeje.get(vasketVej);
345 if (gadeident == null) {
346 //Kender ikke den oprindelige vej
347 continue;
348 }
349
350 Integer aliasIdent = postnrVeje.get(vasketAlias);
351
352 if (aliasIdent == null) { //Vi kender ikke denne variant af vejnavnet
353 postnrVeje.put(vasketAlias, gadeident);
354 vaskCount++;
355 }
356
357 }
358 System.out.println("Anvendte " + vaskCount + " aliaser fra databasen");
359
360
361 ////////////////////////////////////////////////////////////////////////////////////////
362 long start3 = System.currentTimeMillis();
363 System.out.println("Build, stage2 elapsed: " + (start3-start2) );
364 System.out.println("Build -- stage 3 udvidet dækning");
365
366 DeduplicateHelper<String> ruteHelper = new DeduplicateHelper<String>();
367 DeduplicateHelper<String> korelisteHelper = new DeduplicateHelper<String>();
368
369 List<ExtendedBean> extDao = db.getExtendedAdresslist();
370 for (ExtendedBean eb : extDao) {
371
372 Address orgAddress = idAddressMap.get(eb.orgId);
373 if (orgAddress == null)
374 continue;
375
376 if (orgAddress.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
377 //kan være at adressen er blevet markeret dækket og - find-nærmeste data ikke er opdateret i mellemtiden
378 continue;
379 }
380
381 Address targetAddress = idAddressMap.get(eb.targetId);
382 if (targetAddress == null) {
383 continue;
384 }
385
386
387 if ( StringUtils.equals(orgAddress.distributor, "LUKKET") ) {
388 continue;
389 }
390
391
392
393 if ( StringUtils.equals(targetAddress.distributor, "LUKKET") ) {
394 continue;
395 }
396
397 orgAddress.extTarget = targetAddress;
398 orgAddress.extAfstand = eb.afstand;
399
400 boolean covered = false;
401 if (targetAddress.distributor.equals("DAO")) {
402 orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
403 orgAddress.rute = ruteHelper.getInstance(orgAddress.rute);
404
405 if (orgAddress.rute != null) {
406 orgAddress.koreliste = targetAddress.koreliste;
407 covered = true;
408 }
409 }
410
411 if (targetAddress.distributor.equals("BK")) {
412 orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
413 orgAddress.koreliste = korelisteHelper.getInstance(orgAddress.koreliste);
414
415 if (orgAddress.koreliste != null) {
416 orgAddress.rute = targetAddress.rute;
417 covered = true;
418 }
419 }
420
421 if (covered) { //Kopier resten af felterne
422 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
423 orgAddress.dbkBane = targetAddress.dbkBane;
424
425 /* Sådan gør den gamle service */
426 /* 20150520 THN- hvis vi bibeholder de originale kommune+vejkoder kan vi bruge DAVID til join i databasen*/
427 //orgAddress.kommunekode = targetAddress.kommunekode;
428 //orgAddress.vejkode = targetAddress.vejkode;
429
430
431 orgAddress.distributor = targetAddress.distributor;
432 }
433 }
434
435 // nu skal vi ikke bruge idAddressMap længere
436 idAddressMap = null;
437
438 //////////////////////////////////////////////////////////////////////////////////////
439 long start4 = System.currentTimeMillis();
440 System.out.println("Build, stage3 elapsed: " + (start4-start3) );
441 System.out.println("Build -- stage 4 - 100pct");
442
443 Map<Short,HundredePctBean> hundredePct = db.get100PctList();
444 for (Address addr : alleAdresser) {
445 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
446 continue;
447 }
448
449 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
450 continue;
451 }
452
453
454 HundredePctBean bean = hundredePct.get(addr.postnr);
455 if (bean == null) {
456 continue;
457 }
458
459 addr.daekningsType = DaekningsType.DAEKNING_100PCT;
460 addr.rute = bean.rute;
461 addr.koreliste = bean.koreliste;
462 addr.dbkBane = bean.dbkBane;
463 addr.distributor = bean.distributor;
464 }
465
466 ////////////////////////////////////////////////////////////////////////////////////
467 long stop = System.currentTimeMillis();
468 System.out.println("Build, stage4 elapsed: " + (stop-start4) );
469 System.out.println("Build -- Gathering statistics");
470
471 for (Address addr : alleAdresser) {
472 switch (addr.daekningsType) {
473 case DAEKNING_DIREKTE:
474 stats.direkteCount++;
475 break;
476 case DAEKNING_UDVIDET:
477 stats.extendedCount++;
478 break;
479 case DAEKNING_100PCT:
480 stats.hundredePctCount++;
481 break;
482 default:
483 stats.ikkeDaekketCount++;
484 }
485 }
486 stats.totalCount = alleAdresser.size();
487
488
489 stats.elapsed = stop-start1;
490 stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() );
491
492 System.out.println("Build: totalCount: " + stats.totalCount);
493 System.out.println("Build: direkteCount: " + stats.direkteCount);
494 System.out.println("Build: extendedCount: " + stats.extendedCount);
495 System.out.println("Build: hundredePctCount: " + stats.hundredePctCount);
496 System.out.println("Build: ikkeDaekketCount: " + stats.ikkeDaekketCount);
497
498 System.out.println("Build: Total Elapsed: " + (stop-start1) );
499 System.out.println("Build Completed");
500
501 }
502
503 public DataStatisticsBean getStatistics() {
504 return stats;
505 }
506
507 public DatabaseLayer getDatabaseLayer() {
508 return db;
509 }
510
511 public void clear() {
512 searchPostnrVejnavnGadeid.clear();
513 searchGadeidentAdresser.clear();
514 alleAdresser.clear();
515 helperCache.clear();
516 }
517
518
519 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
520 if (targetAddress.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel
521 return null;
522 }
523
524 // ///////////////////////////////////////////////////////////////////
525 switch( eb.transport) {
526 case "cykel":
527 if (eb.afstand < 0.151) {
528 return "." + targetAddress.rute;
529 } else if (eb.afstand < 0.501) {
530 return ".." + targetAddress.rute;
531 } else if (eb.afstand < 0.701) {
532 return "..." + targetAddress.rute;
533 } else if (eb.afstand < 1.001) {
534 return "...." + targetAddress.rute;
535 }
536 break;
537 case "scooter":
538 if (eb.afstand < 0.151) {
539 return "." + targetAddress.rute;
540 } else if (eb.afstand < 0.801) {
541 return ".." + targetAddress.rute;
542 } else if (eb.afstand < 1.201) {
543 return "..." + targetAddress.rute;
544 } else if (eb.afstand < 2.101) {
545 return "...." + targetAddress.rute;
546 }
547 break;
548 case "bil":
549 if (eb.afstand < 0.151) {
550 return "." + targetAddress.rute;
551 } else if (eb.afstand < 1.001) {
552 return ".." + targetAddress.rute;
553 } else if (eb.afstand < 1.601) {
554 return "..." + targetAddress.rute;
555 } else if (eb.afstand < 2.601) {
556 return "...." + targetAddress.rute;
557 }
558 break;
559 default:
560 System.out.println("Ukendt transport type: " + eb );
561 }
562 return null;
563 }
564
565 public List<Address> getNonCoveredAddresses() {
566 List<Address> result = new ArrayList<Address>(60000);
567 for (Address a : alleAdresser) {
568 if ( a.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
569 result.add(a);
570 }
571 }
572 Collections.sort(result );
573 return result;
574 }
575
576 public List<Address> get100PctAddresses() {
577 List<Address> result = new ArrayList<Address>(120000);
578 for (Address a : alleAdresser) {
579 if ( a.daekningsType == DaekningsType.DAEKNING_100PCT) {
580 result.add(a);
581 }
582 }
583 Collections.sort(result );
584 return result;
585 }
586
587 ///////////////////////////////////////////////////////////
588 private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
589 String inject;
590 if (eb.afstand <= 0.500) {
591 inject = ".";
592 } else {
593 inject = "..";
594 }
595 return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
596 }
597
598 private Set<String> findVejAliaser(String vejnavn) {
599 vejnavn = vejnavn.toLowerCase();
600 HashSet<String> aliasSet = new HashSet<String>();
601 aliasSet.add(vejnavn);
602
603 aliasSet.add(vejnavn.replace("alle", "allé") );
604 aliasSet.add(vejnavn.replace("allé", "alle") );
605
606
607 // forkortelser
608 aliasSet.add(vejnavn.replace("dronningens", "dr") );
609 aliasSet.add(vejnavn.replace("dr.", "dronningens") );
610 aliasSet.add(vejnavn.replace("dr ", "dronningens") );
611
612 aliasSet.add(vejnavn.replace("dronning", "dr") );
613 aliasSet.add(vejnavn.replace("dr.", "dronning") );
614 aliasSet.add(vejnavn.replace("dr ", "dronning") );
615
616 aliasSet.add(vejnavn.replace("kng", "kongen") );
617 aliasSet.add(vejnavn.replace("kongen", "kng") );
618
619 aliasSet.add(vejnavn.replace("kvt", "kvarter") );
620 aliasSet.add(vejnavn.replace("kvarter", "kvt") );
621
622 aliasSet.add(vejnavn.replace("gl", "gammel") );
623 aliasSet.add(vejnavn.replace("gammel", "gl") );
624
625 aliasSet.add(vejnavn.replace("gl", "gamle") );
626 aliasSet.add(vejnavn.replace("gamle", "gl") );
627
628 aliasSet.add(vejnavn.replace("lille", "ll") );
629 aliasSet.add(vejnavn.replace("ll ", "lille") );
630 aliasSet.add(vejnavn.replace("ll.", "lille") );
631
632 aliasSet.add(vejnavn.replace("store", "st") );
633 aliasSet.add(vejnavn.replace("st ", "store") );
634 aliasSet.add(vejnavn.replace("st.", "store") );
635
636 aliasSet.add(vejnavn.replace("søndre", "sdr") );
637 aliasSet.add(vejnavn.replace("sdr", "søndre") );
638 aliasSet.add(vejnavn.replace("sønder", "sdr") );
639 aliasSet.add(vejnavn.replace("sdr", "sønder") );
640
641
642 aliasSet.add(vejnavn.replace("nørre", "nr") );
643 aliasSet.add(vejnavn.replace("nr", "nørre") );
644
645 aliasSet.add(vejnavn.replace("nordre", "ndr") );
646 aliasSet.add(vejnavn.replace("ndr", "nordre") );
647
648
649 aliasSet.add(vejnavn.replace("vestre", "vester") );
650 aliasSet.add(vejnavn.replace("vester", "vestre") );
651
652 aliasSet.add(vejnavn.replace("søndre", "sønder") );
653 aliasSet.add(vejnavn.replace("sønder", "søndre") );
654
655 aliasSet.add(vejnavn.replace("østre", "øster") );
656 aliasSet.add(vejnavn.replace("øster", "østre") );
657
658 aliasSet.add(vejnavn.replace("borgmester", "borgm") );
659 aliasSet.add(vejnavn.replace("borgm", "borgmester") );
660
661
662 aliasSet.add(vejnavn.replace("sankt", "skt") );
663 aliasSet.add(vejnavn.replace("sankt", "sct") );
664 aliasSet.add(vejnavn.replace("skt", "sankt") );
665
666 aliasSet.add(vejnavn.replace("skt", "sct") );
667 aliasSet.add(vejnavn.replace("sct", "skt") );
668
669
670
671 // fornavn forkortelser
672 aliasSet.add(vejnavn.replace("john", "j") );
673 aliasSet.add(vejnavn.replace("thomas", "th") );
674 aliasSet.add(vejnavn.replace("thorvald", "th") );
675 aliasSet.add(vejnavn.replace("frederik", "fr") );
676 aliasSet.add(vejnavn.replace("frederiks", "fr") );
677
678
679 aliasSet.add(vejnavn.replace("christian", "chr") );
680 aliasSet.add(vejnavn.replace("christians", "chr") );
681 aliasSet.add(vejnavn.replace("kristian", "kr") );
682 aliasSet.add(vejnavn.replace("kristians", "kr") );
683
684 aliasSet.add(vejnavn.replace("mylius", "myl") );
685 aliasSet.add(vejnavn.replace("myl", "mylius") );
686
687 aliasSet.add(vejnavn.replace("ludvig", "ludv") );
688 aliasSet.add(vejnavn.replace("ludv", "ludvig") );
689
690
691 // alternative stavninger
692 aliasSet.add(vejnavn.replace("peder", "peter") );
693 aliasSet.add(vejnavn.replace("peter", "peder") );
694
695
696
697 // Romertal
698 aliasSet.add(vejnavn.replace("1", "i") );
699 aliasSet.add(vejnavn.replace("i", "1") );
700
701 aliasSet.add(vejnavn.replace("2", "ii") );
702 aliasSet.add(vejnavn.replace("ii", "2") );
703
704 aliasSet.add(vejnavn.replace("3", "iii") );
705 aliasSet.add(vejnavn.replace("iii", "3") );
706
707 aliasSet.add(vejnavn.replace("4", "iv") );
708 aliasSet.add(vejnavn.replace("iv", "4") );
709
710 aliasSet.add(vejnavn.replace("5", "v") );
711 aliasSet.add(vejnavn.replace("v", "5") );
712
713 aliasSet.add(vejnavn.replace("6", "vi") );
714 aliasSet.add(vejnavn.replace("vi", "6") );
715
716 aliasSet.add(vejnavn.replace("7", "vii") );
717 aliasSet.add(vejnavn.replace("vii", "7") );
718
719 aliasSet.add(vejnavn.replace("8", "viii") );
720 aliasSet.add(vejnavn.replace("viii", "8") );
721
722 aliasSet.add(vejnavn.replace("9", "ix") );
723 aliasSet.add(vejnavn.replace("ix", "9") );
724
725 aliasSet.add(vejnavn.replace("10", "x") );
726 aliasSet.add(vejnavn.replace("x", "10") );
727
728
729 //alternative måder at stave vej/gade/alle
730 aliasSet.add(vejnavn.replace("vej", "ve") );
731 aliasSet.add(vejnavn.replace("vej", "vj") );
732 aliasSet.add(vejnavn.replace("vej", "v") );
733 aliasSet.add(vejnavn.replace("vej", "vejen") );
734 aliasSet.add(vejnavn.replace("vejen", "vej") );
735
736 aliasSet.add(vejnavn.replace("v", "vej") );//Vi kan have vejnavne i DB der bare slutter på v istedet for vej
737
738 aliasSet.add(vejnavn.replace("alle", "all") );
739 aliasSet.add(vejnavn.replace("allé", "all") );
740 aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo
741 aliasSet.add(vejnavn.replace("allé", "allú") );
742
743 aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo
744 aliasSet.add(vejnavn.replace("gade", "gde") );
745
746 aliasSet.add(vejnavn.replace("plads", "pl") );
747 aliasSet.add(vejnavn.replace("vænget", "vænge") );
748
749 aliasSet.add(vejnavn.replace("boulevard", "blvd") );
750 aliasSet.add(vejnavn.replace("blvd", "boulevard") );
751
752 aliasSet.add(vejnavn.replace("boulevard", "boule") );
753 aliasSet.add(vejnavn.replace("boule", "boulevard") );
754
755 aliasSet.add(vejnavn.replace("kronborg", "krbg") ); //Krbg ladegårdsvej, 3000
756 aliasSet.add(vejnavn.replace("krbg", "kronborg") );
757
758 // Opbyg æøå varianter over alle fundne aliaser
759
760 @SuppressWarnings("unchecked")
761 HashSet<String> variants = (HashSet<String>) aliasSet.clone();
762
763 for (String vVejnavn : variants) {
764 // danske tegn 1
765 aliasSet.add( vVejnavn.replace("æ", "ae") );
766 aliasSet.add( vVejnavn.replace("ø", "oe") );
767 aliasSet.add( vVejnavn.replace("å", "aa") );
768 aliasSet.add( vVejnavn.replace("ae", "æ") );
769 aliasSet.add( vVejnavn.replace("oe", "ø") );
770 aliasSet.add( vVejnavn.replace("aa", "å") );
771
772 //danske tegn 2
773 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") );
774 aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") );
775 aliasSet.add( vVejnavn.replace("ø", "oe").replace("å", "aa") );
776 aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") );
777 aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") );
778 aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
779
780 //danske tegn 3
781 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
782 aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
783
784
785 //udenlandsketegn
786 aliasSet.add(vejnavn.replace("u", "ü") );
787 aliasSet.add(vejnavn.replace("ü", "u") );
788
789 aliasSet.add(vejnavn.replace("ä", "æ") );
790 aliasSet.add(vejnavn.replace("æ", "ä") );
791
792 aliasSet.add(vejnavn.replace("ö", "ø") );
793 aliasSet.add(vejnavn.replace("ø", "ö") );
794 }
795
796 return aliasSet;
797 }
798
799 public Set<Short> getPostnumre() {
800 return new TreeSet<Short>( searchPostnrVejnavnGadeid.keySet() );
801 }
802
803 public Set<Entry<String,Integer>> getVejnavne(short postnr) {
804 Map<String,Integer> map = searchPostnrVejnavnGadeid.get(postnr);
805
806 TreeMap<String,Integer> newMap = new TreeMap<String,Integer>( map );//Lav et nyt TreeMap for at sikre sortering
807
808 return newMap.entrySet();
809 }
810
811 public Set<String> getHusnumre(int gadeid) {
812
813 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
814
815 Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
816 set.addAll( gade.keySet() );
817
818 return set;
819 }
820
821 public Address getAdresse(int gadeid, String husnr) {
822
823 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
824 return gade.get(husnr);
825
826 }
827
828 }

  ViewVC Help
Powered by ViewVC 1.1.20