public BlockReader get() {
    if (outOfBounds) {
      return Collections::emptyIterator;
    }
    long fileHash = Hashing.fnv1a64(path.toString().getBytes(StandardCharsets.UTF_8));
    var schema = metadata.getFileMetaData().getSchema();
    var columnIOFactory = new ColumnIOFactory(metadata.getFileMetaData().getCreatedBy(), false);
    return () -> IntStream.range(0, metadata.getBlocks().size()).mapToObj(blockIndex -> {
      long blockHash = Hashing.fnv1a64(fileHash, ByteBuffer.allocate(4).putInt(blockIndex).array());
      // happens in reader thread
      return (Block) new Block() {
        @Override
        public Path getFileName() {
          return path;
        }

        @Override
        public String layer() {
          return layer;
        }

        @Override
        public Iterator<ParquetFeature> iterator() {
          PageReadStore group;
          try (var reader = open()) {
            group = reader.readFilteredRowGroup(blockIndex);
            if (group == null) {
              return Collections.emptyIterator();
            }
          } catch (IOException e) {
            throw new UncheckedIOException(e);
          }
          MessageColumnIO columnIO = columnIOFactory.getColumnIO(schema);
          var recordReader = columnIO.getRecordReader(group, new ParquetRecordConverter(schema, geoparquet), filter);
          long total = group.getRowCount();
          return Iterators.filter(new Iterator<>() {
            long i = 0;

            @Override
            public boolean hasNext() {
              return i < total;
            }

            @Override
            public ParquetFeature next() {
              if (!hasNext()) {
                throw new NoSuchElementException();
              }
              i++;

              var item = recordReader.read();

              if (item == null) {
                return null;
              }

              if (extraFields != null) {
                item.putAll(extraFields);
              }

              var feature = new ParquetFeature(
                source,
                layer,
                idGenerator != null ? idGenerator.applyAsLong(item) :
                  Hashing.fnv1a64(blockHash, ByteBuffer.allocate(8).putLong(i).array()),
                geometryReader,
                item,
                path,
                schema
              );

              if (postFilterBounds != null) {
                try {
                  if (!feature.latLonGeometry().getEnvelopeInternal().intersects(postFilterBounds)) {
                    return null;
                  }
                } catch (GeometryException e) {
                  LOGGER.warn("Error reading geometry to post-filter bounds", e);
                  return null;
                }
              }

              return feature;
            }
          }, Objects::nonNull);
        }
      };
    }).iterator();
  }
Reads {@link SourceFeature SourceFeatures} from a single
<a href="https://github.com/opengeospatial/geoparquet/blob/main/format-specs/geoparquet.md">geoparquet</a> file.
planetiler-core/src/main/java/com/onthegomap/planetiler/reader/parquet/ParquetInputFile.java