Source code for sec_interp.core.utils.geometry_utils.processing

from __future__ import annotations

"""Geometry processing utilities."""

from typing import Any

from qgis.core import (
    QgsCoordinateReferenceSystem,
    QgsField,
    QgsGeometry,
    QgsVectorLayer,
)

from sec_interp.logger_config import get_logger

logger = get_logger(__name__)


[docs] def create_buffer_geometry( geometry: QgsGeometry, crs: QgsCoordinateReferenceSystem, distance: float, segments: int = 5, ) -> QgsGeometry: """Create a buffer around a geometry. Args: geometry: Input geometry. crs: Coordinate Reference System of the geometry. distance: Buffer distance in layer units. segments: Number of segments for the buffer approximation. Returns: The buffered geometry. """ if not geometry or geometry.isNull(): raise ValueError("Geometry is null or invalid") return geometry.buffer(distance, segments)
[docs] def create_memory_layer( layer_name: str, layer_type: str, crs: QgsCoordinateReferenceSystem, fields: list[QgsField], ) -> QgsVectorLayer: """Create a temporary memory (scratch) layer. Args: layer_name: Name for the layer. layer_type: QGIS geometry type string (e.g., 'Point', 'LineString'). crs: Coordinate reference system. fields: List of fields for the layer. Returns: The created memory layer. """ uri = f"{layer_type}?crs={crs.authid()}" layer = QgsVectorLayer(uri, layer_name, "memory") if not layer.isValid(): logger.error(f"Failed to create memory layer: {layer_name}") return None pr = layer.dataProvider() pr.addAttributes(fields) layer.updateFields() return layer
[docs] def densify_line_by_interval(geometry: QgsGeometry, interval: float) -> QgsGeometry: """Densify a line geometry by a specific distance interval. Args: geometry: Line geometry to densify. interval: Maximum distance between vertices. Returns: The densified geometry. """ if not geometry or geometry.isNull(): return QgsGeometry() return geometry.densifyByDistance(interval)
[docs] def run_geometry_operation(operation: str, *args, **kwargs) -> Any: """Wrap generic geometry operations. Args: operation: Name of the operation to perform. *args: Positional arguments for the operation. **kwargs: Keyword arguments for the operation. Returns: Result of the operation. """ # This is a placeholder for more complex logic if needed # For now it just logs and performs the op if possible logger.debug(f"Running geometry operation: {operation}") return None