/** * static helper class for handling datafiles * * @author ab */ package btools.router; import btools.mapaccess.OsmNode; public final class SearchBoundary { private int minlon0; private int minlat0; private int maxlon0; private int maxlat0; private int minlon; private int minlat; private int maxlon; private int maxlat; private int radius; private OsmNode p; int direction; public SearchBoundary( OsmNode n, int radius, int direction ) { this.radius = radius; this.direction = direction; p = new OsmNode( n.ilon, n.ilat ); int lon = (n.ilon / 5000000 ) * 5000000; int lat = (n.ilat / 5000000 ) * 5000000; minlon0 = lon - 5000000; minlat0 = lat - 5000000; maxlon0 = lon + 10000000; maxlat0 = lat + 10000000; minlon = lon - 1000000; minlat = lat - 1000000; maxlon = lon + 6000000; maxlat = lat + 6000000; } public static String getFileName( OsmNode n ) { int lon = (n.ilon / 5000000 ) * 5000000; int lat = (n.ilat / 5000000 ) * 5000000; int dlon = lon / 1000000 -180; int dlat = lat / 1000000 - 90; String slon = dlon < 0 ? "W" + (-dlon) : "E" + dlon; String slat = dlat < 0 ? "S" + (-dlat) : "N" + dlat; return slon + "_" + slat + ".trf"; } public boolean isInBoundary( OsmNode n, int cost ) { if ( radius > 0 ) { return n.calcDistance( p ) < radius; } if ( cost == 0 ) { return n.ilon > minlon0 && n.ilon < maxlon0 && n.ilat > minlat0 && n.ilat < maxlat0; } return n.ilon > minlon && n.ilon < maxlon && n.ilat > minlat && n.ilat < maxlat; } public int getBoundaryDistance( OsmNode n ) { switch( direction ) { case 0: return n.calcDistance( new OsmNode( n.ilon, minlat ) ); case 1: return n.calcDistance( new OsmNode( minlon, n.ilat ) ); case 2: return n.calcDistance( new OsmNode( n.ilon, maxlat ) ); case 3: return n.calcDistance( new OsmNode( maxlon, n.ilat ) ); default: throw new IllegalArgumentException( "undefined direction: "+ direction ); } } }