
    8hQ                         d dl Zd dlZd dlZd dlmZ d Z G d de          Zd Z	d Z
dd
Zej        fdZedk    r  ej         eej                             dS dS )    N)gdalc                      t          d           t          d           t          d           t          d           t          d           dS )NzSUsage: validate_cloud_optimized_geotiff.py [-q] [--full-check=yes/no/auto] test.tif zOptions:z-q: quiet modezr--full-check=yes/no/auto: check tile/strip leader/trailer bytes. auto=yes for local files, and no for remote files   )print     C/home/jovyan/Desktop/enandes_v2/validate_cloud_optimized_geotiff.pyUsager      s]    	]   
"III	*	
	|   1r	   c                       e Zd ZdS )&ValidateCloudOptimizedGeoTIFFExceptionN)__name__
__module____qualname__r   r	   r
   r   r   #   s        Dr	   r   c
           
      n   |                                 }
d }|r9|                                }|                                 }|
|k    r||dz   gz  }d }|j        |
d         z   dz
  |
d         z  }|j        |
d         z   dz
  |
d         z  }t	          |          D ]}t	          |          D ]}|                    d||fz  d          }|t          |          nd}|                    d||fz  d          }|t          |          nd}|dk    r|r||	k     r||d||fz  z   gz  }|r^t          j        | |dz
  d           t          j
        d	t          j        dd|                     d         }||k    r||d
||||fz  z   gz  }|r\|dk    rVt          j        | ||z   dz
  d           t          j        dd|           }|dd         |dd         k    r||d||fz  z   gz  }|r|dk    s5|dk    r|                                |                                j        k    r|                    d||fz  d          }|t          |          nd}|dk    r3|dk    r-||z   |rdndz   |rdndz   }||k    r|d|z   d||||fz  z   gz  }n'|dk    r!|dk    r|r||	k     r|d|z   d||fz  z   gz  }|}|}	|	S )Nz4: mask block size is different from its imagery band   r   BLOCK_OFFSET_%d_%dTIFFzBLOCK_SIZE_%d_%d9: offset of block (%d, %d) is smaller than previous block   z<Iz>: for block (%d, %d), size in leader bytes is %d instead of %d   z/: for block (%d, %d), trailer bytes are invalidPIXELTILEzMask of z;: for block (%d, %d), offset is %d, whereas %d was expected)GetBlockSizeGetMaskBandYSizeXSizerangeGetMetadataItemintr   	VSIFSeekLstructunpack	VSIFReadLGetBand
GetDatasetRasterCount)f
interleave	band_namebanderrorsblock_order_row_majorblock_leader_size_as_uint4#block_trailer_last_4_bytes_repeatedmask_interleaved_with_imagerylast_offset
block_size	mask_bandmask_block_sizeyblocksxblocksyxoffset	bytecountleader_size
last_bytesoffset_maskexpected_offset_masks                          r
   full_check_bandr?   '   s    ""$$JI$ $$&&	#0022((RR F IzJqM)A-*Q-?GzJqM)A-*Q-?G7^^ J! J!w I	! I	!A))*>!Q*GPPF$*$6S[[[AF,,-?1a&-H&QQI*3*?IQIzz( Vk-A-A!Ua&!! F . N1fqj!444"(-dnQ16M6M"N"Nq"QK"i//%^ ![)<==#  7 	 A~~q&9*<q*@!DDD%)^Aq!%<%<
%ac?j1o==" )"S#$a&#)!)' F  #)g%%&(($//*;*;*GGG (77(Aq616  3>2Ic+...qA::+// #$ :A11C !DJ11L ) #&:::&'([ ![2FGHH#  q[[[1__, {1J1J&'(Y !f%%#  )F KKSI	!V r	   c                    |                      d                                          }| j        |d         z   dz
  |d         z  }| j        |d         z   dz
  |d         z  }d}t	          |          D ]}t	          |          D ]{}	t	          | j                  D ]d}
