o
    F+$jC                     @   sP  d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ z ddlZddlmZ ddlmZ ddlmZ ddlmZ d	ZW n ey[   d
Zed ed Y nw ddlZddlZddlZdZdZg dZdZ dZ!dZ"e#dZ$ej%ej&d ej'  Z(ej)Z*ee*e(ej+ej'Z,h dZ-dej.de/dej.fddZ0		
d8dej.de/de	e1 de2de/f
dd Z3	!	
d9dej.de/d"ed#e/d$e/de2de/fd%d&Z4	
		d:d'e/de/d#e/d(e2d)e2de5fd*d+Z6	
			
	
d;d'e/d,e/d(e2d)e2de2d-e2de1fd.d/Z7d0d1 Z8		
				
	
d<d'e/d,e/d2e5d(e2d3e9d)e2de2d-e2de1fd4d5Z:de/de2fd6d7Z;dS )=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 rasteriog    i   )                ZDEFLATE   r
   i     >   PRGEZNEVEPRCVPRECdatavar_namereturnc                 C   sD   |  tj}|tv r|d }t|}tt|tt|}|S )z
    - Converte m->mm para precipitacao
    - Flipa verticalmente (GrADS: S->N; rasterio: N->S)
    - Substitui NaN por NODATA
    - Retorna float32
    g     @@)astypenpfloat32_PRECIP_VARSflipudwhereisnanNODATA)r   r   arr r    A/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/export_cog.py_prepare_arrayS   s   
r"   r   fpathmetadata	overviewsc                 C   s  t stdtjtjtj|dd tj| tj	d} ddt
jt
jdttttttdttdd	}|shtj|d
fi |!}|| d |rV|jdi | W d   |S W d   |S 1 saw   Y  |S tjddd}|j}W d   n1 s}w   Y  zjtj|d
fi |}|| d |r|jdi | W d   n1 sw   Y  t|d}|ttj |jddd W d   n1 sw   Y  tj ||dttdttdd	 W tj!|rt"| |S tj!|rt"| w w )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)dtypeZGTiffr   r   ZIF_SAFER)driverr(   widthZheightcountcrsZ	transformnodatacompressZzlevel	predictortiled
blockxsize
blockysizeZBIGTIFFwN.tifF)suffixdeletezr+Zrio_overviewaverage)nsZ
resampling)Zcopy_src_overviewsr.   r/   r0   r1   r2   r)   r    )#HAS_RASTERIOImportErrorosmakedirspathdirnameabspathr   ascontiguousarrayr   configNXNY	CRS_WGS84	TRANSFORMr   COMPRESSZLEVEL	PREDICTOR	TILE_SIZErasterioopenwriteZupdate_tagstempfileNamedTemporaryFilenameZbuild_overviewsOVERVIEW_LEVELSr	   r7   
rio_shutilcopyexistsremove)r   r#   r$   r%   profiledsttmpZtmp_pathr    r    r!   	write_cogi   s|   


rX    	timestampcog_dirtitle_extrac                 C   s   t | |}tj|d}|tv rd}|tj||||ddtj tt	dd}|r0||d< |r=d|
d	d  nd}	| d|d
 |	 d}
tj||
}t||||dS )a`  
    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.
    rY   mmz%Y-%m-%dT%H:%M:%SZzEta03/BESM run z	EPSG:4326)variabledescriptionunitsrZ   modelr-   r,   r\   _ %Y%m%d%Hr4   )r$   r%   )r"   rA   	VAR_UNITSgetr   VAR_DESCstrftimeRUN_TAGstrr   replacelowerr;   r=   joinrX   )r   r   rZ   r[   r\   r%   r   r`   metaZ	extra_tagfnamer#   r    r    r!   export_field_as_cog   s$   

	rp   data_dir
sequentialverbosec                 C   s   t | }tj|dd g }|D ]O}z)t j| |||d}t||||}	||	 |r:td| d|d d|	  W q t	y_ }
 z|rUtd| d|d d	|
  W Y d
}
~
qd
}
~
ww |S )z
    Exporta todos os timesteps disponiveis de uma variavel como COG GeoTIFF.

    Returns
    -------
    Lista de caminhos criados.
    Tr&   rr   z  [COG] rc   rd   z -> z  [COG] ERRO : N)
readerlist_available_timestampsr;   r<   
read_fieldrp   appendprintrh   	Exception)rq   r   r[   rr   rs   
timestampssavedtr   r#   er    r    r!   export_var_all_timesteps   s"   

  r   cog_base_dirskip_existingc                 C   s   t j| |||||dS )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).
    )rq   r[   rr   r%   r   rs   )
