a
    1$e!                     @   s  d Z ddlZddl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
mZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ eee dddZeee
f ee dddZeee
f eeeedddZd*eee
f ee ee ee edddZeedddZeee
f edddZdd Zd+d d!Z d,eee
f d"d#d$Z!d-ee ee ee ee eeeee e"d'	d(d)Z#dS ).z
Based on the logic in the PROJ projsync CLI program

https://github.com/OSGeo/PROJ/blob/9ff543c4ffd86152bc58d0a0164b2ce9ebbb8bec/src/apps/projsync.cpp
    N)datetime)partial)Path)AnyOptional)urlretrieve)get_proj_endpoint)BBox)get_data_dirget_user_data_dir)coordsreturnc                 C   s   z.t |  \}}tt|t|t|t|dW S  ty@   Y n0 d}| D ]Z}t|}|du rd|}qJt|j|j|_t|j|j|_t|j|j|_t|j	|j	|_	qJ|S )z/
    Get the bounding box from coordinates
    )westsoutheastnorthN)
zipr	   minmax
ValueError_bbox_from_coordsr   r   r   r   )r   ZxxxZyyyZ
coord_bboxZ	coord_setbbox r   G/var/www/html/django/DPS/env/lib/python3.9/site-packages/pyproj/sync.pyr      s    "r   )geomr   c                 C   s  d| vsd| vrdS | d }| d dkr0t |S d}d}g }|D ]>}t |}|du rVq@|jdkrfd}n|jdkrtd}|| q@d}|D ]x}|r|r|jdkrd|_| jd	7  _|du r|}qt|j|j|_t|j|j|_t|j|j|_t|j|j|_q|S )
z4
    Get the bounding box from geojson geometry
    coordinatestypeNZMultiPolygonFLT   h  )r   r   r   appendr   r   r   r   )r   r   Zfound_minus_180Zfound_plus_180ZbboxesZcoordinate_setr   Z	grid_bboxr   r   r   _bbox_from_geom*   s:    

r!   )featurer   spatial_testinclude_world_coverager   c                 C   s   |  d}|durt|}|du r&dS |j|j dkrf|j|j dkrf|sNdS td |_td|_n0|jdkr|jdk r| jd	8  _| jd	8  _t|||S dS )
zC
    Filter by the bounding box. Designed to use with 'filter'
    ZgeometryNFig     infr   r   r   )getr!   r   r   r   r   floatgetattr)r"   r   r#   r$   r   Z	geom_bboxr   r   r   _filter_bboxN   s$    
r*   )r"   	source_idarea_of_usefilenamer   c           
      C   s~   |  d}|sdS | d}| d}|r.|s2dS |du p@||v }|du pX|| ddv }|du ph||v }	|rz|rz|	rzdS dS )	zA
    Filter by the properties. Designed to use with 'filter'
    
propertiesFnamer+   Nr,    T)r'   )
r"   r+   r,   r-   r.   Z
p_filenameZp_source_idZsource_id__matchedZarea_of_use__matchedZfilename__matchedr   r   r   _filter_propertiesh   s    	


r1   )	grid_namer   c                 C   s@   t t |  rdS t tjD ]}t ||  r" dS q"dS )zX
    Run through all of the PROJ directories to see if the
    file already exists.
    FT)r   r   existsr
   splitospathsep)r2   data_dirr   r   r   _is_download_needed   s    r8   )r"   r   c                 C   s,   |  d}|sdS | d}|s$dS t|S )zM
    Filter grids so only those that need to be downloaded are included.
    r.   Fr/   )r'   r8   )r"   r.   r-   r   r   r   _filter_download_needed   s    

r9   c                    s\   t  }t| d2 t fdddD ]}|| q&W d   n1 sJ0    Y  | S )z7
    Return sha256 checksum of file given by path.
    rbc                      s
     dS )Ni   )readr   filer   r   <lambda>       z_sha256sum.<locals>.<lambda>r?   N)hashlibsha256openiterupdate	hexdigest)Z
input_fileZhasherchunkr   r<   r   
_sha256sum   s
    *rG   Fc                 C   s   |rt d|   t|| d}zbt| | |durP|t|krPtd| |t|| W zt| W q ty   Y q0 n$zt| W n ty   Y n0 0 dS )z.
    Download resource file from PROJ url
    zDownloading: z.partNzSHA256 mismatch: )	printr   r   rG   RuntimeErrorreplacer5   removeFileNotFoundError)file_url
short_name	directoryverboserA   Ztmp_pathr   r   r   _download_resource_file   s     
rQ   )r   c                 C   sh   | du rt d} t| d}| r@t t| j jdkrVt	t
  dd| d t|jddS )	zR
    Returns
    -------
    dict[str, Any]:
        The PROJ grid data list.
    NTzfiles.geojsonr   z/files.geojson)rM   rN   rO   zutf-8)encoding)r   r   r3   r   utcnowfromtimestampstatst_mtimedaysrQ   r   jsonloads	read_text)target_directoryZ
local_pathr   r   r   _load_grid_geojson   s    

r\   
intersectsT)	r+   r,   r-   r   r#   r$   include_already_downloadedr[   r   c           	      C   s   t |dd }|dur|jdkrJ|j|jkrJ| jd8  _| jd8  _nj|jdk r~|j|jkr~| jd7  _| jd7  _n6t|jdk rt|jdk r|j|jk r| jd7  _ttt|||d|}ttt| ||d|}|rt|S ttt	|S )	aI  
    Get a list of transform grids that can be downloaded.

    Parameters
    ----------
    source_id: str, optional
    area_of_use: str, optional
    filename: str, optional
    bbox: BBox, optional
    spatial_test: str, default="intersects"
        Can be "contains" or "intersects".
    include_world_coverage: bool, default=True
        If True, it will include grids with a global extent.
    include_already_downloaded: bool, default=False
        If True, it will list grids regardless of if they are downloaded.
    target_directory: Union[str, Path, None], optional
        The directory to download the geojson file to.
        Default is the user writable directory.

    Returns
    -------
    list[dict[str, Any]]:
        A list of geojson data of containing information about features
        that can be downloaded.
    )r[   featuresNr   r   r   )r   r#   r$   )r+   r,   r-   )
r\   r   r   absfilterr   r*   r1   tupler9   )	r+   r,   r-   r   r#   r$   r^   r[   r_   r   r   r   get_transform_grid_list   s>    #(
	rc   )NNN)FN)N)NNNNr]   TFN)$__doc__r@   rX   r5   r   	functoolsr   pathlibr   typingr   r   urllib.requestr   Zpyproj._syncr   Z
pyproj.aoir	   Zpyproj.datadirr
   r   listr   dictstrr!   boolr*   r1   r8   r9   rG   rQ   r\   rb   rc   r   r   r   r   <module>   sf   %   
 
        