
    ը	fk                         d Z ddlZddlmZ ddlZ	 ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ  G d	 d
e      Z G d d      Z G d d      Zd Zd Zy# e$ r ddlmZmZ ddlmZ ddlm
Z
 Y Mw xY w)a  !
@brief Preparation of parameters for drivers, which download it, and managing downloaded data.

List of classes:
 - wms_base::WMSBase
 - wms_base::GRASSImporter
 - wms_base::WMSDriversInfo

(C) 2012-2019 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Stepan Turek <stepan.turek seznam.cz> (Mentor: Martin Landa)
    N)ceil)Requesturlopen	HTTPError)HTTPException)r   r   )r   )CalledModuleErrorc                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
dd
Zd Zd Zd Zd Zy	)WMSBasec                 N    g | _         i | _        dd i| _        d | _        d | _        y )Nbbox)temp_files_to_cleanupparams	tile_sizetemp_maptemp_warpmapselfs    )/usr/lib/grass83/etc/r.in.wms/wms_base.py__init__zWMSBase.__init__$   s+    %'" $     c                 P    | j                   D ]  }t        j                  |        y )N)r   grass
try_remover   	temp_files     r   __del__zWMSBase.__del__.   s'     33 	(IY'	(r   c                 f    t        j                  | j                  j                  d|d|       y )N.z: )r   debug	__class____name__)r   fnmsgs      r   _debugzWMSBase._debug5   s    4>>#:#:BDEr   c           
         | j                  dd       |d   | j                  d<   t               }|j                  |d         }| j	                  |||       |d   j                         | j                  d<   dD ]"  }||   j                         | j                  |<   $ || _        | j                  d   rd| j                  d<   nd	| j                  d<   d
D ]  }||   | j                  |<    | j                  d   r| j                  d   dk(  s!| j                  d   dk(  r0| j                  d   r!t        j                  t        ddz               |d   j                         | j                  d<   |d   dk(  r;d|d   vr4|d   s/d| j                  d   v rt        j                  t        d             |j                  |d         | j                  d<   | j                  d   s| j                  d   | j                  d<   t        |d         | j                  d<   | j                  d   dk  r5d|d   vr.t        j                  t        d      | j                  d   z         |d   | j                  d<   dt        | j                  d         v rX| j                  d   dk(  rFd| j                  d<   t        j                  t        d      t        | j                  d         z         | j                  d   dk(  rd| j                  d<   nd| j                  d<   t        j                  d d!"      j                  d#      | _        | j#                  | j                         | _        t%        t'        | j                  d               | _        d | _        t        j,                  d d$d%&      }d'|j/                         v re|d'   | _        | j(                  | j*                  k7  rBt        j                  t        d(      | j(                  | j*                  | j*                  fz         t        j                  d d!t%        t'        | j                  d               )      | _        | j0                  j                  d#      | _        | j#                  | j0                        | _        | j0                  r| j                   st        j                  t        d*             |d+   | _        d,}t        |d-         }||k  rt        j                  t        d.             t        |d/         }	|	|k  rt        j                  t        d0             t        | j2                  d1   t5        | j2                  d1   t7        |      z        z        | j8                  d1<   t        | j2                  d2   t5        | j2                  d2   t7        |	      z        z        | j8                  d2<   d3| _        | j                  dd4       y )5N_initialize_parametersstarteddrivercapfile)urllayersstylesmethodoFALSEtransparentTRUE)passwordusername	urlparamsr2   r3    z8Please insert both %s and %s parameters or none of them.)r2   r3   bgcolorformatjpegignored_paramsWMSz)JPEG format does not support transparencysrsr   zInvalid EPSG code %dwms_versionCRSz1.1.1z1.3.0zYWMS version <1.3.0> will be used, because version <1.1.1> does not support <%s>projection	proj_nameSRSzg.projjf)flags
g=)rA   	delimiterepsgzNSRS differences: WMS source EPSG %s != location EPSG %s (use srs=%s to adjust))rA   rF   zUnable to get projection inforegiond   maxcolsz Maxcols must be greater than 100maxrowsz Maxrows must be greater than 100colsrowsGTifffinished)r$   r   WMSDriversInfoGetDrvProperties_checkIgnoeredParamsstriprA   r   fatal_warning	GetFormatintGetSRSParamValread_commandrstripproj_location_modifyProjstrGetEpsgsource_epsgtarget_epsgparse_commandkeysproj_srsrG   r   floatr   gdal_drv_format)
r   optionsrA   drv_infodriver_propskey
target_crsmin_tile_sizerI   rJ   s
             r   _initializeParameterszWMSBase._initializeParameters8   s7   ,i8 !( 1H!#001BC!!'5,?!(!3!9!9!;I8 	4C&s|113DKK	4 
::c?)0DKK&)/DKK&8 	,C&s|DKK	, KK
#J(?2(EKK
#r)dkk*.EKKN./ ")!3!9!9!;I H'-= >>:%4;;x+@"@a KLM ( 2 2783D EH{{8$$(KK$9DKK! !0E;;u"uLAQ4R'RKK01DKK4FFG%,]%;M"^DKK$677M*g5)0DKK&MMo !U!345 ;;}%0',DKK$',DKK$ #//ELLTR!--d.@.@Awt{{5'9:;((L
Z__&&)&1D4#3#33h '')9)94;K;KLM **Ds74;;u3E+F'G
 ,,T2((7}}D$6$6KK9:;h'gi()m#KK<=>gi()m#KK<=> "%KK$t{{6':U7^'K"LL"
