--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/06/14 15:15:00 2589 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/09/27 18:20:41 2708 @@ -1,18 +1,23 @@ package dk.daoas.fulddaekning; -import geocode.GeoPoint; -import geocode.kdtree.KDTree; - import java.io.File; import java.io.FileReader; import java.sql.SQLException; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; +import com.jwetherell.algorithms.data_structures.KdTree; + +import dk.daoas.fulddaekning.osrm.OSRMHelper; + public class LookupMain { static class LookupResult { @@ -35,7 +40,9 @@ - private static List alleDaekkedeAdresser; + static final int MAX_RESULTS = 100; + + static OSRMHelper osrmHelper = new OSRMHelper(); @@ -76,14 +83,15 @@ Database db = new Database(conf); Adresse ikkeDaekkede[] = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); - + logger.info("Antal ikke-daekkede: " + ikkeDaekkede.length); boolean testRun= false; int antalFundne = 0; - + long beregnStart =0; long start = System.currentTimeMillis(); + int antalDaekkedeAdresser = -1; if (testRun == false) { @@ -99,13 +107,29 @@ logger.info("Henter alle daekkede adresser"); - alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size()); + antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser ); + + Map> addrHoList = db.getDaekkedeAdresserHO(); + + Map> hoTrees = new HashMap>(); - KDTree addressTree = new KDTree(alleDaekkedeAdresser); + for ( Map.Entry> entry : addrHoList.entrySet() ) { + short ho = entry.getKey(); + List geopoints = entry.getValue(); + + logger.info("Opbygger KDTree for " + ho + " - antal=" + geopoints.size() ); + + @SuppressWarnings("unchecked") + List tmpPoints = (List)(List) geopoints; + + KdTree addressTree = new KdTree( tmpPoints ); + hoTrees.put(ho, addressTree); + } db.resetResultTable(); + beregnStart = System.currentTimeMillis(); logger.info("Starter beregning"); final int workerId = -1; @@ -113,13 +137,23 @@ for (Adresse qAdresse : ikkeDaekkede) { + short ho = qAdresse.ho; + KdTree addressTree = hoTrees.get(ho); LookupResult result = new LookupResult(); - result.bedsteAdr = (Adresse) addressTree.findNearest(qAdresse); + Collection res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse); + if (res.size() > MAX_RESULTS ) { + System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); + System.exit(0); + } + + + result.bedsteAdr = osrmHelper.getNearestViaTable(qAdresse, res); + System.out.println("Bedste:" + result.bedsteAdr ); + result.bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, result.bedsteAdr); - if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren if (verbose == true) { logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand ); @@ -170,13 +204,17 @@ long now = System.currentTimeMillis(); long elapsed = now - start ; + long elapsedBeregn = now - beregnStart; logger.info("Fuld load done : " + formatMilliSeconds(elapsed) ); - logger.info("Antal daekkede : " + alleDaekkedeAdresser.size() ); + logger.info("Fuld load done (beregning) : " + formatMilliSeconds(elapsedBeregn) ); + logger.info("Antal daekkede : " + antalDaekkedeAdresser ); logger.info("Antal ikke-daekkede : " + ikkeDaekkede.length ); logger.info("Heraf, antal fundne : " + antalFundne ); - logger.info("Fandt adresser til : " + (antalFundne*100.0)/ikkeDaekkede.length + "%" ); + + logger.info( String.format("Fandt adresser til : %.2f %%", (antalFundne*100.0)/ikkeDaekkede.length ) ); + //logger.info("Fandt adresser til : " + (antalFundne*100.0)/ikkeDaekkede.length + "%" ); }