--- dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/27 10:19:15 2397 +++ dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2015/03/24 11:05:24 2489 @@ -9,7 +9,10 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; @@ -20,13 +23,14 @@ import dk.daoas.daoadresseservice.beans.DataStatisticsBean; import dk.daoas.daoadresseservice.beans.ExtendedBean; import dk.daoas.daoadresseservice.beans.HundredePctBean; +import dk.daoas.daoadresseservice.beans.SearchRequest; import dk.daoas.daoadresseservice.beans.SearchResult; import dk.daoas.daoadresseservice.beans.SearchResult.Status; import dk.daoas.daoadresseservice.db.DatabaseLayer; -public class AdressSearch { +public class AddressSearch { - private Map> searchPostnrVejnavnGadeid; + private Map> searchPostnrVejnavnGadeid; private Map> searchGadeidentAdresser; private List
alleAdresser; @@ -37,35 +41,46 @@ ServiceConfig config; - public AdressSearch(ServiceConfig config) { + StreetnameHelper levenshteinHelper; + StreetnameHelper googleHelper; + StreetnameHelper osmHelper; + + + public AddressSearch(ServiceConfig config) { this.config = config; + + levenshteinHelper = new LevenshteinStreetnameHelper( this ); + googleHelper = new GoogleStreetnameHelper( config ); + osmHelper = new OSMStreetnameHelper( config ); } public SearchResult search(String postnrStr, String adresse) { - + SearchRequest request = new SearchRequest(); SearchResult result = new SearchResult(); - int postnr=0; String helperSearchKey = ""; try { - postnr = Integer.parseInt(postnrStr); + request.postnr = Integer.parseInt(postnrStr); } catch (Exception E) { result.status = Status.ERROR_UNKNOWN_POSTAL; return result; } - Map postnrVeje = searchPostnrVejnavnGadeid.get(postnr); - if (postnrVeje == null) { + request.streetNames = searchPostnrVejnavnGadeid.get(request.postnr); + + if (request.streetNames == null) { result.status = Status.ERROR_UNKNOWN_POSTAL; return result; } result.splitResult = AddressUtils.splitAdresse(adresse); + request.vejnavn = result.splitResult.vej; + if (result.splitResult.husnr.length() == 0) { @@ -73,21 +88,30 @@ return result; } - String vasketVejnavn = AddressUtils.vaskVejnavn( result.splitResult.vej ); + request.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn ); - Long gadeident = postnrVeje.get(vasketVejnavn); + + if (request.vasketVejnavn.indexOf("pakkebo") > -1 + || request.vasketVejnavn.indexOf("døgnpost") > -1 + || request.vasketVejnavn.indexOf("døgnbo") > -1 + || request.vasketVejnavn.equals("id") + ) { + result.status = Status.ERROR_POSTBOX; + return result; + } + + Long gadeident = request.streetNames.get(request.vasketVejnavn); if ( gadeident == null) { - helperSearchKey = "" + postnr + "/" + vasketVejnavn; + helperSearchKey = "" + request.postnr + "/" + request.vasketVejnavn; gadeident = helperCache.get(helperSearchKey); } if (gadeident == null) { - String best = getbestLevenshteinDistance(vasketVejnavn, postnrVeje); - if (best != null) { - result.levenshtein = true; - gadeident = postnrVeje.get(best); + String vej = levenshteinHelper.proposeStreetName(request, result); + if (vej != null) { + gadeident = request.streetNames.get(vej); } } @@ -95,21 +119,13 @@ // Brug OpenStreetMap før vi prøver google // For google har en request limit, det har OSM ikke! if ( gadeident == null) { - if (config.useOpenStreetMaps) { - result.osmVej = GeocodeHelper.openstreetmapHelper(config, postnr, result.splitResult.vej ); - result.osm = true; - - gadeident = helperWrapper(result.osmVej, postnrVeje, helperSearchKey); - } + String vej = osmHelper.proposeStreetName(request, result); + gadeident = helperWrapper(vej, request.streetNames, helperSearchKey); } if ( gadeident == null) { - if (config.useGoogle) { - result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej ); - result.google = true; - - gadeident = helperWrapper(result.googleVej, postnrVeje, helperSearchKey); - } + String vej = googleHelper.proposeStreetName(request, result); + gadeident = helperWrapper(vej, request.streetNames, helperSearchKey); } @@ -129,6 +145,10 @@ } + //Kunne evt klares med Iterables.get fra Guava/Collections + Address firstAddress = gade.values().iterator().next(); + result.vej = firstAddress.vejnavn; + String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra; Address addr = gade.get(husnrSearch); @@ -170,12 +190,14 @@ } - + public Map getStretsByPostal(int zip) { + return searchPostnrVejnavnGadeid.get(zip); + } public void buildSearchStructures() throws SQLException{ - searchPostnrVejnavnGadeid = new HashMap>(); + searchPostnrVejnavnGadeid = new HashMap>(); searchGadeidentAdresser = new HashMap>(); helperCache = new ConcurrentHashMap(); @@ -390,18 +412,10 @@ } - private String getbestLevenshteinDistance(String vasketVejnavn, Map postnrVeje) { - for(String vej : postnrVeje.keySet()) { - if ( StringUtils.getLevenshteinDistance(vasketVejnavn, vej) == 1) { - System.out.println("Levenstein: " + vasketVejnavn + "->" + vej); - return vej; - } - } - - return null; - } - private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) { + if (targetAddress.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel + return null; + } // /////////////////////////////////////////////////////////////////// switch( eb.transport) { @@ -518,6 +532,44 @@ aliasSet.add(vejnavn.replace("sct", "skt") ); + // fornavn forkortelser + aliasSet.add(vejnavn.replace("john", "j") ); + aliasSet.add(vejnavn.replace("thomas", "th") ); + aliasSet.add(vejnavn.replace("thorvald", "th") ); + + + // Romertal + aliasSet.add(vejnavn.replace("1", "i") ); + aliasSet.add(vejnavn.replace("i", "1") ); + + aliasSet.add(vejnavn.replace("2", "ii") ); + aliasSet.add(vejnavn.replace("ii", "2") ); + + aliasSet.add(vejnavn.replace("3", "iii") ); + aliasSet.add(vejnavn.replace("iii", "3") ); + + aliasSet.add(vejnavn.replace("4", "iv") ); + aliasSet.add(vejnavn.replace("iv", "4") ); + + aliasSet.add(vejnavn.replace("5", "v") ); + aliasSet.add(vejnavn.replace("v", "5") ); + + aliasSet.add(vejnavn.replace("6", "vi") ); + aliasSet.add(vejnavn.replace("vi", "6") ); + + aliasSet.add(vejnavn.replace("7", "vii") ); + aliasSet.add(vejnavn.replace("vii", "7") ); + + aliasSet.add(vejnavn.replace("8", "viii") ); + aliasSet.add(vejnavn.replace("viii", "8") ); + + aliasSet.add(vejnavn.replace("9", "ix") ); + aliasSet.add(vejnavn.replace("ix", "9") ); + + aliasSet.add(vejnavn.replace("10", "x") ); + aliasSet.add(vejnavn.replace("x", "10") ); + + //alternative måder at stave vej/gade/alle aliasSet.add(vejnavn.replace("vej", "ve") ); aliasSet.add(vejnavn.replace("vej", "vj") ); @@ -531,6 +583,10 @@ aliasSet.add(vejnavn.replace("allé", "allú") ); aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo + aliasSet.add(vejnavn.replace("gade", "gde") ); + + aliasSet.add(vejnavn.replace("plads", "pl") ); + aliasSet.add(vejnavn.replace("vænget", "vænge") ); // Opbyg æøå varianter over alle fundne aliaser @@ -550,7 +606,7 @@ //danske tegn 2 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") ); aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") ); - aliasSet.add( vVejnavn.replace("ø", "ae").replace("å", "aa") ); + aliasSet.add( vVejnavn.replace("ø", "oe").replace("å", "aa") ); aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") ); aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") ); aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") ); @@ -563,5 +619,31 @@ return aliasSet; } + public Set getPostnumre() { + return new TreeSet( searchPostnrVejnavnGadeid.keySet() ); + } + + public Set> getVejnavne(int postnr) { + Map map = searchPostnrVejnavnGadeid.get(postnr); + TreeMap newMap = new TreeMap(); + for (Entry entry : map.entrySet() ) { + newMap.put(entry.getKey(), entry.getValue()); + } + + return newMap.entrySet(); + } + + public Set getHusnumre(long gadeid) { + + Map gade = searchGadeidentAdresser.get(gadeid); + return new TreeSet( gade.keySet() ); + } + public Address getAdresse(long gadeid, String husnr) { + + Map gade = searchGadeidentAdresser.get(gadeid); + return gade.get(husnr); + + } + }