v "%KK$t{{6':U7^'K"LL"
v
  ',j9r   c                      d|v r	d|vr|dz  }|S )z.!Modify proj.4 string for usage in this modulez
+nadgrids=z +wktext )r   projs     r   r\   zWMSBase._modifyProj   s"     4Jd$:JDr   c           	         g }|d   D ])  }||v s||   s|dvs|j                  d|z   dz          + t        |      dkD  r7t        j                  t	        ddj                  |      d|d	   d
             g }|d   D ]  }||   s	|j                  d|z   dz          ! t        |      dkD  r8t        j                  t	        ddj                  |      d|d	   d             yy)zO!Write warnings for set parameters and flags, which chosen driver does not use.r9   )r;   r<   r7   <>r   zThese parameter are ignored: ,z
                             r(   z( driver does not support the parameters.ignored_flagszThese flags are ignored: z# driver does not support the flags.N)appendlenr   rU   rT   join)r   rf   rA   rh   not_relevant_paramsi_paramnot_relevant_flagsi_flags           r   rQ   zWMSBase._checkIgnoeredParams   s    !#$45 	@G7"G$#CC#**3=3+>?	@ "#a'MM xx 34gh6GI  "?3 	>FV}"))#,*<=	> !"Q&MM xx 23WX5FH 'r   c                     | j                  ||       | j                         | _        | j                         | _        | j                  sy| j                          | j                  S )z!Download data from WMS server.N)rl   _computeBboxr   	_downloadr   _reprojectMapr   )r   rf   rA   s      r   GetMapzWMSBase.GetMap   sT     	""7E2%%'	(}}   r   c                 (   |d   j                         }d|v r|dz  }n|dz  }d|d   v r|dz  }nd|d   v r|dz  }n|d	|d
   z   z  }|d   r|d|d   z   z  }t        j                  d|z         	 | j                  ||d   |d         }t        j                  d       t        j                  j                               S # t        t
        f$ r}t        |t              r4|j                  dk(  r%t        j                  t        d      |d   z         nqt        d      j                  |d         }t        |d      r|dj                  |j                        z  }n|dj                  |      z  }t        j                  |       Y d}~d}~ww xY w)z&!Download capabilities from WMS serverr*   ?&WMTSr(   z2SERVICE=WMTS&REQUEST=GetCapabilities&VERSION=1.0.0OnEarthzREQUEST=GetTileServicez,SERVICE=WMS&REQUEST=GetCapabilities&VERSION=r<   r4   zFetching capabilities file.
%sr3   r2   i  z7Authorization failed to <%s> when fetching capabilitiesz1Unable to fetch capabilities from <{0}>. Reason: reasonz{0}NzFetching capabilities OK)rR   r   r   _fetchDataFromServerIOErrorr   
isinstancer   coderS   rT   r7   hasattrr   decoderead)r   rf   cap_urlcaper#   s         r   _fetchCapabilitieszWMSBase._fetchCapabilities   s   %.&&('>sNGsNGWX&&KKG'(++//G>AWWG ;sW[111G5?@	!++,gj.AC* 	./||CHHJ''' ' 	!!Y'AFFcMOPen%
 KLSSEN 1h'5<<11C5<<?*CC !	!s   1C FB5FFNc                    t        |      }|rA|r?t        j                  |d|      j                  dd      }|j	                  dd|z         	 t        |      S # t        $ r"}t        j                  d|z         Y d}~yd}~ww xY w)z!Fetch data from server:rB   r5   AuthorizationzBasic %s%sN)	r   base64encodestringreplace
