+
    *jve                        R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIH	t	 ^ RI
HtHt  ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHt Rt^ RIt^ RIt^ RItR$t. R%OtR t]P@                  ! R4      t!R R lt"R t#0 R&mt$R R lt%R R lt&R R lt'R'R R llt(R(R R llt)R)R R llt*R*R R llt+R t,R+R  R! llt-R" R# lt.R#   ] d    R	t]! R
4       ]! R4        Li ; i),u:  
export_cog.py — Exportacao de campos do modelo Eta como Cloud Optimized GeoTIFF (COG)

Cada campo e exportado como um arquivo .tif georeferenciado em WGS84 (EPSG:4326),
com compressao DEFLATE, tiles 512x512 e overviews (piramides) para conformidade COG.

Dependencia: rasterio >= 1.3
    pip install rasterio

Estrutura de saida:
    cog/
    ├── TP2M/
    │   ├── TP2M_2026060400.tif
    │   ├── TP2M_2026060401.tif
    │   └── ...
    ├── PREC/
    │   ├── PREC_2026060406.tif
    │   └── acumulado_24h/
    │       └── PREC_2026060500_acum24h.tif
    └── ...

Valores:
    - Precipitacao (PREC, PRCV, PRGE, NEVE): convertidos de metros para mm
    - UNDEF do modelo substituido por NaN (nodata no GeoTIFF = -9999.0)
    - Arrays armazenados como float32
N)datetime	timedelta)Optional)ProcessPoolExecutoras_completed)from_origin)CRS)
ResamplingTFz,[export_cog] AVISO: rasterio nao encontrado.z0[export_cog]   Instale com: pip install rasterioc                     \        \        RR4      \        \        R^4      \        \        R^4      \        \        RR4      3# )zERetorna (compress, zlevel, predictor, tile_size) do config carregado.COG_COMPRESSDEFLATE
COG_ZLEVELCOG_PREDICTORCOG_TILE_SIZEi   )getattrconfig     F/pesq/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/export_cog.py_cog_paramsr   =   s>     	3++-	 r   i  c                $    V ^8  d   QhR\         /# )   return)int)formats   "r   __annotate__r   I   s     F FS Fr   c                    \        \        RR4      '       g   ^ # \        \        RR4      '       d   ^ # \        P                  \        P                  ,          p \	        V R,
          4      \        P                  8  d   ^ # \        P
                  \        P                  ^,
          \        P                  ,          ,           pVR8:  d   ^ # \        P
                  \        P                  ! \        P                  4      \        P                  ,          ,           p\        \        P                  ! VRRR7      4      \        P                  ,          # )	zNumero de colunas a rolar para converter grade global 0-360 em -180..180.

Retorna 0 quando cog.lon_180 esta desligado, a grade nao e global em lon,
ou ja esta na convencao -180..180. k = indice do primeiro centro >= 180.

COG_LON180FIRREGULAR_LON     v@g     f@left)sideg f@)
r   r   NXDLONabsLON0nparanger   searchsorted)spanlast_centerlonss      r   _lon_roll_kr,   I   s     6<//v..99v{{"D
4%<6;;&++Q&++ ==Kl";;699-;;DrtU89FIIEEr   c                    \        4       p V '       dQ   \        P                  V \        P                  ,          ,           R,
          \        P                  R,          ,
          pM,\        P                  \        P                  R,          ,
          p\	        \        RR4      '       d   \        \        P                  4      ^8  d   \        \        P                  R,          \        P                  R,          ,
          4      p\        \        P                  R,          4      VR,          ,           p\        \        P                  R,          \        P                  ^ ,          ,
          \        P                  ^,
          ,          4      pMQ\        P                  \        P                  R,
          \        P                  ,          ,           p\        P                  p\        W\        P                  V4      # )aI  
Retorna o Affine transform rasterio para a grade atual.

GrADS LON0/LAT0 sao centros de celula; from_origin espera o canto
(corner) superior esquerdo do primeiro pixel. Correcao de meio pixel:
  ul_lon = LON0 - DLON/2
  ul_lat = lat_max + dlat_top/2
