--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/06/14 16:42:08 2591 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/09/27 13:21:45 2707 @@ -1,18 +1,20 @@ 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.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; +import com.jwetherell.algorithms.data_structures.KdTree; + public class LookupMain { static class LookupResult { @@ -35,7 +37,7 @@ - private static List alleDaekkedeAdresser; + @@ -82,8 +84,9 @@ int antalFundne = 0; - + long beregnStart =0; long start = System.currentTimeMillis(); + int antalDaekkedeAdresser = -1; if (testRun == false) { @@ -99,13 +102,29 @@ logger.info("Henter alle daekkede adresser"); - alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size()); + antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser ); - KDTree addressTree = new KDTree(alleDaekkedeAdresser); + Map> addrHoList = db.getDaekkedeAdresserHO(); + + Map> hoTrees = new HashMap>(); + + 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,9 +132,18 @@ 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(1, qAdresse); + if (res.size() > 1 ) { + System.out.println("Returnerede mere end 1>" + res.size() ); + System.exit(0); + } + result.bedsteAdr = res.iterator().next(); + + //result.bedsteAdr = (Adresse) addressTree.findNearest(qAdresse); result.bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, result.bedsteAdr); @@ -170,13 +198,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 + "%" ); }