Skip to content
Snippets Groups Projects
geotiff_format.py 1.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jesper Zedlitz's avatar
    Jesper Zedlitz committed
    from osgeo import gdal
    import zipfile
    import tempfile
    import os
    
    
    def is_geotiff(resource, file_name):
        dataset = gdal.Open(file_name)
    
    
        if not dataset:
            resource["error"] = f"could not read file {file_name}"
            return False
    
    
    Jesper Zedlitz's avatar
    Jesper Zedlitz committed
        geotransform = dataset.GetGeoTransform()
        default_transform = (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)
    
        if geotransform == default_transform:
            resource["error"] = "missing transformation"
            return False
    
        return True
    
    
    def is_valid(resource, file):
        """Check if the content is a GeoTIFF file."""
    
        # Some GeoTIFF files consist for two files in a ZIP file:
        #  - the TIFF image itself
        #  - a TFW world file with the transform information
        if zipfile.is_zipfile(file.name):
            with tempfile.TemporaryDirectory() as temp_dir:
                with zipfile.ZipFile(file.name, "r") as zip_ref:
                    file_list = zip_ref.namelist()
                    relevant_files = [
                        file
                        for file in file_list
                        if file.lower().endswith(".tiff") or file.lower().endswith(".tif")
                    ]
                    contains_at_least_one_relevant_file = len(relevant_files) > 0
                    if contains_at_least_one_relevant_file:
                        zip_ref.extractall(temp_dir)
                        for tif_name in relevant_files:
                            tif_path = os.path.join(temp_dir, tif_name)
                            if is_geotiff(resource, tif_path):
                                # the ZIP file contains at least one valid GeoTIFF
                                return True
                    else:
                        resource["error"] = "ZIP file contains not TIFF image"
                        return False
        else:
            return is_geotiff(resource, file.name)