Elimina o offset sistematico de ~DLON/2 visivel em grades esparsas (ex BESM).
r   g       @IRREGULAR_LATFg      ?)r,   r   r%   r#   r   lenLATSfloatNYLAT0DLATr   )kul_lontop_spacingul_latdlats        r   _get_transformr<   ]   s    	A++FKK/586;;;LLv{{S00v..3v{{3Ca3GFKKOfkk"o=>v{{2'+*;;B&++a.8VYY]KL		C6;;>>vv{{D99r   c                X    V ^8  d   QhR\         P                  R\         P                  /# r   arrr   r&   ndarray)r   s   "r   r   r      s"      BJJ 2:: r   c           	        \         P                  p\        P                  ! V^ ,          VR,          \	        V4      4      p ^ RIHp V! W^ RR\        P                  R7      pV! V4      P                  \        P                  4      #   \         dd    \        P                  ! T 4      p\        T P                  ^,          4       F(  p\        P                  ! Y!T RT3,          4      TRT3&   K*  	  Tu # i ; i)u   
Reamostrage de grade irregular (ex.: gaussiana) para grade regular.
Interpola ao longo do eixo lat (eixo 0) usando os valores de config.LATS.
Entrada / saída: (NY, NX) float32, S->N.
)interp1dlinearF)axiskindbounds_error
fill_value:NNNr/   )r   r2   r&   linspacer1   scipy.interpolaterC   nanastypefloat32ImportError
empty_likerangeshapeinterp)r?   
lats_irreglats_regrC   foutjs   &      r   _regrid_to_regularrX      s     JZ]JrNC
OLH
.zQX$)bff>{!!"**-- mmC syy|$A		(AqD	BC1I %
s   AB A+C54C5c                X    V ^8  d   QhR\         P                  R\         P                  /# r>   r@   )r   s   "r   r   r      s"      RZZ BJJ r   c           	     f   \         P                  ! V 4      pVP                  4       '       d   VP                  4       '       d   V #  ^ RIHp V! VRRR7      pV \        V4      ,          #   \         Ed<    ^ RIpT P                  4       p\         P                  ! T4      P                  4       '       d   \         P                  ! T4      p\         P                  ! T^\         P                  R7      p\         P                  ! TRR
1^R13,          TR^R13,          T^R1RR
13,          T^R1R3,          .4      pTP                  4       ;_uu_ 4        TP                  R\        4       \         P                   ! T^ R	7      p	RRR4       M  + '       g   i     M; iX	T,          YV&   EK"  Tu # i ; i)zPreenche NaN com o valor valido mais proximo (para visualizacao continua).

Usa scipy.ndimage.distance_transform_edt quando disponivel; senao,
dilata iterativamente com a media dos vizinhos validos (grades pequenas).
)distance_transform_edtFT)return_distancesreturn_indicesN)constant_values:r   NNignorerE   r0   r/   )r&   isnananyallscipy.ndimager[   tuplerN   warningscopypadrK   stackcatch_warningssimplefilterRuntimeWarningnanmean)
r?   maskr[   idxrf   rV   mpri   nbs
   &         r   _fill_undef_nearestrs      sF    88C=D88::
8$TERVW5: hhjhhsm!!AsArvv6AHHaQrT	lAb!B$hK1R4"9q2r{STE((**%%h?ZZA. +*** UCF
s2   "A) )A	F03BF0/F
	F0
FF0/F0c                d    V ^8  d   QhR\         P                  R\        R\         P                  /# )r   datavar_namer   )r&   rA   str)r   s   "r   r   r      s)          s  rzz  r   c                v   V P                  \        P                  4      pV\        9   d3   \        P                  ! RRR7      ;_uu_ 4        VR,          pRRR4       \        \        RR4      '       d   \        V4      p\        \        RR4      '       d   \        V4      p\        P                  ! V4      p\        4       pV'       d   \        P                  ! W#) ^R7      p\        P                  ! \        P                  ! V4      \        P                  ! \        4      V4      pV#   + '       g   i     L; i)	u  
- Converte m->mm para precipitacao
- Reamostrage para grade regular quando grade Y é irregular (gaussiana)
- cog.fill_undef: preenche undef com vizinho mais proximo (sem mascara)
- Flipa verticalmente (GrADS: S->N; rasterio: N->S)
- Substitui NaN por NODATA
- Retorna float32
r_   )overinvalidg     @@Nr.   FCOG_FILL_UNDEFr`   )rL   r&   rM   _PRECIP_VARSerrstater   r   rX   rs   flipudr,   rollwherera   NODATA)ru   rv   r?   r7   s   &&  r   _prepare_arrayr      s     ++bjj
!C<[[h99,C : v.. % v'//!#&
))C.C 	Aggc2A&
((288C="**V"4c
:CJ) :9s   
D((D8	c          
      ~    V ^8  d   QhR\         P                  R\        R\        \        ,          R\
        R\        /# )r   r?   fpathmetadata	overviewsr   )r&   rA   rw   r   dictbool)r   s   "r   r   r      sI     V V	VV tnV 	V
 	Vr   c                Z   \         '       g   \        R4      h\        P                  ! \        P                  P                  \        P                  P                  V4      4      RR7       \        P                  ! V \        P                  R7      p \        4       w  rErgRRRRR	\        P                  R
\        P                  R^R\        R\        4       R\         RVRVRVRRRVRVRR/pV'       gX   \"        P$                  ! VR3/ VB ;_uu_ 4       p	V	P'                  V ^4       V'       d   V	P(                  ! R!/ VB  RRR4       V# \*        P,                  ! RRR7      ;_uu_ 4       p
V
P.                  pRRR4        \"        P$                  ! XR3/ VB ;_uu_ 4       p	V	P'                  V ^4       V'       d   V	P(                  ! R!/ VB  RRR4       \"        P$                  ! VR4      ;_uu_ 4       p	V	P1                  \2        \4        P6                  4       V	P)                  RRR7       RRR4       \8        P:                  ! WR\<        \>        R\@        \@        RR 7	       \        P                  PC                  V4      '       d   \        PD                  ! V4       V#   + '       g   i     T# ; i  + '       g   i     ELE; i  + '       g   i     EL; i  + '       g   i     L; i  \        P                  PC                  X4      '       d   \        PD                  ! T4       i i ; i)"a  
Escreve arr (NY, NX) float32 como GeoTIFF tiled georeferenciado.

Parameters
----------
arr       : array (NY, NX) float32, preparado por _prepare_array
fpath     : caminho do arquivo .tif de saida
metadata  : tags GDAL a gravar nos metadados
overviews : se True, embute overviews (piramides) no arquivo via
            rasterio.shutil.copy.
            ATENCAO: alguns visualizadores (ex: SisMOM) exibem cada
            nivel de overview como uma camada separada. Use False
            (padrao) para compatibilidade maxima.
zrasterio e necessario.Texist_ok)dtypedriverGTiffr   rM   widthheightcountcrs	transformnodatacompresszlevel	predictortiled
blockxsize
blockysizeBIGTIFFIF_SAFERwN.tifF)suffixdeletezr+rio_overviewaverage)ns
resampling)copy_src_overviewsr   r   r   r   r   r   r   )#HAS_RASTERIOrN   osmakedirspathdirnameabspathr&   ascontiguousarrayrM   r   r   r"   r4   	CRS_WGS84r<   r   rasterioopenwriteupdate_tagstempfileNamedTemporaryFilenamebuild_overviewsOVERVIEW_LEVELSr	   r   
rio_shutilrg   COMPRESS	PREDICTOR	TILE_SIZEexistsremove)r?   r   r   r   	_compress_zlevel
_predictor_tileprofiledsttmptmp_paths   &&&&        r   	write_cogr      sW   ( <233KK 67$G 

s"**
5C,7M)I
gifiifiiain&figjdeejG$  ]]5#111SIIc1+(+ 2 
 
	$	$F5	A	AS88 
B ]]8S4G44IIc1+(+ 5
 ]]8T**c1C1CDOO~)OD + 	#  		
 77>>(##IIhLI 21 
 
B	A	A 544
 +* 77>>(##IIh $sT   -J(J1> K, -K'K, 28K*6K, J.	1K	K		K, K)	$K, ,>L*c                    V ^8  d   QhR\         P                  R\        R\        R\        R\        R\        R\
        R\        /# )	r   ru   rv   	timestampcog_dirtitle_extrar   	level_hpar   )r&   rA   rw   r   r   r   )r   s   "r   r   r   4  sf     1E 1E
**1E1E 1E 	1E
 1E 1E 1E 	1Er   c                b   \        W4      p\        P                  P                  VR4      pV\        9   d   RpRVR\        P
                  P                  W4      RVRVP                  R4      RR	\        P                   2R
\        \        4      RR/p	V'       d   WIR&   Ve   \        V4      V	R&   Ve   RV R2MRp
V'       d$   RVP                  RR4      P                  4        2MRpV V
 RVP                  R4       V R2p\        P                  P                  W<4      p\        W}WR7      # )a0  
Exporta um campo 2D como COG GeoTIFF.

Parameters
----------
data       : array (NY, NX) lido pelo reader
var_name   : nome da variavel
timestamp  : datetime do campo
cog_dir    : diretorio de saida
title_extra: sufixo no nome do arquivo (ex: "acum24h")

Returns
-------
Caminho do arquivo .tif criado.
 mmvariabledescriptionunitsr   z%Y-%m-%dT%H:%M:%SZmodelzEta03/BESM run r   r   z	EPSG:4326r   r   _hPa %Y%m%d%Hr   )r   r   )r   r   	VAR_UNITSgetr|   VAR_DESCstrftimeRUN_TAGrw   r   replacelowerr   r   joinr   )ru   rv   r   r   r   r   r   r?   r   metalev_str	extra_tagfnamer   s   &&&&&&&       r   export_field_as_cogr   4  s-   0 
(C  2.E< 	xv**8>uy))*>?(89s6{{D )]	N[&/&;!I;c"G?J!K''S1779:;PRIj	9#5#5j#A"B9+TREGGLL(ES$DDr   c                `    V ^8  d   QhR\         R\         R\         R\        R\        R\        /# )r   data_dirrv   r   
sequentialverboser   )rw   r   list)r   s   "r   r   r   h  sD        	
  