add_headerr   
ValueErrorr   rS   )r   r*   r3   r2   requestbase64stringerrors          r   r   zWMSBase._fetchDataFromServer  s    #,!..(H/MNVVbL 
\0IJ	&7## 	&KKu%%	&s   
A 	B$BBc           
      D   | j                  |      }|d   j                         }|r(	 t        |d      5 }|j                  |       ddd       yt        |       y# 1 sw Y   yxY w# t        $ r/}t        j                  t        d|d|d             Y d}~Kd}~ww xY w)z!!Get capabilities from WMS servercapfile_outputwNzUnable to open file 'z'.
rB   )	r   rR   openwriter   r   rS   rT   print)r   rf   r   r   tempr   s         r   GetCapabilitieszWMSBase.GetCapabilities,  s    %%g. !1288: .#. $$JJsO$ 	c
$ >5QR s4   A' AA' A$ A' $A' '	B0%BBc                    | j                  dd       ddddd}i }| j                  | j                  k(  r,|j                         D ]  \  }}| j                  |   ||<    n|j                         D ]
  \  }}d||<    | j                         }	 t        |d      }|j                  d	| j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   fz         j                          t        j                  dd| j                  | j                  |d      }t        j                  |       |s!t        j                  t        d      dz         |j                         }t!        |      dk7  rt        j                  t        d             |D ]  }	 t#        t%        t&        |j)                  d                  }|d   s!|d   |d<   |d   |d<   |d   |d<   |d   |d<   R|d   |d   k  r	|d   |d<   n|d   |d   kD  r|d   |d<   |d   |d   k  r	|d   |d<   |d   |d   kD  s|d   |d<    | j                  dd|z         |S # t        $ r" t        j                  t        d
             Y w xY w# j                          w xY w# t*        $ r! t        j                  t        d             Y w xY w)z'!Get region extent for WMS query (bbox)r}   r'   nsr   r   )maxyminymaxxminxNz%f %f
