public Geometry read(byte[] bytes) throws IOException {
return read(new ByteArrayInStream(bytes));
}
public Geometry read(InStream is) throws IOException {
ByteOrderDataInStream dis = new ByteOrderDataInStream(is);
dis.setOrder(ByteOrderValues.LITTLE_ENDIAN);
srid = dis.readInt();
version = dis.readByte();
serializationProps = dis.readByte();
hasZ = (serializationProps & 1) == 1;
hasM = (serializationProps & 2) == 2;
singlePoint = (serializationProps & 8) == 8;
singleLine = (serializationProps & 16) == 16;
numberOfPoints = 1;
if (singleLine) {
numberOfPoints = 2;
} else if (!singlePoint) {
numberOfPoints = dis.readInt();
}
//dimensionalFlag = DimensionalFlag.XY;
dimensionalFlag = DimensionalFlag.d2D;
if (hasM) {
if (hasZ) {
//dimensionalFlag = DimensionalFlag.XYZM;
dimensionalFlag = DimensionalFlag.d3DM;
} else {
//dimensionalFlag = DimensionalFlag.XYM;
dimensionalFlag = DimensionalFlag.d2DM;
}
} else if (hasZ) {
//dimensionalFlag = DimensionalFlag.XYZ;
dimensionalFlag = DimensionalFlag.d3D;
}
// points
points = readPoints(dis, numberOfPoints);
if (hasZ) {
zValues = readDoubles(dis, numberOfPoints);
}
if (hasM) {
mValues = readDoubles(dis, numberOfPoints);
}
crsId = CrsId.valueOf(srid);
if (singlePoint) {
return createPoint(0);
} else if (singleLine) {
PointSequence points = createPoints(0, 2);
return new LineString(points);
} else {
// figures
int numberOfFigures = dis.readInt();
figures = readFigures(dis, numberOfFigures);
// shapes
int numberOfShapes = dis.readInt();
shapes = readShapes(dis, numberOfShapes);
return decode(0);
}
}