r   c           
        \         P                  ! V 4      p\        P                  ! VRR7       . pV Ff  p \         P                  ! WWR7      p\        WWr4      p	VP                  V	4       V'       d&   \        RV RVP                  R4       RV	 24       Kf  Kh  	  V#   \         d=   p
T'       d*   \        RT RTP                  R4       R	T
 24        R
p
?
K   R
p
?
K  R
p
?
ii ; i)zv
Exporta todos os timesteps disponiveis de uma variavel como COG GeoTIFF.

Returns
-------
Lista de caminhos criados.
Tr   r   z  [COG] r   r   z -> z  [COG] ERRO : N)
readerlist_available_timestampsr   r   
read_fieldr   appendprintr   	Exception)r   rv   r   r   r   
timestampssavedtru   r   es   &&&&&      r   export_var_all_timestepsr   h  s     11(;JKK$'E	P%%h8SD'CELL
!AJJz,B+C4wOP   L	  	PhZqJ1G0H1#NOO 	Ps   A BC&*+C!!C&c                l    V ^8  d   QhR\         R\         R\        R\        R\        R\        R\        /# )r   r   cog_base_dirr   r   r   skip_existingr   )rw   r   r   )r   s   "r   r   r     sN        	
   
r   c           	     :    \         P                  ! V VVVVVR7      # )z
Wrapper de compatibilidade -- delega para accumulate.export_all_accumulations_as_cog().

Nomenclatura atual: PREC_ACUM24h_2026060500.tif
Janelas ACUM00Z e ACUM12Z calculadas a partir do horario do run (config.T0).
)r   r   r   r   r   r   )
accumulateexport_all_accumulations_as_cog)r   r   r   r   r   r   s   &&&&&&r   #export_all_24h_accumulations_as_cogr     s)     55 $"!% r   c                  aaaa V w  rporEp. pVP                  R4      oV3R lo\        \        R/ 4      p\        \        R/ 4      p	\        \        R/ 4      p
. pV EFf  oVP                  S^ 4      pV^ 8  d   V
P                  S. 4      pV'       d   V'       d   \        ;QJ d!    VVV3R lV 4       F  '       d   K   RM	  RM! VVV3R lV 4       4      '       dO   V FF  p\
        P                  P                  S! S4      S R	V R
