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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20