a #eo@sddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z ddl m Z ddlmZedZddZd d Zd d Zd dZddZdS)N)quote) cog_validate cog_translate)has_alpha_band)settingsz app.loggercCsZz,ddlm}||dd\}}}| o*| WStyTtdt|ddYS0dS)z Validate a Cloud Optimized GeoTIFF :param src_path: path to GeoTIFF :return: true if the GeoTIFF is a cogeo, false otherwise r)validateT)Z full_checkz8Using legacy cog_validate (osgeo.gdal package not found))strictN)Z+app.vendor.validate_cloud_optimized_geotiffrModuleNotFoundErrorloggerwarningr)src_pathrwarningserrorsdetailsr/webodm/app/cogeo.py valid_cogeos   rcCstj|std|dSt|r*dStd|d}t}|rr|\}}}|dkr\d}|dkrv|dkrvd}nd}|rtd t|St |SdS) a9 Guarantee that the .tif passed as an argument is a Cloud Optimized GeoTIFF (cogeo) If the path is not a cogeo, it is destructively converted into a cogeo. If the file cannot be converted, the function does not change the file :param src_path: path to GeoTIFF (cogeo or not) :return: None z/Cannot validate cogeo: %s (file does not exist)Nz(Optimizing %s as Cloud Optimized GeoTIFFFTz3Using legacy implementation (GDAL >= 3.1 not found)) ospathisfiler r rinfoget_gdal_versionmake_cogeo_legacymake_cogeo_gdal)r Z use_legacy gdal_versionmajorminorbuildrrr assure_cogeos&   r!cCsLtd}|sdSt|dgd}td|}|s:dSttt | S)Ngdal_translatez --versionzutf-8z,GDAL\s+([\d+])\.([\d+])\.([\d+]),\s+released) shutilwhich subprocess check_outputdecoderematchtuplemapintgroups)r"Zversion_outputmrrrrIs  rcCs0tjdtjd}tjdtjd}z:tddddddd dd dd dd d ddt|t|gWn6ty}zt dt |WYd}~n d}~00t j |r(t||zt||WnNty }z4t d||t |ft|||WYd}~n d}~00t j |r$t |dSdSdS)zK Make src_path a Cloud Optimized GeoTIFF. Requires GDAL >= 3.1 _cogeo.tifdir_cogeo_swap.tifr"z-ofZCOGz-coz BLOCKSIZE=256zCOMPRESS=deflatezNUM_THREADS=ALL_CPUSzBIGTIFF=IF_SAFERzRESAMPLING=NEARESTz--configGDAL_NUM_THREADSALL_CPUSz)Cannot create Cloud Optimized GeoTIFF: %sNCannot move %s to %s: %sTF)tempfilemktempr MEDIA_TMPr%runr Exceptionr r strrrrr#moveIOErrorremove)r tmpfileswapfileerrrrZs4  (   rc CsJtjdtjd}tjdtjd}t|r}tdddd|jddd d }td dd d }d}t |rv|j ddkrvd}t |||||ddddWdn1s0Yt j |rBt||zt||WnNty$}z4td||t|ft|||WYd}~n d}~00t j |r>t |dSdSdS)z Make src_path a Cloud Optimized GeoTIFF This implementation does not require GDAL >= 3.1 but sometimes (rarely) hangs for unknown reasons r/r0r2GTiffTcompressdeflatepixel) blockxsize blockysizedrivertiledrD interleaver4Z128)r3ZGDAL_TIFF_INTERNAL_MASKZGDAL_TIFF_OVR_BLOCKSIZENdtypeuint16gF)nodataconfigZ in_memoryquietZ web_optimizedr5)r6r7rr8rasterioopendictprofilegetrmetarrrrr#r<r=r r r;r>)r r?r@dstZoutput_profilerOrNrArrrrsF    $   r)rloggingr6r#rQr(r%ZpipesrZrio_cogeo.cogeorrZrio_tiler.utilsrwebodmr getLoggerr rr!rrrrrrrs     *&