S R24      pVP                  SW/R34       KH  	  K  VP                  S4       K  \
        P                  P                  S! S4      S R	S R24      pV'       d>   \
        P                  P                  V4      '       d   VP                  SVVR34       EKU  VP                  S4       EKi  	  V'       g   V# / p/ pV F  oVP                  S^ 4      pV^ 8  dx   V	P                  S. 4      pV
P                  S. 4      p. p/ pV F3  pVV9   g   K  VP                  V4      pVP                  V4       VVV&   K5  	  V'       d   TMRVS&   VVS&   K  RVS&   K  	   \        P                  ! WVVR7      pT EF7  o TP                  S^ 4      pT^ 8  d   TP                  S/ 4      pT
P                  S. 4      pT	P                  S. 4      pTP                  S/ 4      pT F  pTT9  d?   TP                  STRR\        T4      ,           R,           \        T4      ,           34       KH  TP                  T4      pTe   TT9  d   Kf  \        TT,          STS! S4      YR7      pTP                  SY/R34       K  	  EK  \        TS,          STS! S4      TR7      pTP                  SY/R34       EK:  	  T#   \         d=   pY{ Uu. uF  pTTRR\        T4      ,           3NK  	  Mu upi up,           u Rp?# Rp?ii ; i  \         d+   pTP                  STR\        T4      34        Rp?EK  Rp?ii ; i)a  
Worker por TIMESTEP: le o arquivo .bin UMA vez e gera TODOS os COGs
das variaveis solicitadas (2D e 3D). Paralelismo correto = 1 task por arquivo.