|                      |
dz                                 d|	|fz  d          }|t          |          nd}|dk    r|r||k     r||d|	|fz  z   gz  }|}e|d S )Nr   r   r   r   r   )GetRasterBandr   RasterYSizeRasterXSizer   r'   r   r    )dsds_namer-   r,   r2   r5   r6   r1   r7   r8   band_idxr9   s               r
   check_tile_interleaverG      sM   !!!$$1133J~
1-1jmCG~
1-1jmCGK7^^ ) )w 	) 	)A!".11 ) )))(Q,77GG(Aq616  )/(:VA::, +1E1E#Y !f%%#  #)K)	)) )r	   TFc                    t          t          j        d                    dk     rt          d          t	          d                    d                              d                    }t          | t          |f          rt          j	                     t          j
        |           } t          j                     | #t          dt          j                    z            |                                 j        dvrt          d	          i }g }g }|                                 }|                     d
          }|                                }	|                                 }
|
|dz   |
v r|dgz  }|j        dk    s|j        dk    rE|r7|                                }|d         |j        k    r|d         dk    r|dgz  }|	dk    r|dgz  }t          |                    dd                    }|g}d}d}d}d}|dvrt          j        |d          }|st          d          t1          j        dt          j        dd
|                    }|dv }|rd}nd}t          j        ||d           ddz  }t          j        t9          |          d
|                              d          }t9          |          t9          |          k    r|                    d          rt          |t9          d          d         dd                    }t          j        |d
|                              d          }d!|v }d"|v }d#|v }d$|v }d%|v r|d&gz  }|t9          |          |z   z  }||d'z  z  }t          j        |           ||d         k    r|d(||d         fz  gz  }i |d)<   ||d)         d*<   t?          |	          D ]}|                     d
                               |          }|dk    r'|j        |j        k    s|j        |j        k    r|d+gz  }nY|                     d
                               |d
z
            }|j        |j        k    s|j        |j        k    r|d,||d
z
  fz  gz  }|r:|                                }|d         |j        k    r|d         dk    r	|d-|z  gz  }t          |                    dd                    }|!                    |           ||d)         d.|z  <   |d/         |d0         k     r<|dk    r|d1||d/         |d0         fz  gz  }e|d2||d/         |d
z
  |d0         fz  gz  }d3 } ||          }|g}i |d4<   ||d4         d*<   t?          |	          D ]X}|                     d
                               |          } ||          }|!                    |           ||d4         d.|z  <   Y|d/         dk    r%|d/         |d/         k     r|	dk    r|d5gz  }n|d6gz  }t?          t9          |          d'z
  dd/          D ]1}||         dk    r#||         ||d
z            k     r|d7|d
z
  |fz  gz  }2t9          |          d'k    r*|d         dk    r|d         |d
         k     r|d8|	d
z
  z  gz  }|                     d9d:          } |r|s|s|s|rt          j        |d          }|st          d          | d;k    rtE          || d<||||||d
  
         nUd}!t?          | j#                  D ]>}"| d=k    rd}!tE          || d>|"d
z   z  |                     |"d
z             ||||||!
  
        }!?| d?k    rtI          | d<||           |%                                t          j&        k    rC|d@z   |                                 vr*tE          || dA|'                                ||||dd
  
         t?          |	          D ]_}|                     d
                               |          }| d;k    rtE          || dB|z  ||||||d
  
         njd}!t?          | j#                  D ]S}"| d=k    rd}!tE          || dC|"d
