/[projects]/dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java
ViewVC logotype

Contents of /dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2797 - (show annotations) (download)
Tue Dec 29 13:11:20 2015 UTC (8 years, 4 months ago) by torben
File size: 4614 byte(s)
add progressbar
1 package dk.daoas.fulddaekning;
2
3 import java.sql.SQLException;
4 import java.util.ArrayList;
5 import java.util.Map;
6 import java.util.Queue;
7 import java.util.concurrent.BrokenBarrierException;
8 import java.util.concurrent.CyclicBarrier;
9 import java.util.concurrent.atomic.AtomicInteger;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 import ags.utils.dataStructures.MaxHeap;
14 import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
15 import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
16 import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
17 import dk.daoas.fulddaekning.osrm.OSRMHelper;
18
19 public class LookupWorker implements Runnable {
20
21 static final int MAX_RESULTS = 99;
22
23
24
25 final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
26
27 OSRMHelper osrmHelper = new OSRMHelper();
28
29 CyclicBarrier barrier;
30 Queue<Adresse> ikkeDaekkede;
31 Map<Short, KdTree<Adresse>> hoTrees;
32 Database db;
33 Constants consts;
34 ProgressBar progressBar;
35
36 AtomicInteger antalFundne;
37
38 int workerID;
39 boolean verbose;
40
41 DistanceFunction dist = new SquareEuclideanDistanceFunction();
42
43 public LookupWorker(int workerID,
44 CyclicBarrier barrier,
45 Queue<Adresse> ikkeDaekkede,
46 Map<Short, KdTree<Adresse>> hoTrees,
47 AtomicInteger antalFundne,
48 Database db,
49 boolean verbose,
50 Constants consts,
51 ProgressBar progressBar) {
52
53 this.workerID = workerID;
54 this.barrier = barrier;
55 this.ikkeDaekkede = ikkeDaekkede;
56 this.hoTrees = hoTrees;
57 this.antalFundne = antalFundne;
58 this.db = db;
59 this.verbose = verbose;
60 this.consts = consts;
61 this.progressBar = progressBar;
62
63 }
64
65
66 @Override
67 public void run() {
68 System.out.println( "Worker/" + workerID + " starting");
69
70 try {
71 while ( ! ikkeDaekkede.isEmpty() ) {
72
73 Adresse qAdresse = ikkeDaekkede.remove();
74
75 short ho = qAdresse.ho;
76 KdTree<Adresse> addressTree = hoTrees.get(ho);
77
78 MaxHeap<Adresse> res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist);
79 //Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
80 int size = res.size();
81 if (size > MAX_RESULTS ) {
82 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
83 System.exit(0);
84 }
85
86 ArrayList<Adresse> adrList = new ArrayList<Adresse>();
87
88 for (int i=0; i<size; i++) {
89 Adresse a = res.getMax();
90 adrList.add(a);
91 res.removeMax();
92 }
93 Adresse bedsteAdr = adrList.get(size-1); //da det er en max-heap er det elementet med størst distance der er først og dermed den sidste der er tættest
94 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
95
96
97 if ( LookupMain.use_osrm == true) {
98 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
99 if (bedsteAfstand <= consts.getMaxDistance()) {
100 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);
101 Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, adrList);
102
103 if (bedsteAdr2 != null) {
104 bedsteAdr = bedsteAdr2;
105 bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
106 } else {
107 logger.info("OSRM returned null for " + qAdresse);
108 }
109 }
110 }
111
112
113
114
115
116 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
117 if (verbose == true) {
118 logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
119 }
120
121 antalFundne.incrementAndGet();
122
123 try {
124 db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand);
125 } catch (SQLException e) {
126 logger.log(Level.WARNING, "Error saving result", e);
127 logger.warning("Shutting down");
128
129 System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
130 }
131 } else {
132 if (verbose == true) {
133 System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
134 }
135 }
136
137 progressBar.tick();
138
139 }
140
141 } catch (Exception e) {
142 logger.log( Level.SEVERE, "Worker/" + workerID, e);
143 }
144
145
146
147 try {
148 logger.info( "Worker/" + workerID + " afventer barrier");
149 barrier.await();
150 } catch (BrokenBarrierException e) {
151 logger.log(Level.SEVERE, e.getMessage(), e);
152 System.exit(-1);
153 } catch(InterruptedException e) {
154 logger.log(Level.SEVERE, e.getMessage(), e);
155 }
156
157
158 System.out.println( "Worker/" + workerID + " stopping");
159 }
160
161 }

  ViewVC Help
Powered by ViewVC 1.1.20