%f %f
%f %f
%f %f
z"Unable to write data into tempfilezm.projdT)rA   proj_outproj_ininputquietz%Unable to determine region, %s failed   z$Region definition: 4 points required|z+Reprojection of region using m.proj failed.r      r   r   r   r   zfinished -> %s)r$   rc   r[   itemsrG   	_tempfiler   r   r   r   rS   rT   closerY   r   
splitlinesrv   listmaprd   splitr   )	r   bbox_region_itemsr   	bbox_itemregion_itemtemp_regiontemp_region_openedpointspoints	            r   r}   zWMSBase._computeBbox?  s   NI.%(#sCP==D...*;*A*A*C ;&	;"&++k":Y; +<*A*A*C '&	;"&Y' ..*K+%)+s%;""((2C(C(C(C(C(C(C(C(	
  #((*''**!F [)AEFQR&&(F6{aADEF ,R UEKK,<!=>E F|#(8DL#(8DL#(8DL#(8DL<%(*#(8DL&\E!H,#(8DL<%(*#(8DL&\E!H,#(8DL),, 	N$4t$;< c  EABCDE #((** " RKK"O PQRs7   BJ (K'J95J< 8J99J< <K'K;:K;c                 L   d}| j                   '| j                  | j                   | j                  k(  rd}|r| j                  | j                  k(  rd}|rt	        j
                  t        d             t	        j                         dz   | _        t        t        j                  dd            dk  rt        t        j                  d	      }nd}| j                  d
   dk(  rd}n$| j                  d
   dk(  rd}n| j                  d
   }	 | j                  dk(  rPt	        j                   ddd| j                  z  dd| j                  z  d|d| j"                  | j                  g
|      }nNt	        j                   ddd| j                  z  dd| j                  z  d|| j"                  | j                  g	|      }|j%                          |r|j+                          j,                  dk7  r!t	        j(                  t        d      dz         t	        j.                  | j"                         | j                  S | j"                  | _        | j0                  j3                  | j"                         | j                  S # t&        $ r%}t	        j(                  |ddd       Y d}~d}~ww xY w)z)!Reproject data  using gdalwarp if neededTNFzReprojecting raster...z.tifGRASS_VERBOSE2   zw+r-   nearestnearlinearbilinear   gdalwarpz-s_srsr   z-t_srsz-rz	-dstalpha)stdoutz  
This can be caused by missing z
 utility. r   	%s failed)r_   r`   rc   r[   r   messagerT   tempfiler   rW   osgetenvr   devnullr   temp_map_bands_numPopenr   waitOSErrorrS   r   
returncoder   r   remove)r   do_reprojectnuldevgdal_methodpsr   s         r   r   zWMSBase._reprojectMap  sT    (  ,  D$4$44 LDMMT-?-?? LMM!456 % 06 9D299_c23q8bjj$/{{8$	1$X&(2("kk(3%**a/&$ 4==0$ 4#5#55 '' MM --  &B" &$ 4==0$ 4#5#55 ' MM --
  &B 	 }}!AkNZ78T]]+     !%D&&--dmm<   !  IJJW s   	B=I5 5	J#>JJ#c                     t        j                         }|t        j                  t        d             | j                  j                  |       |S )z!Create temp_file and append list self.temp_files_to_cleanup
            with path of file

        @return string path to temp_file
        z Unable to create temporary files)r   r   rS   rT   r   ru   r   s     r   r   zWMSBase._tempfile  sD     NN$	KK<=> 	"")))4r   )NN)r!   
__module____qualname__r   r   r$   rl   r\   rQ   r   r   r   r   r}   r   r   rn   r   r   r
   r
   #   sL    !(Fy:v!F!.(`&&UnP!dr   r
   c                       e Zd Zd Zd Zd Zy)GRASSImporterc                 b   d| _         || _        || _        d| _        g }dddd| j                  fD ]>  }| j                  |z   }t	        j
                  |dd	      d
   s.|j                  |       @ t        |      dk7  r1t	        j                  t        d      dj                  |      z         y y )NF
