/[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 2775 - (show annotations) (download)
Thu Nov 19 15:29:36 2015 UTC (8 years, 5 months ago) by torben
File size: 26020 byte(s)
Smartere håndtering af transport typer ved udvidet dækning /afstand-anden-rute
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 com.jcabi.log.Logger;
21
22 import dk.daoas.daoadresseservice.admin.ServiceConfig;
23 import dk.daoas.daoadresseservice.beans.Address;
24 import dk.daoas.daoadresseservice.beans.AliasBean;
25 import dk.daoas.daoadresseservice.beans.DataStatisticsBean;
26 import dk.daoas.daoadresseservice.beans.ExtendedBean;
27 import dk.daoas.daoadresseservice.beans.HundredePctBean;
28 import dk.daoas.daoadresseservice.beans.SearchRequest;
29 import dk.daoas.daoadresseservice.beans.SearchResult;
30 import dk.daoas.daoadresseservice.beans.SearchResult.Status;
31 import dk.daoas.daoadresseservice.db.DatabaseLayer;
32 import dk.daoas.daoadresseservice.util.DaoUtils;
33 import dk.daoas.daoadresseservice.util.DeduplicateHelper;
34 import dk.daoas.daoadresseservice.util.NaturalOrderComparator;
35
36 public class AddressSearch {
37
38 private Map<Short, Map<String,Integer>> searchPostnrVejnavnGadeid;
39 private Map<Integer, Map<String,Address>> searchGadeidentAdresser;
40
41 private List<Address> alleAdresser;
42
43 private Map<String,Integer> helperCache;
44
45 private DataStatisticsBean stats = new DataStatisticsBean();
46
47 private DatabaseLayer db;
48
49
50 StreetnameHelper levenshteinHelper;
51 StreetnameHelper googleHelper;
52 StreetnameHelper osmHelper;
53
54
55 public AddressSearch(DatabaseLayer db, ServiceConfig config) {
56
57 this.db = db;
58
59 levenshteinHelper = new LevenshteinStreetnameHelper( this );
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
232 // Brug OpenStreetMap før vi prøver google
233 // For google har en request limit, det har OSM ikke!
234 if ( gadeident == null && useExternal) {
235 String vej = osmHelper.proposeStreetName(request, result);
236 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
237 }
238
239 if ( gadeident == null && useExternal) {
240 String vej = googleHelper.proposeStreetName(request, result);
241 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
242 }
243 return gadeident;
244 }
245
246 private Integer helperWrapper(String vej, Map<String,Integer> postnrVeje, String helperSearchKey) {
247 if (vej == null)
248 return null;
249
250 String vejVasket = AddressUtils.vaskVejnavn( vej );
251 Integer gadeident = postnrVeje.get(vejVasket);
252
253 if (gadeident != null) {
254 helperCache.put(helperSearchKey, gadeident);
255 }
256 return gadeident;
257
258 }
259
260 public Map<String,Integer> getStretsByPostal(short zip) {
261 return searchPostnrVejnavnGadeid.get(zip);
262 }
263
264
265
266 public void buildSearchStructures() throws SQLException{
267 searchPostnrVejnavnGadeid = new HashMap<Short, Map<String,Integer>>();
268 searchGadeidentAdresser = new HashMap<Integer, Map<String,Address>>();
269 helperCache = new ConcurrentHashMap<String,Integer>();
270
271 long start1 = System.currentTimeMillis();
272 System.out.println("Build -- stage 1");
273
274 alleAdresser = db.getAllAdresses();
275
276
277 /* Mapper mellem db Row ID og adresse noden */
278 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
279 DeduplicateHelper<String> aliasHelper = new DeduplicateHelper<String>();
280 DeduplicateHelper<String> husnrHelper = new DeduplicateHelper<String>();
281
282 for (Address a : alleAdresser) {
283 idAddressMap.put(a.id, a);
284
285 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
286
287 if (postnrVeje == null) {
288 postnrVeje = new ConcurrentHashMap<String,Integer>();
289 searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
290 }
291
292
293 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
294 Integer gadeident = postnrVeje.get(vasketVejnavn);
295 if (gadeident == null) {
296 //postnrVeje.put(vasketVejnavn, a.gadeid);
297
298 gadeident = a.gadeid;
299
300 Set<String> aliaser = findVejAliaser(a.vejnavn);
301 for(String alias : aliaser) {
302 String vasketAlias = AddressUtils.vaskVejnavn(alias);
303 vasketAlias = aliasHelper.getInstance(vasketAlias);
304
305 postnrVeje.put(vasketAlias, gadeident);
306 }
307 }
308
309 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
310 if (gade == null) {
311 gade = new HashMap<String, Address>();
312 searchGadeidentAdresser.put(gadeident, gade);
313 }
314 String husnrSearch = "" + a.husnr + a.husnrbogstav;
315 husnrSearch = husnrHelper.getInstance(husnrSearch);
316 gade.put(husnrSearch, a);
317 }
318
319 ////////////////////////////////////////////////////////////////////////////////////////
320 long start2 = System.currentTimeMillis();
321 System.out.println("Build, stage1 elapsed: " + (start2-start1) );
322 System.out.println("Build -- stage 2 alias tabel");
323
324 int vaskCount = 0;
325 List<AliasBean> aliasList = db.getAliasList();
326 for (AliasBean alias : aliasList) {
327 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(alias.postnr);
328
329 if (postnrVeje == null) {
330 //Burde ikke kunne ske - men better safe than sorry
331 continue;
332 }
333
334 String vasketVej = AddressUtils.vaskVejnavn(alias.vejnavn);
335 String vasketAlias = AddressUtils.vaskVejnavn(alias.aliasVejnavn);
336
337 Integer gadeident = postnrVeje.get(vasketVej);
338 if (gadeident == null) {
339 //Kender ikke den oprindelige vej
340 continue;
341 }
342
343 Integer aliasIdent = postnrVeje.get(vasketAlias);
344
345 if (aliasIdent == null) { //Vi kender ikke denne variant af vejnavnet
346 postnrVeje.put(vasketAlias, gadeident);
347 vaskCount++;
348 }
349
350 }
351 System.out.println("Anvendte " + vaskCount + " aliaser fra databasen");
352
353
354 ////////////////////////////////////////////////////////////////////////////////////////
355 long start3 = System.currentTimeMillis();
356 System.out.println("Build, stage2 elapsed: " + (start3-start2) );
357 System.out.println("Build -- stage 3 udvidet dækning");
358
359 DeduplicateHelper<String> ruteHelper = new DeduplicateHelper<String>();
360 DeduplicateHelper<String> korelisteHelper = new DeduplicateHelper<String>();
361
362 List<ExtendedBean> extDao = db.getExtendedAdresslist();
363 for (ExtendedBean eb : extDao) {
364
365 Address orgAddress = idAddressMap.get(eb.orgId);
366 if (orgAddress == null)
367 continue;
368
369 if (orgAddress.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
370 //kan være at adressen er blevet markeret dækket og - find-nærmeste data ikke er opdateret i mellemtiden
371 continue;
372 }
373
374 Address targetAddress = idAddressMap.get(eb.targetId);
375 if (targetAddress == null) {
376 continue;
377 }
378
379
380 if ( StringUtils.equals(orgAddress.distributor, "LUKKET") ) {
381 continue;
382 }
383
384
385
386 if ( StringUtils.equals(targetAddress.distributor, "LUKKET") ) {
387 continue;
388 }
389
390 orgAddress.extTarget = targetAddress;
391 orgAddress.extAfstand = eb.afstand;
392
393 boolean covered = false;
394 if (targetAddress.distributor.equals("DAO")) {
395 orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
396 orgAddress.rute = ruteHelper.getInstance(orgAddress.rute);
397
398 if (orgAddress.rute != null) {
399 orgAddress.koreliste = targetAddress.koreliste;
400 covered = true;
401 }
402 }
403
404 if (targetAddress.distributor.equals("BK")) {
405 orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
406 orgAddress.koreliste = korelisteHelper.getInstance(orgAddress.koreliste);
407
408 if (orgAddress.koreliste != null) {
409 orgAddress.rute = targetAddress.rute;
410 covered = true;
411 }
412 }
413
414 if (covered) { //Kopier resten af felterne
415 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
416 orgAddress.dbkBane = targetAddress.dbkBane;
417
418 /* Sådan gør den gamle service */
419 /* 20150520 THN- hvis vi bibeholder de originale kommune+vejkoder kan vi bruge DAVID til join i databasen*/
420 //orgAddress.kommunekode = targetAddress.kommunekode;
421 //orgAddress.vejkode = targetAddress.vejkode;
422
423
424 orgAddress.distributor = targetAddress.distributor;
425 }
426 }
427
428 // nu skal vi ikke bruge idAddressMap længere
429 idAddressMap = null;
430
431 //////////////////////////////////////////////////////////////////////////////////////
432 long start4 = System.currentTimeMillis();
433 System.out.println("Build, stage3 elapsed: " + (start4-start3) );
434 System.out.println("Build -- stage 4 - 100pct");
435
436 Map<Short,HundredePctBean> hundredePct = db.get100PctList();
437 for (Address addr : alleAdresser) {
438 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
439 continue;
440 }
441
442 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
443 continue;
444 }
445
446
447 HundredePctBean bean = hundredePct.get(addr.postnr);
448 if (bean == null) {
449 continue;
450 }
451
452 addr.daekningsType = DaekningsType.DAEKNING_100PCT;
453 addr.rute = bean.rute;
454 addr.koreliste = bean.koreliste;
455 addr.dbkBane = bean.dbkBane;
456 addr.distributor = bean.distributor;
457 }
458
459 ////////////////////////////////////////////////////////////////////////////////////
460 long stop = System.currentTimeMillis();
461 System.out.println("Build, stage4 elapsed: " + (stop-start4) );
462 System.out.println("Build -- Gathering statistics");
463
464 for (Address addr : alleAdresser) {
465 switch (addr.daekningsType) {
466 case DAEKNING_DIREKTE:
467 stats.direkteCount++;
468 break;
469 case DAEKNING_UDVIDET:
470 stats.extendedCount++;
471 break;
472 case DAEKNING_100PCT:
473 stats.hundredePctCount++;
474 break;
475 default:
476 stats.ikkeDaekketCount++;
477 }
478 }
479 stats.totalCount = alleAdresser.size();
480
481
482 stats.elapsed = stop-start1;
483 stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() );
484
485 System.out.println("Build: totalCount: " + stats.totalCount);
486 System.out.println("Build: direkteCount: " + stats.direkteCount);
487 System.out.println("Build: extendedCount: " + stats.extendedCount);
488 System.out.println("Build: hundredePctCount: " + stats.hundredePctCount);
489 System.out.println("Build: ikkeDaekketCount: " + stats.ikkeDaekketCount);
490
491 System.out.println("Build: Total Elapsed: " + (stop-start1) );
492 System.out.println("Build Completed");
493
494 }
495
496 public DataStatisticsBean getStatistics() {
497 return stats;
498 }
499
500 public DatabaseLayer getDatabaseLayer() {
501 return db;
502 }
503
504 public void clear() {
505 searchPostnrVejnavnGadeid.clear();
506 searchGadeidentAdresser.clear();
507 alleAdresser.clear();
508 helperCache.clear();
509 }
510
511
512 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
513 if (targetAddress.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel
514 return null;
515 }
516
517 // ///////////////////////////////////////////////////////////////////
518 switch( eb.transport) {
519 case "cykel":
520 if (eb.afstand < 0.151) {
521 return "." + targetAddress.rute;
522 } else if (eb.afstand < 0.501) {
523 return ".." + targetAddress.rute;
524 } else if (eb.afstand < 0.701) {
525 return "..." + targetAddress.rute;
526 } else if (eb.afstand < 1.001) {
527 return "...." + targetAddress.rute;
528 }
529 break;
530 case "scooter":
531 if (eb.afstand < 0.151) {
532 return "." + targetAddress.rute;
533 } else if (eb.afstand < 0.801) {
534 return ".." + targetAddress.rute;
535 } else if (eb.afstand < 1.201) {
536 return "..." + targetAddress.rute;
537 } else if (eb.afstand < 2.101) {
538 return "...." + targetAddress.rute;
539 }
540 break;
541 case "bil":
542 if (eb.afstand < 0.151) {
543 return "." + targetAddress.rute;
544 } else if (eb.afstand < 1.001) {
545 return ".." + targetAddress.rute;
546 } else if (eb.afstand < 1.601) {
547 return "..." + targetAddress.rute;
548 } else if (eb.afstand < 2.601) {
549 return "...." + targetAddress.rute;
550 }
551 break;
552 default:
553 System.out.println("Ukendt transport type: " + eb );
554 }
555 return null;
556 }
557
558 public List<Address> getNonCoveredAddresses() {
559 List<Address> result = new ArrayList<Address>(60000);
560 for (Address a : alleAdresser) {
561 if ( a.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
562 result.add(a);
563 }
564 }
565 Collections.sort(result );
566 return result;
567 }
568
569 public List<Address> get100PctAddresses() {
570 List<Address> result = new ArrayList<Address>(120000);
571 for (Address a : alleAdresser) {
572 if ( a.daekningsType == DaekningsType.DAEKNING_100PCT) {
573 result.add(a);
574 }
575 }
576 Collections.sort(result );
577 return result;
578 }
579
580 ///////////////////////////////////////////////////////////
581 private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
582 String inject;
583 if (eb.afstand <= 0.500) {
584 inject = ".";
585 } else {
586 inject = "..";
587 }
588 return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
589 }
590
591 private Set<String> findVejAliaser(String vejnavn) {
592 vejnavn = vejnavn.toLowerCase();
593 HashSet<String> aliasSet = new HashSet<String>();
594 aliasSet.add(vejnavn);
595
596 aliasSet.add(vejnavn.replace("alle", "allé") );
597 aliasSet.add(vejnavn.replace("allé", "alle") );
598
599
600 // forkortelser
601 aliasSet.add(vejnavn.replace("dronningens", "dr") );
602 aliasSet.add(vejnavn.replace("dr.", "dronningens") );
603 aliasSet.add(vejnavn.replace("dr ", "dronningens") );
604
605 aliasSet.add(vejnavn.replace("dronning", "dr") );
606 aliasSet.add(vejnavn.replace("dr.", "dronning") );
607 aliasSet.add(vejnavn.replace("dr ", "dronning") );
608
609 aliasSet.add(vejnavn.replace("kng", "kongen") );
610 aliasSet.add(vejnavn.replace("kongen", "kng") );
611
612 aliasSet.add(vejnavn.replace("kvt", "kvarter") );
613 aliasSet.add(vejnavn.replace("kvarter", "kvt") );
614
615 aliasSet.add(vejnavn.replace("gl", "gammel") );
616 aliasSet.add(vejnavn.replace("gammel", "gl") );
617
618 aliasSet.add(vejnavn.replace("gl", "gamle") );
619 aliasSet.add(vejnavn.replace("gamle", "gl") );
620
621 aliasSet.add(vejnavn.replace("lille", "ll") );
622 aliasSet.add(vejnavn.replace("ll ", "lille") );
623 aliasSet.add(vejnavn.replace("ll.", "lille") );
624
625 aliasSet.add(vejnavn.replace("store", "st") );
626 aliasSet.add(vejnavn.replace("st ", "store") );
627 aliasSet.add(vejnavn.replace("st.", "store") );
628
629 aliasSet.add(vejnavn.replace("søndre", "sdr") );
630 aliasSet.add(vejnavn.replace("sdr", "søndre") );
631 aliasSet.add(vejnavn.replace("sønder", "sdr") );
632 aliasSet.add(vejnavn.replace("sdr", "sønder") );
633
634
635 aliasSet.add(vejnavn.replace("nørre", "nr") );
636 aliasSet.add(vejnavn.replace("nr", "nørre") );
637
638 aliasSet.add(vejnavn.replace("nordre", "ndr") );
639 aliasSet.add(vejnavn.replace("ndr", "nordre") );
640
641
642 aliasSet.add(vejnavn.replace("vestre", "vester") );
643 aliasSet.add(vejnavn.replace("vester", "vestre") );
644
645 aliasSet.add(vejnavn.replace("søndre", "sønder") );
646 aliasSet.add(vejnavn.replace("sønder", "søndre") );
647
648 aliasSet.add(vejnavn.replace("østre", "øster") );
649 aliasSet.add(vejnavn.replace("øster", "østre") );
650
651 aliasSet.add(vejnavn.replace("borgmester", "borgm") );
652 aliasSet.add(vejnavn.replace("borgm", "borgmester") );
653
654
655 aliasSet.add(vejnavn.replace("sankt", "skt") );
656 aliasSet.add(vejnavn.replace("sankt", "sct") );
657 aliasSet.add(vejnavn.replace("skt", "sankt") );
658
659 aliasSet.add(vejnavn.replace("skt", "sct") );
660 aliasSet.add(vejnavn.replace("sct", "skt") );
661
662
663
664 // fornavn forkortelser
665 aliasSet.add(vejnavn.replace("john", "j") );
666 aliasSet.add(vejnavn.replace("thomas", "th") );
667 aliasSet.add(vejnavn.replace("thorvald", "th") );
668 aliasSet.add(vejnavn.replace("frederik", "fr") );
669 aliasSet.add(vejnavn.replace("frederiks", "fr") );
670
671
672 aliasSet.add(vejnavn.replace("christian", "chr") );
673 aliasSet.add(vejnavn.replace("christians", "chr") );
674 aliasSet.add(vejnavn.replace("kristian", "kr") );
675 aliasSet.add(vejnavn.replace("kristians", "kr") );
676
677 aliasSet.add(vejnavn.replace("mylius", "myl") );
678 aliasSet.add(vejnavn.replace("myl", "mylius") );
679
680
681 // alternative stavninger
682 aliasSet.add(vejnavn.replace("peder", "peter") );
683 aliasSet.add(vejnavn.replace("peter", "peder") );
684
685
686
687 // Romertal
688 aliasSet.add(vejnavn.replace("1", "i") );
689 aliasSet.add(vejnavn.replace("i", "1") );
690
691 aliasSet.add(vejnavn.replace("2", "ii") );
692 aliasSet.add(vejnavn.replace("ii", "2") );
693
694 aliasSet.add(vejnavn.replace("3", "iii") );
695 aliasSet.add(vejnavn.replace("iii", "3") );
696
697 aliasSet.add(vejnavn.replace("4", "iv") );
698 aliasSet.add(vejnavn.replace("iv", "4") );
699
700 aliasSet.add(vejnavn.replace("5", "v") );
701 aliasSet.add(vejnavn.replace("v", "5") );
702
703 aliasSet.add(vejnavn.replace("6", "vi") );
704 aliasSet.add(vejnavn.replace("vi", "6") );
705
706 aliasSet.add(vejnavn.replace("7", "vii") );
707 aliasSet.add(vejnavn.replace("vii", "7") );
708
709 aliasSet.add(vejnavn.replace("8", "viii") );
710 aliasSet.add(vejnavn.replace("viii", "8") );
711
712 aliasSet.add(vejnavn.replace("9", "ix") );
713 aliasSet.add(vejnavn.replace("ix", "9") );
714
715 aliasSet.add(vejnavn.replace("10", "x") );
716 aliasSet.add(vejnavn.replace("x", "10") );
717
718
719 //alternative måder at stave vej/gade/alle
720 aliasSet.add(vejnavn.replace("vej", "ve") );
721 aliasSet.add(vejnavn.replace("vej", "vj") );
722 aliasSet.add(vejnavn.replace("vej", "v") );
723 aliasSet.add(vejnavn.replace("vej", "vejen") );
724 aliasSet.add(vejnavn.replace("vejen", "vej") );
725
726 aliasSet.add(vejnavn.replace("v", "vej") );//Vi kan have vejnavne i DB der bare slutter på v istedet for vej
727
728 aliasSet.add(vejnavn.replace("alle", "all") );
729 aliasSet.add(vejnavn.replace("allé", "all") );
730 aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo
731 aliasSet.add(vejnavn.replace("allé", "allú") );
732
733 aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo
734 aliasSet.add(vejnavn.replace("gade", "gde") );
735
736 aliasSet.add(vejnavn.replace("plads", "pl") );
737 aliasSet.add(vejnavn.replace("vænget", "vænge") );
738
739 aliasSet.add(vejnavn.replace("boulevard", "blvd") );
740 aliasSet.add(vejnavn.replace("blvd", "boulevard") );
741
742 aliasSet.add(vejnavn.replace("boulevard", "boule") );
743 aliasSet.add(vejnavn.replace("boule", "boulevard") );
744
745 aliasSet.add(vejnavn.replace("kronborg", "krbg") ); //Krbg ladegårdsvej, 3000
746 aliasSet.add(vejnavn.replace("krbg", "kronborg") );
747
748 // Opbyg æøå varianter over alle fundne aliaser
749
750 @SuppressWarnings("unchecked")
751 HashSet<String> variants = (HashSet<String>) aliasSet.clone();
752
753 for (String vVejnavn : variants) {
754 // danske tegn 1
755 aliasSet.add( vVejnavn.replace("æ", "ae") );
756 aliasSet.add( vVejnavn.replace("ø", "oe") );
757 aliasSet.add( vVejnavn.replace("å", "aa") );
758 aliasSet.add( vVejnavn.replace("ae", "æ") );
759 aliasSet.add( vVejnavn.replace("oe", "ø") );
760 aliasSet.add( vVejnavn.replace("aa", "å") );
761
762 //danske tegn 2
763 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") );
764 aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") );
765 aliasSet.add( vVejnavn.replace("ø", "oe").replace("å", "aa") );
766 aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") );
767 aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") );
768 aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
769
770 //danske tegn 3
771 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
772 aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
773
774
775 //udenlandsketegn
776 aliasSet.add(vejnavn.replace("u", "ü") );
777 aliasSet.add(vejnavn.replace("ü", "u") );
778
779 aliasSet.add(vejnavn.replace("ä", "æ") );
780 aliasSet.add(vejnavn.replace("æ", "ä") );
781
782 aliasSet.add(vejnavn.replace("ö", "ø") );
783 aliasSet.add(vejnavn.replace("ø", "ö") );
784 }
785
786 return aliasSet;
787 }
788
789 public Set<Short> getPostnumre() {
790 return new TreeSet<Short>( searchPostnrVejnavnGadeid.keySet() );
791 }
792
793 public Set<Entry<String,Integer>> getVejnavne(short postnr) {
794 Map<String,Integer> map = searchPostnrVejnavnGadeid.get(postnr);
795
796 TreeMap<String,Integer> newMap = new TreeMap<String,Integer>( map );//Lav et nyt TreeMap for at sikre sortering
797
798 return newMap.entrySet();
799 }
800
801 public Set<String> getHusnumre(int gadeid) {
802
803 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
804
805 Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
806 set.addAll( gade.keySet() );
807
808 return set;
809 }
810
811 public Address getAdresse(int gadeid, String husnr) {
812
813 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
814 return gade.get(husnr);
815
816 }
817
818 }

  ViewVC Help
Powered by ViewVC 1.1.20