a #eji@s2ddlZddlZddlmZddlmZddlmZ ddl m Z ddl Z ddl Z ddlmZddlmZdd lmZdd lmZmZmZmZdd lmZdd lmZmZdd lmZddlm Z ddl!m"Z#m$Z$ddl%m&Z&ddlm'Z'm(Z(ddl)Z*ddl+m,Z,ddl-m.Z.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5m6Z6m7Z7ddl8m9Z9ddl:m;Z;ddlm?Z?m@Z@ddlAmBZCddlDZDeDjEde deDjEde(de,D]ZFe#GeFZ#qddZHd d!ZId"d#ZJd$d%ZKd&d'ZLGd(d)d)e9ZMGd*d+d+e9ZNGd,d-d-e9ZGd.d/d/e9ZOGd0d1d1e9ZPdS)2N) ColorInterp)CRS)bounds)NotGeoreferencedWarning)get_asset_download_filename) HttpResponse)TileOutsideBounds)has_alpha_bandnon_alpha_indexesrendercreate_cutline)_stats)ImageStatistics ImageData)Metadata) img_profiles)cmap apply_cmap) COGReader)InvalidColorMapNameAlphaBandWarning)custom_colormaps)extension_for_export_formatZOOM_EXTRA_LEVELS) hsv_blend) LightSource)lookup_formulaget_algorithm_listget_auto_bands)TaskNestedView) exceptions)Response) export_rasterexport_pointcloud)gettextignore)categorycCs*|jd|jd}}||kr"|}||fS)Nminzoommaxzoom) spatial_info)src_dstr(r)r,/webodm/app/api/tiler.py get_zoom_safe,sr.cCs^d|jj|j|}i}dD]}||r||||<qt|dkrZ|dtj|}|S)Nz4/api/projects/{}/tasks/{}/{}/tiles/{{z}}/{{x}}/{{y}})formulabandsrescale color_map hillshader?)formatprojectidgetlenurllibparse urlencode)task tile_type query_paramsurlparamskr,r,r- get_tile_url3s  rCcCs>|j|j|jd}||vr"t||}|dur:t|S)N orthophotodsmdtm)orthophoto_extent dsm_extent dtm_extentr!NotFound)r=r>Z extent_mapextentr,r,r- get_extentAsrMcCs||dS)Nz.tifget_asset_download_path)r=r>r,r,r-get_raster_pathRsrPcCs |dS)Nzgeoreferenced_model.lazrN)r=r,r,r-get_pointcloud_pathUsrQc@seZdZdddZdS)TileJsonNc Cs|||}t||}tj|s*tt|}t|\}} Wdn1sT0Yt d|j ddt |||j j g|t| tt||jdS)z; Get tile.json for this tasks's asset type Nz2.1.0z1.0.0xyz)Ztilejsonnameversionschemetilesr(r)r)get_and_check_taskrPospathisfiler!rKrr.r"rUrCrequestr?rrMrL) selfr]pk project_pkr>r= raster_pathsrcr(r)r,r,r-r8Zs     * z TileJson.get)NNrS__name__ __module__ __qualname__r8r,r,r,r-rRYsrRc@seZdZdddZdS)BoundsNrScCs.|||}tt|||jjt||jdS)z< Get the bounds for this tasks's asset type )r@r)rYr"rCr]r?rMrL)r^r]r_r`r>r=r,r,r-r8ts   z Bounds.get)NNrSrcr,r,r,r-rgssrgc@seZdZdddZdS)rNrSc s|||}|jjd}|jjd}|jjd}|jjd} |dkrPd}|dkr\d}|dkrhd}| dkrtd} | durt| } d} d} |dkr|rd } t|j|\}} zlt||\} |durt t t | d dd } dur| d d ks| d d krn| Wn4t yN}ztt|WYd}~n d}~00d\t||}tj|sxtzt|n}|jjd}| durt|j| td}t| }nd}d}t|jr|d 8}d}|dkrd }dd}| dur|dur |j| d|id\}n|j| d\}tj !|d k_"fddt#j$d D}dd|%D}t&fd|i|'(}nB|dur|dur|j)|||d|id}n|j)||d}t|}Wdn1s0YWn8t*y@}ztdt|WYd}~n d}~00r|dD].}d |d|d<d |d|d<qPd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1}g}g}ddd2}|d3vrgd4}n8|r|rgd5}gt+|R}| r||d6<| |d7<g|d8<||d9<||d:<|r|D]V}z,|d8,|t-|.|||d;Wn"t/yztd<|Yn0q(|j0|d=<d>|d?<t1|||jjg|d@<|dA|dBkr|dB|dA<|dAt27<|dBt28<|j3|jj4dC|dD<t5|S)Ez> Get the metadata for this tasks's asset type r/r0range boundariesrSNFautoT,rr)g@gX@count EPSG:4326rE)binsrhcutline) expression vrt_options)rrc s.i|]&}t|dt|fddqS)rro) percentilesrprh)str raster_stats).0bdataZhrangepmaxpminr,r- sz Metadata.get..cSs i|]\}}|tfi|qSr,)r)rwrxsr,r,r-r} statistics)r|r{ hist_optionsnodatarrs)r|r{rrz#Cannot retrieve raster metadata: %sminmaxZViridisZJetz Jet (Reverse)ZTerrainZEarthZRdYlGnzRdYlGn (Reverse)ZSpectralzSpectral (Reverse)z Contrast NDVIzCustom NDVI IndexzRplumbo (Better NDVI)ZPastelZPlasmaZInfernoZMagmaZCividis)viridisjetjet_rterrain gist_earthrdylgnrdylgn_rspectral spectral_r discrete_ndvibetter_discrete_ndvirplumbopastel1plasmainfernomagmacividis)filtermatchrFrG)rrrrr)rrrrrrrrrrrrrrrrZ color_maps algorithms auto_bands)keyr2labelzNot a valid color_map value: %srUrTrWrXr)r()valuecrsr)6rYr]r?r8jsonloadsrorthophoto_bandsrtuplemapfloatsplit ValueErrorr!ValidationErrorrurPrZr[r\rKrdatasetmetar r from_string featureBoundsr previewnpmaarraymaskrhshapeitems RioMetadatainfodictmetadata IndexErrorrappendcolormapvaluesFileNotFoundErrorrUrCrrrr") r^r]r_r`r>r=r/r0Z defined_rangeboundaries_featureZis_auto_bands_matchZ is_auto_bandsexprZ new_rangeerarb band_countboundaries_cutlineZboundaries_bboxrZhistogram_optionsrstatsrrrxZ cmap_labelsZ colormapsrrrr,ryr-r8s        .$              2(         z Metadata.get)NNrSrcr,r,r,r-rsrc@seZdZdddZdS)TilesNrSrc / Cs|||} t|}t|}t|}t|}d} d} d} |jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|d krd}|durzt|}Wn"tjyt t d Yn0|d krd}|d krd}|d krd}|d krd}|d ks(|d kr,d}|d ks@|durDd }|d krd|rdt | j |\}}z:t|}|d kr|dkrt d|dkr|d8}Wn"t yt t dYn0zt||\}}Wn4t y}zt t|WYd}~n d}~00|dvr"|dur"d}|dkr:|dur:d}|dvrR|durRd}|dkr|dur|durtd}|durd}| dur| dkrtjnt| } ||}t| |}tj|stt|}||||stt dt|\}}t|j}||tks(||tkr0t|durpzt|j|t d}Wnt t dYn0nd}|dkr|dur|jj!}t"|dkrt#j$|vrt#j%|vrt#j&|vr|'t#j$d|'t#j%d|'t#j&df} nd} n|rt(|j} | dur |dkr d} d}d} d}!|dvr>d }d!} |durL|}!z|dur|dur|j)|||||| | |!|d"|id# }"n|j)|||||| | |!|d$ }"nH|dur|j)||||| | |!|d"|id% }"n|j)|||| || | |!|d& }"Wn"t*ytt dYn0|rJzt+|Wn"t,yHt t d'Yn0d}#zt-t.t|/d(}$Wn"t yt t d)Yn0| durt0|"j1d*2rd+} nd,|j3d-d vrd.} nd/} | d+krd0n| }%t4|%i}&|durDzt|}|dkr d1}Wn"t y0t t d2Yn0|"j5j6ddkrRt t d3|td|d}'|jj7d4d|'}(|jj7d4d |'})t8d5d6d7}*|"j5d}+| |+d|d|f<| |+|d8|d9d|f<| |+d||d8|d9f<| |+|d8|d9|d8|d9f<|*j9|+|(|)|d:}#|#||d8||d8f}#|#dur&|"j:|$fd;},|,j5dd||d8||d8f}-t+rt;|-t+|\},}|,j5j6dd9krt t d<|#d=}#t<|,|#},|,dur&|"j1||d8||d8f}.t=t>|,|.fd>|%i|&d??| d@WdS|durrt=|"j:|$fd;j>f|%t+|dA|&d??| d@WdSt=|"j:|$fd;j>fd>|%i|&d??| d@WdS1s0YdS)Bz" Get a tile image Nr/r0r1r2r3sizerirSzInvalid boundaries parameter0rjiz Invalid sizerzInvalid tile size parameterrz0,1000rEz0,255gray-1,1nanzOutside of boundsrnzInvalid boundaries)rrlrnearestbilinearrq)rrtilesizerpadding tile_bufferresampling_methodrs)rrrrrrr)rrrrrrs)indexesrrrrrNot a valid color_map valuerkzInvalid rescale valuerojpgz image/webpAcceptwebppngjpegg?zInvalid hillshade valuezGCannot compute hillshade of non-elevation raster (multiple bands found) transformi;-)azdegaltdegrlr)dxdy vert_exag)in_rangezLCannot process tile: intensity image provided, but no RGB data was computed.go@ img_formatzimage/{}) content_type)rr)@rYintr]r?r8rrJSONDecodeErrorr!r_rrrrrurrrrPrZr[r\rKr tile_existsr.r rrr rr colorinterpr9rredgreenblueindexr tiler rrlistrrequalrallheadersrrzrrrr3 post_processrrrr r5)/r^r]r_r`r>zxyscaleextr=rrZrgb_tiler/r0r1r2r3rr _discard_rrr@rbr(r)Z has_alpharci resamplingrrr intensityZ rescale_arrdriveroptions delta_scalerrls elevationrgbrgb_datarr,r,r-r8s~     $                      $ $   z Tiles.get)NNrSrSrSrSrNrcr,r,r,r-rsrc@seZdZdddZdS)ExportNc Cs|||}|jd}|jd}|jd}|jd|dkrDdnd} |jd} |jd } |jd } |d krzd }|d krd }|d krd }| d krd } | d krd } | d krd } d } |d vr| dvrttdd| i|dkr | dvr ttdd| i|dvr:| dkr:| d ur,d} | d ur:d} | d urvzt| Wn"tytttdYn0| d urz t| } Wn*t yttdd| iYn0|r|r|s|rttd|rL|rL|dkrt |j |\}}zt ||\} }Wn4t yJ}ztt |WYd }~n d }~00| dvrn|d urn|d urnd}| dkr|d }|d ur|dd}zttt|d}Wn*t yttdd|iYn0| d ur"zt| } | dkrtdWn"ttd d| iYn0|dkr6t|}n t||}tj|sVt| d urz|jd urzttd!t| }d"t||| d urd#|nd |}|d vr,| dkr| |jks| d ur| d urtd$|jj |j ||d%St!j"|| | | || | ||j#d& j$}t||d'Snh|dkr| dkrt| |jksV| d urttd(|jj |j ||d%St%j"|| | d)j$}t||d'Sd S)*zx Export assets (orthophoto, DEMs, etc.) after applying scaling formulas, shading, reprojections r/r0r1r5Zgeoreferenced_modellazgtiffepsgr2r3rSNrD)r gtiff-rgbrrkmzzUnsupported format: %(value)sr)rZlasplycsvrrrzInvalid EPSG code: %(value)sz.Both formula and bands parameters are requiredrj)rrrrz%2Crkz Invalid rescale value: %(value)srzHillshade must be > 0z"Invalid hillshade value: %(value)sz,Cannot use epsg on non-georeferenced datasetz{}{}.{}z-{}z)/api/projects/{}/tasks/{}/download/{}.tif)r@filename)rrrr5r1r2r3 asset_typerU)celery_task_idr z)/api/projects/{}/tasks/{}/download/{}.laz)rr5)&rYrzr8r!rrrrrrrrrrureplacerrrr ExceptionrQrPrZr[r\rKrrr5rr"r6r7r#delayrUtask_idr$)r^r]r_r`r r=r/r0r1 export_formatrr2r3rrrr@ extensionr r r,r,r-posts                    $           *  z Export.post)NNN)rdrerfrr,r,r,r-rsr)QrZrio_tiler.utilsZ rio_tilerrasterio.enumsr rasterio.crsrrasterio.featuresrrrasterio.errorsrr:rZcommonr django.httprZrio_tiler.errorsr r r r r rrvZrio_tiler.modelsrrrrZrio_tiler.profilesrZrio_tiler.colormaprrrZ rio_tiler.iorrrnumpyrZcustom_colormaps_helperrapp.raster_utilsrrhsvblendrr3rZformulasrrrtasksr rest_frameworkr!rest_framework.responser"Z worker.tasksr#r$django.utils.translationr%rwarningsfilterwarningsZcustom_colormapregisterr.rCrMrPrQrRrgrrr,r,r,r-s\                   m