docs: @Override
    protected void bulkLoad(List<E> spatialObjects) {
      if(!initialized) {
        initialize(spatialObjects.get(0));
      }
  
      StringBuilder msg = getLogger().isDebuggingFine() ? new StringBuilder() : null;
  
      // Tiny tree that fits into a single page
      if(spatialObjects.size() <= leafCapacity) {
        N root = createNewLeafNode();
        root.setPageID(getRootID());
        writeNode(root);
        createRoot(root, spatialObjects);
        setHeight(1);
        if(msg != null) {
          msg.append("\n  numNodes = 1");
        }
      }
      // root is directory node
      else {
        N root = createNewDirectoryNode();
        root.setPageID(getRootID());
        writeNode(root);
  
        // create leaf nodes
        List<E> nodes = createBulkLeafNodes(spatialObjects);
  
        int numNodes = nodes.size();
        if(msg != null) {
          msg.append("\n  numLeafNodes = ").append(numNodes);
        }
        setHeight(1);
  
        // create directory nodes
        while(nodes.size() > (dirCapacity - 1)) {
          nodes = createBulkDirectoryNodes(nodes);
          numNodes += nodes.size();
          setHeight(getHeight() + 1);
        }
  
        // create root
        createRoot(root, nodes);
        numNodes++;
        setHeight(getHeight() + 1);
        if(msg != null) {
          msg.append("\n  numNodes = ").append(numNodes);
        }
      }
      if(msg != null) {
        msg.append("\n  height = ").append(getHeight());
        msg.append("\n  root ").append(getRoot());
        getLogger().debugFine(msg.toString());
      }
    }