accumulateexport_all_accumulations_as_cog)rq   r   rr   rs   r%   r   r    r    r!   #export_all_24h_accumulations_as_cog  s   r   c                    sD  | \} }}}}}g }  d}g }	|D ]&}
tj||
 d| d}|r5tj|r5||
 |df q|	|
 q|	s?|S z
tj| |d}W n tyg  z| fdd|	D  W  Y dS dww |	D ]5}
zt	||
 |
 ||d}||
 |df W qj ty  z||
 dt
f W Y dqjdww |S )	a5  
    Worker por TIMESTEP: le o arquivo .bin UMA vez e gera TODOS os COGs
    das variaveis solicitadas. Paralelismo correto = 1 task por arquivo.

    args: (data_dir, timestamp, vars_list, cog_dir, sequential, overviews, skip_existing)
    returns: list of (var, timestamp, fpath_or_None, error_or_None)
    rd   rb   r4   Nrt   c                    s   g | ]}| d d fqS )Nz	leitura: r    .0v_tr   r    r!   
<listcomp>S  s    z(_worker_cog_timestep.<locals>.<listcomp>)r%   )rh   r;   r=   rm   rS   ry   rv   read_all_fieldsr{   rp   rj   )argsZ	_data_dirZ_varsZ_out_dirZ_seqZ_ovrZ_skipresultsts_strZvars_neededvarr#   fieldsr    r   r!   _worker_cog_timestep7  s4   
$"r   vars_to_exportworkersc              
      s  pt jt}|std d i S r2tdt| dt dt|t  d|  tj dd  	
fd	d
|D dd D ddddt fdd}	|dkrt	|dfddD }
t
|
D ]}|	|  q~W d   n1 sw   Y  nD ]}|	t| qt  }|dkr| nd}rtd d d|dd|dd	 S )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 ''z[export_cog] z timesteps x z variaveis = z COGs a gerar | workers=Tr&   c              	      s   g | ]}| fqS r    r    )r   r~   )r   rq   r%   rr   r   r   r    r!   r     s    z,export_all_fields_as_cog.<locals>.<listcomp>c                 S   s   i | ]}|g qS r    r    r   r    r    r!   
<dictcomp>  s    z,export_all_fields_as_cog.<locals>.<dictcomp>r   c                    s    d7   t  d }| D ]*\}}}}|r-d7 r,td| d|d d|  q| | d7 qrst  } rM|  t    nd}td d	d
t  d|dd d d|dd|dddd d S d S )Nr   d   z	  [ERRO] rc   rd   ru   r   z  [3d/z  z5.1fz%]  ok=z  err=z.0fzs  ETA=sT)flush)lenrz   rh   ry   time)res_listpctr   tsr#   errelapsedeta)donen_errn_okn_skipr}   t0tasksrs   r    r!   _process  s4    

z*export_all_fields_as_cog.<locals>._processr   )max_workersc                    s   i | ]	}  t||qS r    )submitr   )r   task)poolr    r!   r     s    Nz
[export_cog] z COGs gerados, z	 erros | z.1fzs (z COG/s))rA   	VAR_NAMESrv   rw   rz   r   r;   r<   r   r   r   resultr   )rq   r   r   rr   r   rs   r%   r   r|   r   futsfutr   r   speedr    )r   rq   r   r   r   r   r%   r   r}   rr   r   r   r   r   rs   r!   export_all_fields_as_cog`  sZ   

r   c                 C   sx   t sdS z-t| }t|ddk}|jdd}|o|W  d   W S 1 s*w   Y  W dS  ty;   Y dS w )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   r   r0   N)r9   rJ   rK   r   r%   rU   rf   r{   )r#   srcZhas_overviewsZis_tiledr    r    r!   validate_cog  s   (r   )NF)rY   F)FT)FTFF)NFr   TFF)<__doc__r;   r   rM   numpyr   r   r   typingr   concurrent.futuresr   r   rJ   Zrasterio.shutilshutilrQ   Zrasterio.transformr   Zrasterio.crsr   Zrasterio.enumsr	   r9   r:   rz   rA   rv   r   r   rI   rP   rF   rG   rH   Z	from_epsgrD   LAT0rC   DLATZ_UL_LATLON0Z_UL_LONDLONrE   r   ndarrayrj   r"   dictboolrX   rp   listr   r   r   intr   r   r    r    r    r!   <module>   s    

a
4
)
,	
f