/[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 2504 - (show annotations) (download)
Wed Mar 25 12:58:13 2015 UTC (9 years, 1 month ago) by torben
File size: 21533 byte(s)
Sikre at input data er trimmet inden videre behandling
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.DeduplicateHelper;
31 import dk.daoas.daoadresseservice.util.NaturalOrderComparator;
32
33 public class AddressSearch {
34
35 private Map<Short, Map<String,Integer>> searchPostnrVejnavnGadeid;
36 private Map<Integer, Map<String,Address>> searchGadeidentAdresser;
37
38 private List<Address> alleAdresser;
39
40 private Map<String,Integer> helperCache;
41
42 private DataStatisticsBean stats = new DataStatisticsBean();
43
44 ServiceConfig config;
45
46 StreetnameHelper levenshteinHelper;
47 StreetnameHelper googleHelper;
48 StreetnameHelper osmHelper;
49
50
51 public AddressSearch(ServiceConfig config) {
52 this.config = config;
53
54 levenshteinHelper = new LevenshteinStreetnameHelper( this );
55 googleHelper = new GoogleStreetnameHelper( config );
56 osmHelper = new OSMStreetnameHelper( config );
57 }
58
59
60 public SearchResult search(String postnrStr, String adresse) {
61
62 postnrStr = postnrStr.trim();
63 adresse = adresse.trim();
64
65
66 SearchRequest request = new SearchRequest();
67 SearchResult result = new SearchResult();
68
69
70 String helperSearchKey = "";
71
72 try {
73 request.postnr = Short.parseShort(postnrStr);
74 } catch (Exception E) {
75 result.status = Status.ERROR_UNKNOWN_POSTAL;
76 return result;
77 }
78
79
80 request.streetNames = searchPostnrVejnavnGadeid.get(request.postnr);
81
82 if (request.streetNames == null) {
83 result.status = Status.ERROR_UNKNOWN_POSTAL;
84 return result;
85 }
86
87
88 result.splitResult = AddressUtils.splitAdresse(adresse);
89 request.vejnavn = result.splitResult.vej;
90
91
92
93 if (result.splitResult.husnr.length() == 0) {
94 result.status = Status.ERROR_MISSING_HOUSENUMBER;
95 return result;
96 }
97
98 request.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn );
99
100
101 if (request.vasketVejnavn.indexOf("pakkebo") > -1
102 || request.vasketVejnavn.indexOf("døgnpost") > -1
103 || request.vasketVejnavn.indexOf("døgnbo") > -1
104 || request.vasketVejnavn.equals("id")
105 ) {
106 result.status = Status.ERROR_POSTBOX;
107 return result;
108 }
109
110 Integer gadeident = request.streetNames.get(request.vasketVejnavn);
111
112
113 if ( gadeident == null) {
114 helperSearchKey = "" + request.postnr + "/" + request.vasketVejnavn;
115 gadeident = helperCache.get(helperSearchKey);
116 }
117
118 if (gadeident == null) {
119 String vej = levenshteinHelper.proposeStreetName(request, result);
120 if (vej != null) {
121 gadeident = request.streetNames.get(vej);
122 }
123 }
124
125
126 // Brug OpenStreetMap før vi prøver google
127 // For google har en request limit, det har OSM ikke!
128 if ( gadeident == null) {
129 String vej = osmHelper.proposeStreetName(request, result);
130 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
131 }
132
133 if ( gadeident == null) {
134 String vej = googleHelper.proposeStreetName(request, result);
135 gadeident = helperWrapper(vej, request.streetNames, helperSearchKey);
136 }
137
138
139
140 if (gadeident == null) {
141 result.status = Status.ERROR_UNKNOWN_STREETNAME;
142 return result;
143 }
144
145 result.gadeident = gadeident;
146
147
148 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
149 if (gade == null) { //Denne søgning må ikke fejle
150 result.status = Status.ERROR_INTERNAL;
151 return result;
152 }
153
154
155 //Kunne evt klares med Iterables.get fra Guava/Collections
156 Address firstAddress = gade.values().iterator().next();
157 result.vej = firstAddress.vejnavn;
158
159 String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra;
160 Address addr = gade.get(husnrSearch);
161
162 if (addr == null) {
163 result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
164 return result;
165 }
166
167 result.address = addr;
168
169
170 if ( StringUtils.equals(addr.distributor, "LUKKET") ) {
171 result.status = Status.STATUS_NOT_COVERED; //Skal vi have en special status til Lukkede adresser ?
172 return result;
173 }
174
175 if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
176 result.status = Status.STATUS_NOT_COVERED;
177 return result;
178 }
179
180
181 result.status = Status.STATUS_OK;
182
183 return result;
184 }
185
186 private Integer helperWrapper(String vej, Map<String,Integer> postnrVeje, String helperSearchKey) {
187 if (vej == null)
188 return null;
189
190 String vejVasket = AddressUtils.vaskVejnavn( vej );
191 Integer gadeident = postnrVeje.get(vejVasket);
192
193 if (gadeident != null) {
194 helperCache.put(helperSearchKey, gadeident);
195 }
196 return gadeident;
197
198 }
199
200 public Map<String,Integer> getStretsByPostal(int zip) {
201 return searchPostnrVejnavnGadeid.get(zip);
202 }
203
204
205
206 public void buildSearchStructures() throws SQLException{
207 searchPostnrVejnavnGadeid = new HashMap<Short, Map<String,Integer>>();
208 searchGadeidentAdresser = new HashMap<Integer, Map<String,Address>>();
209 helperCache = new ConcurrentHashMap<String,Integer>();
210
211 long start1 = System.currentTimeMillis();
212 System.out.println("Build -- stage 1");
213
214 alleAdresser = DatabaseLayer.getAllAdresses();
215
216
217 /* Mapper mellem db Row ID og adresse noden */
218 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
219 DeduplicateHelper<String> aliasHelper = new DeduplicateHelper<String>();
220 DeduplicateHelper<String> husnrHelper = new DeduplicateHelper<String>();
221
222 for (Address a : alleAdresser) {
223 idAddressMap.put(a.id, a);
224
225 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
226
227 if (postnrVeje == null) {
228 postnrVeje = new ConcurrentHashMap<String,Integer>();
229 searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
230 }
231
232
233 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
234 Integer gadeident = postnrVeje.get(vasketVejnavn);
235 if (gadeident == null) {
236 //postnrVeje.put(vasketVejnavn, a.gadeid);
237
238 gadeident = a.gadeid;
239
240 Set<String> aliaser = findVejAliaser(a.vejnavn);
241 for(String alias : aliaser) {
242 String vasketAlias = AddressUtils.vaskVejnavn(alias);
243 vasketAlias = aliasHelper.getInstance(vasketAlias);
244
245 postnrVeje.put(vasketAlias, gadeident);
246 }
247 }
248
249 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
250 if (gade == null) {
251 gade = new HashMap<String, Address>();
252 searchGadeidentAdresser.put(gadeident, gade);
253 }
254 String husnrSearch = "" + a.husnr + a.husnrbogstav;
255 husnrSearch = husnrHelper.getInstance(husnrSearch);
256 gade.put(husnrSearch, a);
257 }
258
259 ////////////////////////////////////////////////////////////////////////////////////////
260 long start2 = System.currentTimeMillis();
261 System.out.println("Build, stage1 elapsed: " + (start2-start1) );
262 System.out.println("Build -- stage 2 alias tabel");
263
264 int vaskCount = 0;
265 List<AliasBean> aliasList = DatabaseLayer.getAliasList();
266 for (AliasBean alias : aliasList) {
267 Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(alias.postnr);
268
269 if (postnrVeje == null) {
270 //Burde ikke kunne ske - men better safe than sorry
271 continue;
272 }
273
274 String vasketVej = AddressUtils.vaskVejnavn(alias.vejnavn);
275 String vasketAlias = AddressUtils.vaskVejnavn(alias.aliasVejnavn);
276
277 Integer gadeident = postnrVeje.get(vasketVej);
278 if (gadeident == null) {
279 //Kender ikke den oprindelige vej
280 continue;
281 }
282
283 Integer aliasIdent = postnrVeje.get(vasketAlias);
284
285 if (aliasIdent == null) { //Vi kender ikke denne variant af vejnavnet
286 postnrVeje.put(vasketAlias, gadeident);
287 vaskCount++;
288 }
289
290 }
291 System.out.println("Anvendte " + vaskCount + " aliaser fra databasen");
292
293
294 ////////////////////////////////////////////////////////////////////////////////////////
295 long start3 = System.currentTimeMillis();
296 System.out.println("Build, stage2 elapsed: " + (start3-start2) );
297 System.out.println("Build -- stage 3 udvidet dækning");
298
299 DeduplicateHelper<String> ruteHelper = new DeduplicateHelper<String>();
300 DeduplicateHelper<String> korelisteHelper = new DeduplicateHelper<String>();
301
302 List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
303 for (ExtendedBean eb : extDao) {
304
305 Address orgAddress = idAddressMap.get(eb.orgId);
306 if (orgAddress == null)
307 continue;
308
309 if (orgAddress.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
310 //kan være at adressen er blevet markeret dækket og - find-nærmeste data ikke er opdateret i mellemtiden
311 continue;
312 }
313
314 Address targetAddress = idAddressMap.get(eb.targetId);
315 if (targetAddress == null) {
316 continue;
317 }
318
319
320 if ( StringUtils.equals(orgAddress.distributor, "LUKKET") ) {
321 continue;
322 }
323
324
325
326 if ( StringUtils.equals(targetAddress.distributor, "LUKKET") ) {
327 continue;
328 }
329
330 orgAddress.extTarget = targetAddress;
331 orgAddress.extAfstand = eb.afstand;
332
333 boolean covered = false;
334 if (targetAddress.distributor.equals("DAO")) {
335 orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
336 orgAddress.rute = ruteHelper.getInstance(orgAddress.rute);
337
338 if (orgAddress.rute != null) {
339 orgAddress.koreliste = targetAddress.koreliste;
340 covered = true;
341 }
342 }
343
344 if (targetAddress.distributor.equals("BK")) {
345 orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
346 orgAddress.koreliste = korelisteHelper.getInstance(orgAddress.koreliste);
347
348 if (orgAddress.koreliste != null) {
349 orgAddress.rute = targetAddress.rute;
350 covered = true;
351 }
352 }
353
354 if (covered) { //Kopier resten af felterne
355 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
356 orgAddress.dbkBane = targetAddress.dbkBane;
357
358 /* Sådan gør den gamle service */
359 orgAddress.kommunekode = targetAddress.kommunekode;
360 orgAddress.vejkode = targetAddress.vejkode;
361
362 orgAddress.distributor = targetAddress.distributor;
363 }
364 }
365
366 // nu skal vi ikke bruge idAddressMap længere
367 idAddressMap = null;
368
369 //////////////////////////////////////////////////////////////////////////////////////
370 long start4 = System.currentTimeMillis();
371 System.out.println("Build, stage3 elapsed: " + (start4-start3) );
372 System.out.println("Build -- stage 4 - 100pct");
373
374 Map<Short,HundredePctBean> hundredePct = DatabaseLayer.get100PctList();
375 for (Address addr : alleAdresser) {
376 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
377 continue;
378 }
379
380 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
381 continue;
382 }
383
384
385 HundredePctBean bean = hundredePct.get(addr.postnr);
386 if (bean == null) {
387 continue;
388 }
389
390 addr.daekningsType = DaekningsType.DAEKNING_100PCT;
391 addr.rute = bean.rute;
392 addr.koreliste = bean.koreliste;
393 addr.dbkBane = bean.dbkBane;
394 addr.distributor = bean.distributor;
395 }
396
397 ////////////////////////////////////////////////////////////////////////////////////
398 long stop = System.currentTimeMillis();
399 System.out.println("Build, stage3 elapsed: " + (stop-start4) );
400 System.out.println("Build -- Gathering statistics");
401
402 for (Address addr : alleAdresser) {
403 switch (addr.daekningsType) {
404 case DAEKNING_DIREKTE:
405 stats.direkteCount++;
406 break;
407 case DAEKNING_UDVIDET:
408 stats.extendedCount++;
409 break;
410 case DAEKNING_100PCT:
411 stats.hundredePctCount++;
412 break;
413 default:
414 stats.ikkeDaekketCount++;
415 }
416 }
417
418
419 stats.elapsed = stop-start1;
420 stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() );
421
422 System.out.println("Build: direkteCount: " + stats.direkteCount);
423 System.out.println("Build: extendedCount: " + stats.extendedCount);
424 System.out.println("Build: hundredePctCount: " + stats.hundredePctCount);
425 System.out.println("Build: ikkeDaekketCount: " + stats.ikkeDaekketCount);
426
427 System.out.println("Build: Total Elapsed: " + (stop-start1) );
428 System.out.println("Build Completed");
429
430 }
431
432 public DataStatisticsBean getStatistics() {
433 return stats;
434 }
435
436 public void clear() {
437 searchPostnrVejnavnGadeid.clear();
438 searchGadeidentAdresser.clear();
439 alleAdresser.clear();
440 helperCache.clear();
441 }
442
443
444 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
445 if (targetAddress.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel
446 return null;
447 }
448
449 // ///////////////////////////////////////////////////////////////////
450 switch( eb.transport) {
451 case "cykel":
452 if (eb.afstand < 0.151) {
453 return "." + targetAddress.rute;
454 } else if (eb.afstand < 0.501) {
455 return ".." + targetAddress.rute;
456 } else if (eb.afstand < 0.701) {
457 return "..." + targetAddress.rute;
458 } else if (eb.afstand < 0.501) {
459 return "...." + targetAddress.rute;
460 }
461 break;
462 case "scooter":
463 if (eb.afstand < 0.151) {
464 return "." + targetAddress.rute;
465 } else if (eb.afstand < 0.801) {
466 return ".." + targetAddress.rute;
467 } else if (eb.afstand < 1.201) {
468 return "..." + targetAddress.rute;
469 } else if (eb.afstand < 2.101) {
470 return "...." + targetAddress.rute;
471 }
472 break;
473 case "bil":
474 if (eb.afstand < 0.151) {
475 return "." + targetAddress.rute;
476 } else if (eb.afstand < 1.001) {
477 return ".." + targetAddress.rute;
478 } else if (eb.afstand < 1.601) {
479 return "..." + targetAddress.rute;
480 } else if (eb.afstand < 2.601) {
481 return "...." + targetAddress.rute;
482 }
483 break;
484 }
485 return null;
486 }
487
488 public List<Address> getNonCoveredAddresses() {
489 List<Address> result = new ArrayList<Address>(60000);
490 for (Address a : alleAdresser) {
491 if ( a.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
492 result.add(a);
493 }
494 }
495 Collections.sort(result );
496 return result;
497 }
498
499 ///////////////////////////////////////////////////////////
500 private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
501 String inject;
502 if (eb.afstand <= 0.500) {
503 inject = ".";
504 } else {
505 inject = "..";
506 }
507 return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
508 }
509
510 private Set<String> findVejAliaser(String vejnavn) {
511 vejnavn = vejnavn.toLowerCase();
512 HashSet<String> aliasSet = new HashSet<String>();
513 aliasSet.add(vejnavn);
514
515 aliasSet.add(vejnavn.replace("u", "ü") );
516 aliasSet.add(vejnavn.replace("ü", "u") );
517
518 aliasSet.add(vejnavn.replace("alle", "allé") );
519 aliasSet.add(vejnavn.replace("allé", "alle") );
520
521 aliasSet.add(vejnavn.replace("dronningens", "dr") );
522 aliasSet.add(vejnavn.replace("dr.", "dronningens") );
523 aliasSet.add(vejnavn.replace("dr ", "dronningens") );
524
525 aliasSet.add(vejnavn.replace("dronning", "dr") );
526 aliasSet.add(vejnavn.replace("dr.", "dronning") );
527 aliasSet.add(vejnavn.replace("dr ", "dronning") );
528
529 aliasSet.add(vejnavn.replace("kng", "kongen") );
530 aliasSet.add(vejnavn.replace("kongen", "kng") );
531
532 aliasSet.add(vejnavn.replace("kvt", "kvarter") );
533 aliasSet.add(vejnavn.replace("kvarter", "kvt") );
534
535 aliasSet.add(vejnavn.replace("gl", "gammel") );
536 aliasSet.add(vejnavn.replace("gammel", "gl") );
537
538 aliasSet.add(vejnavn.replace("lille", "ll") );
539 aliasSet.add(vejnavn.replace("ll ", "lille") );
540 aliasSet.add(vejnavn.replace("ll.", "lille") );
541
542 aliasSet.add(vejnavn.replace("store", "st") );
543 aliasSet.add(vejnavn.replace("st ", "store") );
544 aliasSet.add(vejnavn.replace("st.", "store") );
545
546 aliasSet.add(vejnavn.replace("søndre", "sdr") );
547 aliasSet.add(vejnavn.replace("sdr", "søndre") );
548
549
550 aliasSet.add(vejnavn.replace("nørre", "nr") );
551 aliasSet.add(vejnavn.replace("nr", "nørre") );
552
553 aliasSet.add(vejnavn.replace("nordre", "ndr") );
554 aliasSet.add(vejnavn.replace("ndr", "nordre") );
555
556 aliasSet.add(vejnavn.replace("sankt", "skt") );
557 aliasSet.add(vejnavn.replace("sankt", "sct") );
558 aliasSet.add(vejnavn.replace("skt", "sankt") );
559
560 aliasSet.add(vejnavn.replace("skt", "sct") );
561 aliasSet.add(vejnavn.replace("sct", "skt") );
562
563
564 // fornavn forkortelser
565 aliasSet.add(vejnavn.replace("john", "j") );
566 aliasSet.add(vejnavn.replace("thomas", "th") );
567 aliasSet.add(vejnavn.replace("thorvald", "th") );
568
569
570 // Romertal
571 aliasSet.add(vejnavn.replace("1", "i") );
572 aliasSet.add(vejnavn.replace("i", "1") );
573
574 aliasSet.add(vejnavn.replace("2", "ii") );
575 aliasSet.add(vejnavn.replace("ii", "2") );
576
577 aliasSet.add(vejnavn.replace("3", "iii") );
578 aliasSet.add(vejnavn.replace("iii", "3") );
579
580 aliasSet.add(vejnavn.replace("4", "iv") );
581 aliasSet.add(vejnavn.replace("iv", "4") );
582
583 aliasSet.add(vejnavn.replace("5", "v") );
584 aliasSet.add(vejnavn.replace("v", "5") );
585
586 aliasSet.add(vejnavn.replace("6", "vi") );
587 aliasSet.add(vejnavn.replace("vi", "6") );
588
589 aliasSet.add(vejnavn.replace("7", "vii") );
590 aliasSet.add(vejnavn.replace("vii", "7") );
591
592 aliasSet.add(vejnavn.replace("8", "viii") );
593 aliasSet.add(vejnavn.replace("viii", "8") );
594
595 aliasSet.add(vejnavn.replace("9", "ix") );
596 aliasSet.add(vejnavn.replace("ix", "9") );
597
598 aliasSet.add(vejnavn.replace("10", "x") );
599 aliasSet.add(vejnavn.replace("x", "10") );
600
601
602 //alternative måder at stave vej/gade/alle
603 aliasSet.add(vejnavn.replace("vej", "ve") );
604 aliasSet.add(vejnavn.replace("vej", "vj") );
605 aliasSet.add(vejnavn.replace("vej", "v") );
606 aliasSet.add(vejnavn.replace("vej", "vejen") );
607 aliasSet.add(vejnavn.replace("vejen", "vej") );
608
609 aliasSet.add(vejnavn.replace("alle", "all") );
610 aliasSet.add(vejnavn.replace("allé", "all") );
611 aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo
612 aliasSet.add(vejnavn.replace("allé", "allú") );
613
614 aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo
615 aliasSet.add(vejnavn.replace("gade", "gde") );
616
617 aliasSet.add(vejnavn.replace("plads", "pl") );
618 aliasSet.add(vejnavn.replace("vænget", "vænge") );
619
620
621 // Opbyg æøå varianter over alle fundne aliaser
622
623 @SuppressWarnings("unchecked")
624 HashSet<String> variants = (HashSet<String>) aliasSet.clone();
625
626 for (String vVejnavn : variants) {
627 // danske tegn 1
628 aliasSet.add( vVejnavn.replace("æ", "ae") );
629 aliasSet.add( vVejnavn.replace("ø", "oe") );
630 aliasSet.add( vVejnavn.replace("å", "aa") );
631 aliasSet.add( vVejnavn.replace("ae", "æ") );
632 aliasSet.add( vVejnavn.replace("oe", "ø") );
633 aliasSet.add( vVejnavn.replace("aa", "å") );
634
635 //danske tegn 2
636 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") );
637 aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") );
638 aliasSet.add( vVejnavn.replace("ø", "oe").replace("å", "aa") );
639 aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") );
640 aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") );
641 aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
642
643 //danske tegn 3
644 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
645 aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
646 }
647
648 return aliasSet;
649 }
650
651 public Set<Short> getPostnumre() {
652 return new TreeSet<Short>( searchPostnrVejnavnGadeid.keySet() );
653 }
654
655 public Set<Entry<String,Integer>> getVejnavne(short postnr) {
656 Map<String,Integer> map = searchPostnrVejnavnGadeid.get(postnr);
657 TreeMap<String,Integer> newMap = new TreeMap<String,Integer>();
658 for (Entry<String,Integer> entry : map.entrySet() ) {
659 newMap.put(entry.getKey(), entry.getValue());
660 }
661
662 return newMap.entrySet();
663 }
664
665 public Set<String> getHusnumre(int gadeid) {
666
667 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
668
669 Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
670 set.addAll( gade.keySet() );
671
672 return set;
673 }
674
675 public Address getAdresse(int gadeid, String husnr) {
676
677 Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);
678 return gade.get(husnr);
679
680 }
681
682 }

  ViewVC Help
Powered by ViewVC 1.1.20