/[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 2753 - (show annotations) (download)
Thu Oct 15 15:34:27 2015 UTC (8 years, 7 months ago) by torben
File size: 4647 byte(s)
make usage of osrm configurable
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 = 100;
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
35 AtomicInteger antalFundne;
36
37 int workerID;
38 boolean verbose;
39
40 DistanceFunction dist = new SquareEuclideanDistanceFunction();
41
42 public LookupWorker(int workerID,
43 CyclicBarrier barrier,
44 Queue<Adresse> ikkeDaekkede,
45 Map<Short, KdTree<Adresse>> hoTrees,
46 AtomicInteger antalFundne,
47 Database db,
48 boolean verbose,
49 Constants consts) {
50
51 this.workerID = workerID;
52 this.barrier = barrier;
53 this.ikkeDaekkede = ikkeDaekkede;
54 this.hoTrees = hoTrees;
55 this.antalFundne = antalFundne;
56 this.db = db;
57 this.verbose = verbose;
58 this.consts = consts;
59
60 }
61
62
63 @Override
64 public void run() {
65 System.out.println( "Worker/" + workerID + " starting");
66
67 try {
68 while ( ! ikkeDaekkede.isEmpty() ) {
69
70 Adresse qAdresse = ikkeDaekkede.remove();
71
72 short ho = qAdresse.ho;
73 KdTree<Adresse> addressTree = hoTrees.get(ho);
74
75 MaxHeap<Adresse> res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist);
76 //Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
77 int size = res.size();
78 if (size > MAX_RESULTS ) {
79 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
80 System.exit(0);
81 }
82
83 ArrayList<Adresse> adrList = new ArrayList<Adresse>();
84
85 for (int i=0; i<size; i++) {
86 Adresse a = res.getMax();
87 adrList.add(a);
88 res.removeMax();
89 }
90 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
91 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
92
93
94 if ( LookupMain.use_osrm == true) {
95 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
96 if (bedsteAfstand <= consts.getMaxDistance()) {
97 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);
98 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteJni(qAdresse, res);
99 Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, adrList);
100 //Adresse bedsteAdr2 = osrmHelper.getNearestTableJni(qAdresse, res);
101
102 if (bedsteAdr2 != null) {
103 bedsteAdr = bedsteAdr2;
104 bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
105 } else {
106 logger.info("OSRM returned null for " + qAdresse);
107 }
108 }
109 }
110
111
112
113
114
115 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
116 if (verbose == true) {
117 logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
118 }
119
120 antalFundne.incrementAndGet();
121
122 try {
123 db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand);
124 } catch (SQLException e) {
125 logger.log(Level.WARNING, "Error saving result", e);
126 logger.warning("Shutting down");
127
128 System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
129 }
130 } else {
131 if (verbose == true) {
132 System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
133 }
134 }
135
136 }
137
138 } catch (Exception e) {
139 logger.log( Level.SEVERE, "Worker/" + workerID, e);
140 }
141
142
143
144 try {
145 logger.info( "Worker/" + workerID + " afventer barrier");
146 barrier.await();
147 } catch (BrokenBarrierException e) {
148 logger.log(Level.SEVERE, e.getMessage(), e);
149 System.exit(-1);
150 } catch(InterruptedException e) {
151 logger.log(Level.SEVERE, e.getMessage(), e);
152 }
153
154
155 System.out.println( "Worker/" + workerID + " stopping");
156 }
157
158 }

  ViewVC Help
Powered by ViewVC 1.1.20