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

  ViewVC Help
Powered by ViewVC 1.1.20