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

  ViewVC Help
Powered by ViewVC 1.1.20