99 lines
2.6 KiB
Java
99 lines
2.6 KiB
Java
package btools.codec;
|
|
|
|
import btools.util.ByteDataWriter;
|
|
|
|
/**
|
|
* MicroCache1 is the old data format as of brouter 1.1 that does not allow to
|
|
* filter out unaccessable nodes at the beginning of the cache pipeline
|
|
*
|
|
* Kept for backward compatibility
|
|
*/
|
|
public final class MicroCache1 extends MicroCache
|
|
{
|
|
private int lonIdxBase;
|
|
private int latIdxBase;
|
|
|
|
public MicroCache1( int size, byte[] databuffer, int lonIdx80, int latIdx80 ) throws Exception
|
|
{
|
|
super( databuffer ); // sets ab=databuffer, aboffset=0
|
|
faid = new int[size];
|
|
fapos = new int[size];
|
|
this.size = 0;
|
|
lonIdxBase = ( lonIdx80 / 5 ) * 62500 + 31250;
|
|
latIdxBase = ( latIdx80 / 5 ) * 62500 + 31250;
|
|
}
|
|
|
|
public MicroCache1( byte[] databuffer, int lonIdx80, int latIdx80 ) throws Exception
|
|
{
|
|
super( databuffer ); // sets ab=databuffer, aboffset=0
|
|
lonIdxBase = ( lonIdx80 / 5 ) * 62500 + 31250;
|
|
latIdxBase = ( latIdx80 / 5 ) * 62500 + 31250;
|
|
|
|
size = readInt();
|
|
|
|
// get net size
|
|
int nbytes = 0;
|
|
for ( int i = 0; i < size; i++ )
|
|
{
|
|
aboffset += 4;
|
|
int bodySize = readVarLengthUnsigned();
|
|
aboffset += bodySize;
|
|
nbytes += bodySize;
|
|
}
|
|
|
|
// new array with only net data
|
|
byte[] nab = new byte[nbytes];
|
|
aboffset = 4;
|
|
int noffset = 0;
|
|
faid = new int[size];
|
|
fapos = new int[size];
|
|
|
|
for ( int i = 0; i < size; i++ )
|
|
{
|
|
faid[i] = readInt() ^ 0x8000; // flip lat-sign for correct ordering
|
|
|
|
int bodySize = readVarLengthUnsigned();
|
|
System.arraycopy( ab, aboffset, nab, noffset, bodySize );
|
|
aboffset += bodySize;
|
|
noffset += bodySize;
|
|
fapos[i] = noffset;
|
|
}
|
|
|
|
ab = nab;
|
|
aboffset = noffset;
|
|
init( size );
|
|
}
|
|
|
|
@Override
|
|
public long expandId( int id32 )
|
|
{
|
|
int lon32 = lonIdxBase + (short) ( id32 >> 16 );
|
|
int lat32 = latIdxBase + (short) ( ( id32 & 0xffff ) ^ 0x8000 );
|
|
return ( (long) lon32 ) << 32 | lat32;
|
|
}
|
|
|
|
@Override
|
|
public int shrinkId( long id64 )
|
|
{
|
|
int lon32 = (int) ( id64 >> 32 );
|
|
int lat32 = (int) ( id64 & 0xffffffff );
|
|
return ( lon32 - lonIdxBase ) << 16 | ( ( ( lat32 - latIdxBase ) & 0xffff ) ^ 0x8000 );
|
|
}
|
|
|
|
@Override
|
|
public int encodeMicroCache( byte[] buffer )
|
|
{
|
|
ByteDataWriter dos = new ByteDataWriter( buffer );
|
|
dos.writeInt( size );
|
|
for ( int n = 0; n < size; n++ )
|
|
{
|
|
dos.writeInt( faid[n] ^ 0x8000 );
|
|
int start = n > 0 ? fapos[n - 1] : 0;
|
|
int end = fapos[n];
|
|
int len = end - start;
|
|
dos.writeVarLengthUnsigned( len );
|
|
dos.write( ab, start, len );
|
|
}
|
|
return dos.size();
|
|
}
|
|
}
|