- Variaveis 2D: 1 COG por timestep  ({VAR}_{YYYYMMDDHH}.tif)
- Variaveis 3D: 1 COG por nivel em plot_levels ({VAR}_{N}hPa_{YYYYMMDDHH}.tif)

args: (data_dir, timestamp, vars_list, cog_dir, sequential, overviews, skip_existing)
returns: list of (var, timestamp, fpath_or_None, error_or_None)
r   c                 F   < \        S\        4      '       d
   SV ,          # S# )N)
isinstancer   )var_out_dirs   &r   _var_dir&_worker_cog_timestep.<locals>._var_dir  s     *8T : :x}HHr   VAR_NLEV
VAR_LEVELSVAR_PLOT_LEVELSc              3      <"   T FQ  p\         P                  P                  \         P                  P                  S! S4      S R V RS R24      4      x  KS  	  R# 5i)r   hPa_r   N)r   r   r   r   ).0levr  ts_strr   s   & r   	<genexpr>'_worker_cog_timestep.<locals>.<genexpr>  sU      + 'c GGLL#3%qT&0NO &s   AAFTr   r  r   Nr   z	leitura: znivel zhPa ausente em levels )r   r   )r   )r   r   r   r   rc   r   r   r   r   r   indexr   read_fields_selectiver   rw   r   )args	_data_dir_t_vars_seq_ovr_skipresults	_var_nlev_var_levels_var_plot_levelsvars_needednlev	plot_lvlsr
  fpr   var_level_maplevel_k_mapall_lvlskslkr7   fieldsr   vlev_datar  r  r  r   s   &                          @@@@r   _worker_cog_timestepr'    s    9=5I5(DGkk*%FI vz"=Iv|"=Kv'8"=K}}S!$!8(,,S"5Iss + '+sss + '+ ( (
 %ChsmuAcU$vhd5STBNNC#67 % ""3' GGLL#3%q0EFE..R56""3'+ .  MK}}S!$!8#R0H(,,S"5IBB (? s+AIIaLBsG	 !
 (*tM#!#K!%M# "T--=T
 	4==a(Dax'OOC4,00b9	'OOC4"JJsB/$C(*R$s3x/2JJSQY]Z(\ ] sAyAX$5 , S"hsm"%B NNC#67 % )c2x}X\]RT233 : NA  T{S{!1b$c!f(<={SSST:  	4NNCT3q6233	4sI   5O C>P1PPPO=<P
PPQ#QQc                    V ^8  d   QhR\         R\         R\        R\        R\        R\        R\        R\        R	\        /	# )
r   r   r   vars_to_exportr   workersr   r   r   r   )rw   r   r   r   r   )r   s   "r   r   r     sm     x xxx x 	x
 x x x x 
xr   c                2  aaaaaa a!a" T;'       g    \         P                  p\        P                  ! V 4      pV'       g   \	        RV  R24       / # S'       Ed	   \        \         R/ 4      p	\        \         R/ 4      p
^ pV FT  pV	P                  V^ 4      pV^ 8  d0   V
P                  V. 4      pY'       d   \        V4      MT,          pKK  V^,          pKV  	  \        V4      V,          p\	        R\        V4       RV RV RV 24       V FR  pV	P                  V^ 4      pV^ 8  d)   V
P                  V. 4      p\	        R	V R
V RV 24       KD  \	        RV 24       KT  	  \        P                  ! VRR7       / pV F@  p\        P                  P                  VV4      p\        P                  ! VRR7       VVV&   KB  	  V Uu. uF  pV VVVW6V3NK  	  upo"V Uu/ uF  pV. bK  	  upo ^ o^ o^ o^ o\        P                  ! 4       o!VVVVV V!V"V3R lpV^8  dm   \        VR7      ;_uu_ 4       pS" Uu/ uF  pVP                  \        V4      VbK  	  pp\!        V4       F  pV! VP#                  4       4       K  	  RRR4       MS" F  pV! \        V4      4       K  	  \        P                  ! 4       S!,
          pV^ 8  d
   SV,          M^ pS'       d   \	        RS RS RVR RVR R2	4       S # u upi u upi u upi   + '       g   i     Lq; i)a  
Exporta todos os campos de todas as variaveis como COG GeoTIFF.

Parameters
----------
data_dir      : diretorio com os .bin
cog_base_dir  : diretorio raiz de saida dos COGs
vars_to_export: lista de variaveis (None = todas)
sequential    : True se arquivos .bin usam marcadores Fortran
workers       : processos paralelos (1 = serial)
verbose       : exibir progresso
skip_existing : pula arquivos ja existentes

Returns
-------
dict {var_name: [lista de caminhos]}
z+[export_cog] Nenhum arquivo encontrado em ''r  r  z[export_cog] z timesteps x z campos/ts = z COGs a gerar | workers=z  [3D] z: nlev=z | plot_levels=z  [2D] Tr   c                 &  < S^,          oS\        S4      ,          ^d,          pV  Fg  w  r#rEV'       d9   S	^,          o	S'       d&   \        RV RVP                  R4       RV 24       KD  KF  SV,          P                  V4       S
^,          o
Ki  	  S'       dy   \        P                  ! 4       S,
          pS'       d!   VS,          \        S4      S,
          ,          M^ p\        RSR R\        S4       RVR	 R
S
 RS	 RVR RVR R2RR7       R# R# )   z	  [ERRO] r   r   r   z  [3d/z  z5.1fz%]  ok=z  err=z.0fzs  ETA=sT)flushN)r1   r   r   r   time)res_listpctr   tsr   errelapsedetadonen_errn_okn_skipr   t0tasksr   s   &       r   _process*export_all_fields_as_cog.<locals>._processh  s	   	SZ#%#+CU
IcU!BKK
,C+DBseLM  c
!!%(	 $, iikB&G<@7T>c%j4&78aCd2YaE
|2c$Z 8vVE7WSMS	4 	 r   )max_workersNz
[export_cog] z COGs gerados, z	 erros | z.1fzs (z COG/s))r   	VAR_NAMESr   r   r   r   r   r1   r   r   r   r   r3  r   submitr'  r   result)#r   r   r)  r   r*  r   r   r   r   _var_nlev_g_var_plot_levels_gn_per_ts_v_nl_pln_cogs_totalvar_dirsr   dr   r%  r@  pooltaskfutsfutr8  speedr:  r;  r<  r=  r   r>  r?  s#   &&&&&f&&                    @@@@@@@r   export_all_fields_as_cogrT    s   6 $77v'7'7N55h?J;H:QGH	w$VZC$V->C B//"a(CQw(,,R4CH4A ! :1C
O,M( D7yB	

 !B//"a(CQw(,,R4t73%seDEtn% ! KKt,HGGLLs+
A%  A 
1nh
}UE
 --nq"un-EDFEDiikB , { W55NSTedDKK 4d;TAeDT#D)& * 65
 D)$/0  iikBG '!dWnEdV?5' :#c%G5	

 Lg
 .> U 65s*   K7K<3L8 L*LLL	c                0    V ^8  d   QhR\         R\        /# )r   r   r   )rw   r   )r   s   "r   r   r     s        r   c                H   \         '       g   R#  \        P                  ! V 4      ;_uu_ 4       p\        VP	                  ^4      4      ^ 8  pVP
                  P                  RR4      pT;'       d    TuuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)z
Verificacao basica: abre o arquivo e confirma que tem overviews e tiles.
Para validacao completa use: python -m cogdumper ou rio cogeo validate.
Fr   N)r   r   r   r1   r   r   r   r   )r   srchas_overviewsis_tileds   &   r   validate_cogrZ    s{    
 <]]5!!Sa 01A5MKKOOGU;H --X "!!!  s/   B AA>3
B >B		B B B! B!g    )r                >   NEVEPRCVPRECPRGE)NF)r   FN)FT)FTFF)NFr.  TFF)/__doc__r   r3  r   numpyr&   r   r   typingr   concurrent.futuresr   r   r   rasterio.shutilshutilr   rasterio.transformr   rasterio.crsr   rasterio.enumsr	   r   rN   r   r   r   r   r   r   r   	from_epsgr   r,   r<   r|   rX   rs   r   r   r   r   r   r'  rT  rZ  r   r   r   <module>rm     s   6 
    (  @
>(. )L    # MM$	F(:8 0*6 NVz1EhL8jZx~W  >L	
89	
<=>s   C CC