z   |fz  |                     |"d
z                                  |          ||||||!
  
        }!T| d?k    r:tI          |                     d
          (                                dB|z  ||           |%                                t          j&        k    rF|d@z   |                                 vr-tE          || dD|z  |'                                ||||dd
  
         at          j        |           |||fS )Eae  Check if a file is a (Geo)TIFF with cloud optimized compatible structure.

    Args:
      ds: GDAL Dataset for the file to inspect.
      check_tiled: Set to False to ignore missing tiling.
      full_check: Set to TRUe to check tile/strip leader/trailer bytes. Might be slow on remote files

    Returns:
      A tuple, whose first element is an array of error messages
      (empty if there is no error), and the second element, a dictionary
      with the structure of the GeoTIFF file.

    Raises:
      ValidateCloudOptimizedGeoTIFFException: Unable to open the file or the
        file is not a Tiff.
    VERSION_NUMi zGDAL 2.2 or above requiredr   zutf-8NzInvalid file : %s)GTiff	LIBERTIFFzThe file is not a GeoTIFFr   z.ovrz>Overviews found in external .ovr file. They should be internali   r   i   z9The file is greater than 512xH or Wx512, but is not tiledzXThe file is greater than 512xH or Wx512, it is recommended to include internal overviews
IFD_OFFSETr   F)r      rbzCannot open fileBBBBr   ))I   rP   +   r   )M   rR   r   rQ   rM   r   z)GDAL_STRUCTURAL_METADATA_SIZE=%06d bytes
LATIN1zGDAL_STRUCTURAL_METADATA_SIZE=   zBLOCK_ORDER=ROW_MAJORzBLOCK_LEADER=SIZE_AS_UINT4z#BLOCK_TRAILER=LAST_4_BYTES_REPEATEDz!MASK_INTERLEAVED_WITH_IMAGERY=YESzKNOWN_INCOMPATIBLE_EDITION=YESz6KNOWN_INCOMPATIBLE_EDITION=YES is declared in the filer   z9The offset of the main IFD should be %d. It is %d insteadifd_offsetsmainz2First overview has larger dimension than main bandzCOverview of index %d has larger dimension than overview of index %dz!Overview of index %d is not tiledzoverview_%dzThe offset of the IFD for overview of index %d is %d, whereas it should be greater than the one of the main image, which is at byte %dzThe offset of the IFD for overview of index %d is %d, whereas it should be greater than the one of index %d, which is at byte %dc                 H   |                                  \  }}t          t          | j        |z   dz
  |z                      D ]_}t          t          | j        |z   dz
  |z                      D ]2}|                     d||fz  d          }|rt          |          c c S 3`dS )Nr   r   r   r   )r   r   r    r   r   r   )r+   
blockxsize
blockysizer7   r8   block_offsets         r
   get_block_offsetz"validate.<locals>.get_block_offsetA  s    !%!2!2!4!4
JsDJ3a7:EFFGG 	- 	-A3
Z 7! ;zIJJKK - -#33(Aq616      -|,,,,,,,-	- qr	   data_offsetszNThe offset of the first block of the smallest overview should be after its IFDzBThe offset of the first block of the image should be after its IFDziThe offset of the first block of overview of index %d should be after the one of the overview of index %dznThe offset of the first block of the main resolution image should be after the one of the overview of index %d
INTERLEAVEIMAGE_STRUCTUREr   zMain resolution imageBANDz Band %d of main resolution imager   z.mskz"Mask band of main resolution imagezOverview %dzBand %d of overview %dzMask band of overview %d))r    r   VersionInfor   typeencodedecode
isinstancestrPushErrorHandlerOpenPopErrorHandlerGetLastErrorMsg	GetDriver	ShortNameGetDescriptionrA   GetOverviewCountGetFileListr   r   r   r   	VSIFOpenLr"   r#   r$   r!   len
startswith
VSIFCloseLr   GetOverviewappendr?   r'   rG   GetMaskFlagsGMF_PER_DATASETr   r&   )#rD   check_tiled
full_checkunicode_typedetailsr,   warningsfilename	main_band	ovr_countfilelistr2   
ifd_offsetrU   r-   r.   r/   r0   r(   	signaturebigtiffexpected_ifd_pospatterngotsizeextra_mdiovr_bandprev_ovr_bandr]   r\   r^   r)   r1   rF   s#                                      r
   validater      s   $ 4M**++g5545QRRR		'**11'::;;L"sL)** 	VYr]]:8#d&:&<&<<   <<>>#+AAA89TUUUGFH  ""H  ##I**,,I~~H6 1X = =STT	# 5 5 	X"//11J!}	//JqMD4H4HVWW>>0 H
 Y..|VDDEEJ,K!!&*/'$)!   N8T** 	M89KLLLM'4>!Q+B+BCC	SS 	!! q*A...>BnS\\1a0077AAs88s7||##,)
 )
# s3?@@BBCAaCHIID~dAq1188BBH$;x$G!)E)Q&5A 0 4x? * 08;;STTGt 33 1$ 	{1~--K#[^45 F
  GM%/GM6"9 ' '##A&&2215566~	//8>IO3S3SOPP,,Q//;;AEBBM!444>M$777+./QZ8 
  	D!..00J!}..:a=43G3G>BCC 11,GGHH
:&&&4>}q01r?[_,,Avv145{2TV3XY  *-.BQTV,XY 	 	 	 $#I..L >L GN&2GNF#9 B B##A&&22155''11L)))5A 122B1b!1KO!C!Cq==* FF
 W F 3|$$q(!R00  ?aLOl1q56I$I$I?BCa%L F
 	LQOq  Ol1o--BENQR]T
 	

 ##L2CDDJ ww%w /w )	w N8T** 	M89KLLL  '%*3-    K!".11  ''"#K-6(Q,G$$X\22).71  !+-BF  
 ""$$(<<<F"2>>+;+;;;4%%''%*3   y!! 8	 8	A''**66q99HW$$!A%).71      %bn 5 5  H!V++&'"1"0HqL!3DD((A66BB1EE-2;5## #KK V##%$$Q''2244!A%)	   %%''4+???&r~~/?/???.2((**).7   	VW$$r	   c                    d}d}d}d}|t          |           k     r| |         dk    rd}nf| |         dk    rd}nW| |         dk    rd}nH| |         dk    rd}n9| |         d	         d
k    rt                      S |	| |         }nt                      S |dz  }|t          |           k     |t                      S t          j                     |4|                    d          pt
          j                            |          }	 d	}t          ||          \  }}|r7|s5t          d           |D ]}t          d|z              t          d           |rL|sGt          d|z             t          d           |D ]}	t          d|	z              t          d           d}n|st          d|z             |sV|sT|sRt          fdd         D                       }
|
d	k    rt          j        |          j        }
t          d|
z             n<# t          $ r/}|s!t          |dt          |                     d}Y d}~nd}~ww xY w|S )z+Return 0 in case of success, 1 for failure.r   NFz-qTz--full-check=yesz--full-check=noz--full-check=autor   -z/vsimem/)rz   z"The following warnings were found:z - r   z*%s is NOT a valid cloud optimized GeoTIFF.z The following errors were found:z%%s is a valid cloud optimized GeoTIFFc              3   4   K   | ]}d          |         V  dS )r^   Nr   ).0kr|   s     r
   	<genexpr>zmain.<locals>.<genexpr>%  s>        /0'*     r	   r^   z(
The size of all IFD headers is %d bytesz* is NOT a valid cloud optimized GeoTIFF : )rr   r   r   UseExceptionsrs   ospathexistsr   r   minVSIStatLr   r   rg   )argvr   r~   quietrz   retr}   r,   warningerrorheaders_sizeer|   s               @r
   rV   rV     s    	
AHEJ
c$ii--7d??EE!W***JJ!W)))JJ!W+++JJ!WQZ377NAwHH77N	Q! c$ii--$ ww((44Px8P8P
$,X*$M$M$M!&' 	 :;;;' + +G%'/****b			 
	J BXMNNN8999# ) )E%%-((((b			CC J=HIII 	NX 	Nf 	N    4;N4K    L q  #}X66;=LMMM1    	YhhhPSTUPVPVPVWXXX
 Js   D
H 
I%II__main__)TF)os.pathr   r"   sysosgeor   r   	Exceptionr   r?   rG   r   r   rV   r   exitr   r	   r
   <module>r      s      



      
 
 
	 	 	 	 	Y 	 	 	f f fR) ) )2B% B% B% B%J
 h B B B BJ zCHTT#(^^ r	   