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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20