Source code for shapelib.core.cloud.writers.flatgeobuf_cloud_writer
"""Cloud writer for FlatGeobuf files with streaming optimizations."""
from __future__ import annotations
from typing import Any, Final
from shapelib.core.cloud.cloud_path import CloudPath
from shapelib.core.cloud.writers.base_cloud_writer import BaseCloudWriter
from shapelib.factories.cloud_registry import register_cloud_writer
[docs]
@register_cloud_writer
class FlatGeobufCloudWriter(BaseCloudWriter):
"""
Cloud writer for FlatGeobuf files with streaming optimizations.
Applies cloud-optimized settings for FlatGeobuf uploads:
- engine="pyogrio": Faster I/O engine
- index=False: Skip pandas index (not needed for geo data)
- use_arrow=True: Arrow serialization for faster writes
- SPATIAL_INDEX=YES: Enable HTTP range request streaming
- TEMPORARY_DIR: Use temp dir for sorting large datasets
Attributes
----------
EXTENSIONS : frozenset[str]
File extensions handled by this writer.
Examples
--------
>>> writer = FlatGeobufCloudWriter()
>>> if writer.supports(cloud_path):
... writer.write(gdf, cloud_path)
Big-O
-----
O(n) where n is data size, plus network upload time.
"""
EXTENSIONS: Final[frozenset[str]] = frozenset({".fgb", ".flatgeobuf"})
[docs]
def supports(self, cloud_path: CloudPath) -> bool:
"""
Check if this writer handles the given path.
Parameters
----------
cloud_path : CloudPath
The parsed destination path.
Returns
-------
bool
True if path is remote and extension is FlatGeobuf.
"""
if not cloud_path.is_remote:
return False
return cloud_path.extension.lower() in self.EXTENSIONS
def _build_write_kwargs(
self,
temp_dir: str,
driver: str | None,
schema: Any | None,
index: Any | None,
**kwargs: Any,
) -> dict[str, Any]:
"""
Build kwargs with FlatGeobuf cloud optimizations.
Applies optimized defaults that can be overridden by user kwargs.
"""
write_kwargs: dict[str, Any] = {
"driver": driver or "FlatGeobuf",
"schema": schema,
**kwargs,
}
# Apply optimized defaults (user can override via kwargs)
write_kwargs.setdefault("engine", "pyogrio")
write_kwargs.setdefault("index", False if index is None else index)
write_kwargs.setdefault("use_arrow", True)
# Merge layer_options with optimized defaults
layer_options = write_kwargs.get("layer_options", {})
layer_options.setdefault("SPATIAL_INDEX", "YES")
layer_options.setdefault("TEMPORARY_DIR", temp_dir)
write_kwargs["layer_options"] = layer_options
return write_kwargs