今天编的,晒晒也无伤大雅
只能读Polyline ,因为我只用到Polyline。
package data;
import geometry.Point;
import geometry.Polyline;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import util.Convert;
public class PolylineShape {
@SuppressWarnings("unused")
private final int type = 3;
private String fileName;
private ArrayList<Polyline> list;
private double xMin;
private double yMin;
private double xMax;
private double yMax;
private byte[] read4(FileInputStream input) {
byte[] b = new byte[4];
for(int i = 0; i < 4; i++) {
try {
b[i] = (byte)input.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return b;
}
private int read4Big(FileInputStream input) {
return Convert.bytesToIntBig(read4(input));
}
private int read4Little(FileInputStream input) {
return Convert.bytesToIntLittle(read4(input));
}
private double read8(FileInputStream input) {
byte[] b = new byte[8];
for(int i = 0; i < 8; i++) {
try {
b[i] = (byte)input.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return Convert.bytesToDouble(b);
}
private void read() throws Exception
{
File file = new File(fileName);
FileInputStream input = new FileInputStream(file);
int index = 0;
while(input.available() > 0) {
input.read();
index++;
if(index == 36)
break;
}
xMin = this.read8(input);
yMin = this.read8(input);
xMax = this.read8(input);
yMax = this.read8(input);
index += 32;
while(input.available() > 0) {
input.read();
index++;
if(index == 100)
break;
}
list.add(readPolyline(input));
list.add(readPolyline(input));
}
private Polyline readPolyline(FileInputStream input) {
int id = this.read4Big(input);
read4Big(input);//记录长度
read4Little(input);//几何类型
double[] box = new double[4];
box[0] = read8(input);
box[1] = read8(input);
box[2] = read8(input);
box[3] = read8(input);
int numParts = read4Little(input);
int numPoints = read4Little(input);
int[] parts = new int[numParts];
for(int i = 0; i < numParts; i++)
parts[i] = read4Little(input);
Point[] points = new Point[numPoints];
for(int i = 0; i < numPoints; i++) {
points[i] = new Point();
points[i].setX(read8(input));
points[i].setY(read8(input));
}
Polyline line = new Polyline(id, box, parts, points);
return line;
// TODO Auto-generated method stub
}
PolylineShape(String fileName) throws Exception {
this.fileName = fileName;
list = new ArrayList<Polyline>();
read();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new PolylineShape("shi.shp");
}
}