diff --git a/brouter-server/src/main/java/btools/server/Area.java b/brouter-server/src/main/java/btools/server/Area.java new file mode 100644 index 0000000..75075d8 --- /dev/null +++ b/brouter-server/src/main/java/btools/server/Area.java @@ -0,0 +1,76 @@ +package btools.server; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class Area +{ + private List poslist = new ArrayList(); + private List neglist = new ArrayList(); + + public static void main( String[] args ) throws IOException + { + Area a = new Area( new File( args[0] ) ); + + System.out.println( args[1] + " is in " + args[0] + "=" + a.isInArea( Long.parseLong( args[1] ) ) ); + } + + public Area( File f ) throws IOException + { + BufferedReader br = new BufferedReader( new FileReader( f ) ); + br.readLine(); + + for(;;) + { + String head = br.readLine(); + if ( head == null || "END".equals( head ) ) + { + break; + } + Polygon pol = new Polygon( br ); + if ( head.startsWith( "!" ) ) + { + neglist.add( pol ); + } + else + { + poslist.add( pol ); + } + } + } + + public boolean isInArea( long id ) + { + for( int i=0; i lines = new ArrayList(); + + for(;;) + { + String line = br.readLine(); + if ( line == null || "END".equals( line ) ) + { + break; + } + lines.add( line ); + } + int n = lines.size(); + ax = new int[n]; + ay = new int[n]; + for( int i=0; i maxx ) maxx = x; + if ( y > maxy ) maxy = y; + } + } + + public boolean isInPolygon( long id ) + { + int x = (int) ( id >> 32 ); + int y = (int) ( id & 0xffffffff ); + + if ( x < minx || x > maxx || y < miny || y > maxy ) + { + return false; + } + + int n = ax.length-1; // these are closed polygons + + boolean inside = false; + int j = n - 1; + for (int i = 0 ;i < n ; j = i++) + { + if ( (ay[i] > y) != (ay[j] > y) ) + { + long v = ax[j] - ax[i]; + v *= y - ay[i]; + v /= ay[j] - ay[i]; + if ( x <= v + ax[i]) + { + inside = !inside; + } + } + } + return inside; + } + + public boolean isInBoundingBox( long id ) + { + int x = (int) ( id >> 32 ); + int y = (int) ( id & 0xffffffff ); + + return x >= minx && x <= maxx && y >= miny && y <= maxy; + } + +} diff --git a/brouter-server/src/main/java/btools/server/SuspectManager.java b/brouter-server/src/main/java/btools/server/SuspectManager.java index c89fa37..1ca6cac 100644 --- a/brouter-server/src/main/java/btools/server/SuspectManager.java +++ b/brouter-server/src/main/java/btools/server/SuspectManager.java @@ -61,39 +61,46 @@ public class SuspectManager extends Thread tk.nextToken(); tk.nextToken(); long id = 0L; - String country = null; + String country = ""; String filter = null; - if ( tk.hasMoreTokens() ) + while ( tk.hasMoreTokens() ) { - String ctry = tk.nextToken(); - if ( new File( "suspects/suspects_" + ctry + ".txt" ).exists() ) + String c = tk.nextToken(); + if ( "all".equals( c ) || "new".equals( c ) ) { - country = ctry; - - if ( tk.hasMoreTokens() ) - { - filter = tk.nextToken(); - } + filter = c; + break; } + country += "/" + c; } - if ( country == null ) // generate country list + + if ( filter == null ) // generate country list { bw.write( "\n" ); - File[] files = new File( "suspects" ).listFiles(); + File countryParent = new File( "worldpolys" + country ); + File[] files = countryParent.listFiles(); TreeSet names = new TreeSet(); for ( File f : files ) { String name = f.getName(); - if ( name.startsWith( "suspects_" ) && name.endsWith( ".txt" ) ) + if ( name.endsWith( ".poly" ) ) { - names.add( name.substring( 9, name.length() - 4 ) ); + names.add( name.substring( 0, name.length() - 5 ) ); } } - for ( String ctry : names ) + for ( String c : names ) { - String url2 = "/brouter/suspects/" + ctry; - bw.write( "\n" ); + String url2 = "/brouter/suspects" + country + "/" + c; + String linkNew = ""; + String linkAll = ""; + + String linkSub = ""; + if ( new File( countryParent, c ).exists() ) + { + linkSub = ""; + } + bw.write( "" + linkNew + linkAll + linkSub + "\n" ); } bw.write( "
" + ctry + " new  all  new  all  sub-regions 
" + c + "
\n" ); bw.write( "\n" ); @@ -101,10 +108,21 @@ public class SuspectManager extends Thread return; } - File suspectFile = new File( "suspects/suspects_" + country + ".txt" ); + File polyFile = new File( "worldpolys" + country + ".poly" ); + if ( !polyFile.exists() ) + { + bw.write( "polygon file for country '" + country + "' not found\n" ); + bw.write( "\n" ); + bw.flush(); + return; + } + + Area polygon = new Area( polyFile ); + + File suspectFile = new File( "worldsuspects.txt" ); if ( !suspectFile.exists() ) { - bw.write( "suspect file for country '" + country + "' not found\n" ); + bw.write( "suspect file worldsuspects.txt not found\n" ); bw.write( "\n" ); bw.flush(); return; @@ -152,12 +170,16 @@ public class SuspectManager extends Thread { continue; } + if ( !polygon.isInArea( id ) ) + { + continue; // not in selected polygon + } String hint = "   confirmed " + formatAge( confirmedEntry ) + " ago"; int ilon = (int) ( id >> 32 ); int ilat = (int) ( id & 0xffffffff ); double dlon = ( ilon - 180000000 ) / 1000000.; double dlat = ( ilat - 90000000 ) / 1000000.; - String url2 = "/brouter/suspects/" + countryId; + String url2 = "/brouter/suspects" + countryId; bw.write( "" + dlon + "," + dlat + "" + hint + "
\n" ); } r.close(); @@ -270,11 +292,11 @@ public class SuspectManager extends Thread } else { - bw.write( "mark false positive (=not an issue)

\n" ); + bw.write( "mark false positive (=not an issue)

\n" ); File confirmedEntry = new File( "confirmednegatives/" + id ); if ( confirmedEntry.exists() ) { - String prefix = "mark as fixed

\n" ); bw.write( "hide for " ); @@ -285,15 +307,15 @@ public class SuspectManager extends Thread } else { - bw.write( "mark as a confirmed issue

\n" ); + bw.write( "mark as a confirmed issue

\n" ); } - bw.write( "

back to issue list

\n" ); + bw.write( "

back to issue list

\n" ); } } else { bw.write( filter + " suspect list for " + country + "\n" ); - bw.write( "
see watchlist\n" ); + bw.write( "
see watchlist\n" ); bw.write( "
back to country list

\n" ); int maxprio = 0; for ( int pass = 1; pass <= 2; pass++ ) @@ -327,9 +349,11 @@ public class SuspectManager extends Thread } id = Long.parseLong( idString ); - String countryId = country + "/" + filter + "/" + id; - String hint = ""; + if ( !polygon.isInBoundingBox( id ) ) + { + continue; // not in selected polygon (pre-check) + } if ( new File( "falsepositives/" + id ).exists() ) { continue; // known false positive @@ -342,12 +366,18 @@ public class SuspectManager extends Thread { continue; // known fixed } + if ( !polygon.isInArea( id ) ) + { + continue; // not in selected polygon + } if ( pass == 1 ) { maxprio = prio; continue; } + String countryId = country + "/" + filter + "/" + id; File confirmedEntry = new File( "confirmednegatives/" + id ); + String hint = ""; if ( confirmedEntry.exists() ) { hint = "   confirmed " + formatAge( confirmedEntry ) + " ago"; @@ -356,7 +386,7 @@ public class SuspectManager extends Thread int ilat = (int) ( id & 0xffffffff ); double dlon = ( ilon - 180000000 ) / 1000000.; double dlat = ( ilat - 90000000 ) / 1000000.; - String url2 = "/brouter/suspects/" + countryId; + String url2 = "/brouter/suspects" + countryId; bw.write( "" + dlon + "," + dlat + "" + hint + "
\n" ); } r.close();