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

  ViewVC Help
Powered by ViewVC 1.1.20