地图数据加载类,作为测试只处理点
public class Loader extends Thread {
private static int iHeadBlockSize; // 文件头大小
private static int iDataSize; // 地图图形数量
private static int iCX = 59500; // 地图中心点X 重庆市区
private static int iCY = 67900; // 地图中心点Y 重庆市区
InputStream inputstream = null;
DataInputStream datainputstream = null;
Loader() {
}
// 在独立线程中读取地图文件,文件包含在Jar包中
public void run() {
MapMIDlet.canvas.points = readData("/res/hotal.bin");
}
/**
* 读取数据
*
* @param f
* @return
*/
private int[][] readData(String f) {
try {
inputstream = readFile(f);
datainputstream = new DataInputStream(inputstream);
} catch (Exception exception) {
return null;
}
try {
// 读取文件头
byte[] bs1 = new byte[4];
int iReadLength = 0;
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
iHeadBlockSize = makeIntBigEndian(bs1, 0);
// System.out.println(iHeadBlockSize);
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
iDataSize = makeIntBigEndian(bs1, 0);
// System.out.println(iDataSize);
//文件头占用128字节,跳过未用部分
datainputstream.skip(iHeadBlockSize - iReadLength);
// 读取文件体
int[][] mps = new int[iDataSize][2];
byte[] bs2 = new byte[8];
for (int i = 0; i < iDataSize; i++) {
datainputstream.read(bs2, 0, 8);
// System.out.println(makeIntBigEndian(bs2, 0));
// System.out.println(makeIntBigEndian(bs2, 4));
mps[i][0] = makeIntBigEndian(bs2, 0) - iCX;
//手机屏幕坐标与地理坐标Y轴反向
mps[i][1] = iCY - makeIntBigEndian(bs2, 4) ;
}
datainputstream.close();
inputstream.close();
datainputstream = null;
inputstream = null;
return mps;
} catch (Exception exception) {
exception.printStackTrace();
return null;
}
}
/**
* 将二进制转换为整形
*
* @param b
* @param off
* @return
*/
protected static int makeIntBigEndian(byte[] b, int off) {
return (int) (((((int) b[off + 0]) << 24) & 0xff000000)
| ((((int) b[off + 1]) << 16) & 0x00ff0000)
| ((((int) b[off + 2]) << 8) & 0x0000ff00) | (((int) b[off + 3]) & 0x000000ff));
}
/**
* 读取文件
*
* @param s
* @return
*/
private InputStream readFile(String s) {
try {
InputStream inputstream = getClass().getResourceAsStream(s);
return inputstream;
} catch (Exception exception) {
return null;
}
}
}
public class Loader extends Thread {
private static int iHeadBlockSize; // 文件头大小
private static int iDataSize; // 地图图形数量
private static int iCX = 59500; // 地图中心点X 重庆市区
private static int iCY = 67900; // 地图中心点Y 重庆市区
InputStream inputstream = null;
DataInputStream datainputstream = null;
Loader() {
}
// 在独立线程中读取地图文件,文件包含在Jar包中
public void run() {
MapMIDlet.canvas.points = readData("/res/hotal.bin");
}
/**
* 读取数据
*
* @param f
* @return
*/
private int[][] readData(String f) {
try {
inputstream = readFile(f);
datainputstream = new DataInputStream(inputstream);
} catch (Exception exception) {
return null;
}
try {
// 读取文件头
byte[] bs1 = new byte[4];
int iReadLength = 0;
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
iHeadBlockSize = makeIntBigEndian(bs1, 0);
// System.out.println(iHeadBlockSize);
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(makeIntBigEndian(bs1, 0));
iReadLength += datainputstream.read(bs1, 0, 4);
// System.out.println(new String(bs1));
iReadLength += datainputstream.read(bs1, 0, 4);
iDataSize = makeIntBigEndian(bs1, 0);
// System.out.println(iDataSize);
//文件头占用128字节,跳过未用部分
datainputstream.skip(iHeadBlockSize - iReadLength);
// 读取文件体
int[][] mps = new int[iDataSize][2];
byte[] bs2 = new byte[8];
for (int i = 0; i < iDataSize; i++) {
datainputstream.read(bs2, 0, 8);
// System.out.println(makeIntBigEndian(bs2, 0));
// System.out.println(makeIntBigEndian(bs2, 4));
mps[i][0] = makeIntBigEndian(bs2, 0) - iCX;
//手机屏幕坐标与地理坐标Y轴反向
mps[i][1] = iCY - makeIntBigEndian(bs2, 4) ;
}
datainputstream.close();
inputstream.close();
datainputstream = null;
inputstream = null;
return mps;
} catch (Exception exception) {
exception.printStackTrace();
return null;
}
}
/**
* 将二进制转换为整形
*
* @param b
* @param off
* @return
*/
protected static int makeIntBigEndian(byte[] b, int off) {
return (int) (((((int) b[off + 0]) << 24) & 0xff000000)
| ((((int) b[off + 1]) << 16) & 0x00ff0000)
| ((((int) b[off + 2]) << 8) & 0x0000ff00) | (((int) b[off + 3]) & 0x000000ff));
}
/**
* 读取文件
*
* @param s
* @return
*/
private InputStream readFile(String s) {
try {
InputStream inputstream = getClass().getResourceAsStream(s);
return inputstream;
} catch (Exception exception) {
return null;
}
}
}