/** * Efficient cache or osmnodes * * @author ab */ package btools.mapaccess; import java.util.*; import java.io.*; public final class NodesCache { private String segmentDir; private OsmNodesMap nodesMap; private int lookupVersion; private boolean carMode; private String currentFileName; private HashMap fileCache; private HashMap indexCache; private byte[] iobuffer; private OsmFile[][] fileRows = new OsmFile[180][]; private ArrayList segmentList = new ArrayList(); public DistanceChecker distanceChecker; public boolean oom_carsubset_hint = false; public NodesCache( String segmentDir, OsmNodesMap nodesMap, int lookupVersion, boolean carMode, NodesCache oldCache ) { this.segmentDir = segmentDir; this.nodesMap = nodesMap; this.lookupVersion = lookupVersion; this.carMode = carMode; if ( oldCache != null ) { fileCache = oldCache.fileCache; indexCache = oldCache.indexCache; iobuffer = oldCache.iobuffer; oom_carsubset_hint = oldCache.oom_carsubset_hint; } else { fileCache = new HashMap(4); indexCache = new HashMap(4); iobuffer = new byte[65636]; } } public int loadSegmentFor( int ilon, int ilat ) { MicroCache mc = getSegmentFor( ilon, ilat ); return mc == null ? 0 : mc.getSize(); } public MicroCache getSegmentFor( int ilon, int ilat ) { try { int lonIdx80 = ilon/12500; int latIdx80 = ilat/12500; int lonDegree = lonIdx80/80; int latDegree = latIdx80/80; OsmFile osmf = null; OsmFile[] fileRow = fileRows[latDegree]; int ndegrees = fileRow == null ? 0 : fileRow.length; for( int i=0; i> 48); if ( readVersion != lookupVersion ) { throw new IllegalArgumentException( "lookup version mismatch (old rd5?) lookups.dat=" + lookupVersion + " " + f. getAbsolutePath() + "=" + readVersion ); } fileIndex[i] = lv & 0xffffffffffffL; } indexCache.put( filenameBase, fileIndex ); } } RandomAccessFile ra = fileCache.get( filenameBase ); long startPos = 0L; if ( ra != null ) { long[] index = indexCache.get( filenameBase ); startPos = tileIndex > 0 ? index[ tileIndex-1 ] : 200L; if ( startPos == index[ tileIndex] ) ra = null; } OsmFile osmf = new OsmFile( ra, startPos, iobuffer ); osmf.lonDegree = lonDegree; osmf.latDegree = latDegree; osmf.filename = currentFileName; return osmf; } public List getAllNodes() { List all = new ArrayList(); for( MicroCache segment : segmentList ) { List positions = segment.getPositions( nodesMap ); all.addAll( positions ); } return all; } public void close() { for( RandomAccessFile f: fileCache.values() ) { try { f.close(); } catch( IOException ioe ) { // ignore } } } }