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

  ViewVC Help
Powered by ViewVC 1.1.20