Source code for laser_measles.demographics.admin_shapefile
"""
Admin level shapefiles
"""
from pathlib import Path
import alive_progress
from rastertoolkit import shape_subdivide
from laser_measles.demographics import shapefiles
from laser_measles.demographics.base import BaseShapefile
[docs]
class AdminShapefile(BaseShapefile):
    """
    Shapefile of administrative units.
    Args:
        admin_level (int): Admin level of the shapefile.
        dotname_fields (list[str]): List of fields to use for dotname. e.g., ["ADMIN0", "ADMIN1", "ADMIN2"]
    """
    admin_level: int | None = None
    dotname_fields: list[str] | None = None  # List of fields to use for dotname. e.g., []
[docs]
    def get_shapefile_parent(self) -> Path:
        """Get the parent directory of the shapefile."""
        return self.shapefile.parent 
[docs]
    def add_dotname(self) -> None:
        """Add a DOTNAME to the shapefil (e.g., ADMIN0:ADMIN1:ADMIN2)"""
        shapefiles.add_dotname(self.shapefile, dot_name_fields=self.dotname_fields, inplace=True) 
[docs]
    def shape_subdivide(
        self,
        patch_size_km: int,
    ) -> None:
        """Subdivide the shapefile for a given administrative level into patches of approximately equal area.
        Args:
            patch_size_km (int): Size of the patch in square kilometers.
        """
        out_file = self.shapefile.parent / f"{self.shapefile.stem}_{patch_size_km}km.shp"
        if not out_file.exists():
            # Add dotname if it doesn't exist
            if not shapefiles.check_field(self.shapefile, "DOTNAME"):
                self.add_dotname()
            with alive_progress.alive_bar(
                title=f"Subdividing shapefile {self.shapefile.stem}",
            ) as _:
                shape_subdivide(
                    shape_stem=self.shapefile,
                    out_dir=self.get_shapefile_parent(),
                    out_suffix=f"{patch_size_km}km",
                    box_target_area_km2=patch_size_km,
                )
        self.shapefile = out_file
        return out_file