protected <P extends Position> int calculateSize(Geometry<P> geom, boolean includeSrid) { int size = 1 + ByteBuffer.UINT_SIZE; //size for order byte + type field if (geom.getSRID() > 0 && includeSrid) { size += 4; } //empty geoms have same representation as an empty GeometryCollection if (geom.isEmpty()) return size + sizeEmptyGeometry(geom); if (geom instanceof GeometryCollection) { size += sizeOfGeometryCollection((GeometryCollection<P, ?>) geom); } else if (geom instanceof Polygon) { size += getPolygonSize((Polygon<P>) geom); } else if (geom instanceof Point) { size += getPointByteSize(geom); } else { size += ByteBuffer.UINT_SIZE; //to hold number of points size += getPointByteSize(geom) * geom.getNumPositions(); } return size; }