_temp_MASK.red.green.blue.alphacellr   elementmapsetfiler   z}Please change output name, or change names of these rasters: %s, module needs to create this temporary maps during execution.rs   )cleanup_maskcleanup_bands
opt_outputoriginal_mask_suffixr   	find_fileru   rv   rS   rT   rw   )r   r   r   mapssuffixrasts         r   r   zGRASSImporter.__init__  s    !* % %1! x(D<U<UV 	"F??V+DtVC@HD!	"
 t9>KKS ((4.	! r   c           	      z   | j                   r	 t        j                  ddd       t        j                  | j                  | j                  z   dd      d	   r5	 | j                  | j                  z   }t        j                  d
d|dz          g }| j                  dz   }t        j                  |dd      d   r|j                  |       | j                  rQddd| j                  fD ]>  }| j                  |z   }t        j                  |dd      d   s.|j                  |       @ |r)t        j                  dddddj                  |             dt        j                  j                         v rt        j                  j                  d       t        j                   ddd| j                  z  dd      j#                  d      }t%        |      dk(  rt        j                  t        d             y |j'                  d      D ]R  }t        j(                  |d       t        j                  d|d !       t        j*                  t        d"      |z         T y # t        $ r% t        j                  t        d      dz         Y bw xY w# t        $ r% t        j                  t        d      d
z         Y ,w xY w)#Nr.maskTr)r   rA   r   r   r   r   nameg.copyz,MASKr   rasterr   r   r   r   r   g.removefbr   rs   )r   rA   typer   GRASS_REGIONzg.listz%s*)r   patternr   	separatorrB   r   z#WMS import failed, nothing imported)	overwritez	r.supportzgenerated by r.in.wms)r   descriptionz<%s> created.)r   r   run_commandr   rS   rT   r   r   r   ru   r   rw   r   environrb   poprY   rZ   rv   r   raster_historyr   )r   	mask_copyr   r   r   maplistr   s          r   r   zGRASSImporter.__del__  sO   7!!($cB
 $";";;VTW; $$2K2K KI%%hd9wCVW
 )??4<VDKK!8Wd6O6OP &/??4DVLKK%&
 $dQU
 RZZ__..JJNN>*$$T__-
 &, 	 w<1KK?@A!--, ;$$Vt<!!V9P a069:;[ % 7AkNX567 ) ;KK+ 9:;s#   I 4J *J	J	*J:9J:c           	      B   	 t        j                  dddd|| j                         t        j                  | j                  dz   dd	      d
   r| j                  dz   }n| j                  }t        j                  |      t        j                  d<   t        j                  | j                  dz   dd	      d   rt        j                  ddd	      d   r5	 | j                  | j                  z   }t        j                  ddd|z          d| _        	 t        j                  ddddd| j                  dz          | j                  sdD ]  }| j                  |z   }t        j                  |dd	      d
   s.t        j                  d|d|dz   d       t        j                  d|d|dz   d       t        j                  dd d!|dz   z  d"d#        t        j                  | j                  dz   dd	      d
   r\| j                  rO	 t        j                  d$dd| j                  dz   | j                  d%z   | j                  d&z   | j                  '       y(y(y(# t        $ r% t        j                  t        d      dz         Y dw xY w# t        $ r% t        j                  t        d      dz         Y w xY w# t        $ r% t        j                  t        d      dz         Y w xY w# t        $ r$ t        j                  t        d      d$z         Y y(w xY w))z!Import raster into GRASS.z	r.in.gdalr.   T)rA   r   r  r   outputr   r   r   r   r   r   )r   r   r   r   MASKr   zMASK,r   r   0i)r   r  maskcatsrA   r   )r   r   r   zg.renamers   _null)r   r   z	r.mapcalcz = )
expressionr   r   r   r   f)r   r   rA   r   zr.compositer   r   )r   r  redgreenbluer  N)r   r  r   r   rS   rT   r   
region_envr   r  r   r   r   )r   r   
region_mapr	  r   r   s         r   ImportMapIntoGRASSz GRASSImporter.ImportMapIntoGRASSN  s   	6 ??4??V3VCP
 61JJ%*%5%5:%F

>"
 ??4??X5vcR
 vvcB6J; $$2K2K KI%%hd7YCVW
 !%D
