private <P extends Position> Geometry<P> decodeGeometry(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { alignByteOrder(byteBuffer); int typeCode = readTypeCode(byteBuffer); WkbGeometryType wkbType = WkbGeometryType.parse((byte) typeCode); crs = (CoordinateReferenceSystem<P>)readCrs(byteBuffer, typeCode, crs); switch (wkbType) { case POINT: return decodePoint(byteBuffer, crs); case LINE_STRING: return decodeLineString(byteBuffer, crs); case POLYGON: return decodePolygon(byteBuffer, crs); case GEOMETRY_COLLECTION: return decodeGeometryCollection(byteBuffer, crs); case MULTI_POINT: return decodeMultiPoint(byteBuffer, crs); case MULTI_POLYGON: return decodeMultiPolygon(byteBuffer, crs); case MULTI_LINE_STRING: return decodeMultiLineString(byteBuffer,crs ); } throw new WkbDecodeException(String.format("WKBType %s is not supported.", wkbType)); }
@Override public Geometry<?> decode(ByteBuffer byteBuffer) { return decode(byteBuffer, (CoordinateReferenceSystem<?>) null); }
@Override public <P extends Position> Geometry<P> decode(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { byteBuffer.rewind(); try { prepare(byteBuffer); Geometry<P> geom = decodeGeometry(byteBuffer, crs); byteBuffer.rewind(); return geom; } catch (BufferAccessException e) { throw new WkbDecodeException(e); } }
private <P extends Position> MultiLineString<P> decodeMultiLineString(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { int numGeometries = byteBuffer.getInt(); if (numGeometries == 0) { return new MultiLineString<P>(crs); } List<LineString<P>> geometries = new ArrayList<LineString<P>>(numGeometries); for (int i = 0; i < numGeometries; i++) { geometries.add((LineString<P>)decodeGeometry(byteBuffer, crs)); } return mkMultiLineString(geometries); }
private <P extends Position> MultiPolygon<P> decodeMultiPolygon(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { int numGeometries = byteBuffer.getInt(); if (numGeometries == 0) { return new MultiPolygon<P>(crs); } List<Polygon<P>> geometries = new ArrayList<Polygon<P>>(numGeometries); for (int i = 0; i < numGeometries; i++) { geometries.add((Polygon<P>) decodeGeometry(byteBuffer, crs)); } return mkMultiPolygon(geometries); }
private <P extends Position> GeometryCollection<P, Geometry<P>> decodeGeometryCollection(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { int numGeometries = byteBuffer.getInt(); if (numGeometries == 0) { return new GeometryCollection<P, Geometry<P>>(crs); } List<Geometry<P>> geometries = new ArrayList<Geometry<P>>(numGeometries); for (int i = 0; i < numGeometries; i++) { geometries.add(decodeGeometry(byteBuffer, crs)); } return mkGeometryCollection(geometries); }
private <P extends Position> MultiPoint<P> decodeMultiPoint(ByteBuffer byteBuffer, CoordinateReferenceSystem<P> crs) { int numGeometries = byteBuffer.getInt(); if (numGeometries == 0) { return new MultiPoint<P>(crs); } List<Point<P>> geometries = new ArrayList<Point<P>>(numGeometries); for (int i = 0; i < numGeometries; i++) { geometries.add((Point<P>) decodeGeometry(byteBuffer, crs)); } return mkMultiPoint(geometries); }