7!!" ??X5 %%9 F??V3DtVCHP))&,0$.!A"&
 ))'48$.'I"&
 ))&!)!%!8"%"&. OODOOf4fSQ ""<!!!"&0//H472?? #I ! 	6KK+45	64 ) ;KK+ 9:; % 7AkNX567V % <AkN]:;<sH   %I 4J (K  AK1 *JJ*J=<J= *K.-K.1*LLN)r!   r   r   r   r   r  rn   r   r   r   r     s    68;ta<r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)rO   c                 6    g d| _         g d| _        d| _        y)z.!Provides information about driver parameters.)geotifftiffpngr8   gifpng8)zimage/geotiffz
image/tiffz	image/pngz
image/jpegz	image/gifz
image/png8)rF   ogcN)f_labelsformatsr;   r   s    r   r   zWMSDriversInfo.__init__  s     J
 #r   c                     |dk(  r| j                         S d|v r| j                         S d|v r| j                         S d|v r| j                         S y)z)!Get information about driver parameters.WMS_GDALr:   r   r   N)_GDALDrvProperties_WMSProperties_WMTSProperties_OnEarthProperties)r   r(   s     r   rP   zWMSDriversInfo.GetDrvProperties  sb    Z**,,F?&&((V''))**,, r   c                 .    i }dg|d<   g d|d<   d|d<   |S )Nr.   rt   )r6   r,   r   r7   r;   r<   r9   Freq_multiple_layersrn   r   propss     r   r)  z!WMSDriversInfo._OnEarthProperties  s2    "%o#
 (-#$r   c                 *    i }dg|d<   g |d<   d|d<   |S )Nr)   r9   rt   Tr+  rn   r,  s     r   r'  zWMSDriversInfo._WMSProperties  s.    #,+!#o'+#$r   c                 .    i }dg|d<   g d|d<   d|d<   |S )Nr.   rt   )r4   r6   r<   r9   Fr+  rn   r,  s     r   r(  zWMSDriversInfo._WMTSProperties  s.    "%o"I',#$r   c                 ,    i }g |d<   g d|d<   d|d<   |S )Nrt   )r4   r6   r)   r   r3   r2   r9   Tr+  rn   r,  s     r   r&  z!WMSDriversInfo._GDALDrvProperties  s0    !#o#
 (,#$r   c                 p    || j                   v r(| j                  | j                   j                  |         S y)z<!Convert format request form to value in parameter 'format'.N)r#  r"  index)r   r7   s     r   GetFormatLabelzWMSDriversInfo.GetFormatLabel  s/    T\\!==!3!3F!;<<r   c                 p    || j                   v r(| j                  | j                   j                  |         S y)z<!Convert value in parameter 'format' to format request form.N)r"  r#  r2  )r   labels     r   rV   zWMSDriversInfo.GetFormat  s/    DMM!<< 3 3E :;;r   c                     | j                   S )zq!Get supported srs prefixes (e.g. epsg/crs)

        @todo filter according to version and driver params
        r;   r   s    r   GetSrszWMSDriversInfo.GetSrs
  s    
 xxr   N)r!   r   r   r   rP   r)  r'  r(  r&  r3  rV   r8  rn   r   r   rO   rO     s/    #$	-r   rO   c                 N    | dv rdj                  |       S dj                  |       S )zC!Decides whether to use CRS or EPSG prefix according to srs number.)T   S      z	OGC:CRS{}zEPSG:{})r7   r7  s    r   rX   rX     s.     l!!#&&$$r   c                 *    | dk(  ry| dk(  ry| dk(  ry| S )zs
    @return EPSG number
            If srs is CRS number, return EPSG number which corresponds to CRS number.
    r:  i  r;  i  r<  i  rn   r7  s    r   r^   r^     s'    
 by
by
byJr   )__doc__r   mathr   r   urllib2r   r   r   httplibr   ImportErrorurllib.requesturllib.errorhttp.clientgrass.scriptscriptr   grass.exceptionsr   objectr
   r   rO   rX   r^   rn   r   r   <module>rJ     sy     
  *33%  .Rf Rjw< w<t] ]B%G  */&)*s   A A0/A0