Ë
    xìqjö!  ã                   óä  — 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
 ddlmZ ddlmZ dd	lmZ dd
lmZmZ dededz  fd„Zdeee
f   dedz  fd„Zdeee
f   dedededef
d„Z	 	 	 d"deee
f   dedz  dedz  dedz  def
d„Zdedefd„Zdeee
f   defd„Zd„ Z	 d#d„Zd$deez  dz  deee
f   fd„Z 	 	 	 	 	 	 	 	 d%dedz  dedz  dedz  dedz  deded edeez  dz  de!fd!„Z"y)&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)Úurlretrieve)Úget_proj_endpoint)ÚBBox)Úget_data_dirÚget_user_data_dirÚcoordsÚreturnc                 ó  — 	 t        | Ž \  }}t        t        |«      t        |«      t        |«      t        |«      ¬«      S # t        $ r Y nw xY wd}| D ]©  }t        |«      }|€Œ|€|}Œt        |j                  |j                  «      |_        t        |j                  |j                  «      |_        t        |j                  |j                  «      |_        t        |j                  |j                  «      |_	        Œ« |S )z/
    Get the bounding box from coordinates
    )ÚwestÚsouthÚeastÚnorthN)
Úzipr	   ÚminÚmaxÚ
ValueErrorÚ_bbox_from_coordsr   r   r   r   )r   ÚxxxÚyyyÚ
coord_bboxÚ	coord_setÚbboxs         úG/var/www/html/truck-me/venv/lib/python3.12/site-packages/pyproj/sync.pyr   r      sÞ   € ðÜ˜�<‰ˆˆSÜœ˜S›¬¨S«¼¸C»ÌÈCËÔQÐQøÜò Ùðúà€JØò 
>ˆ	Ü  Ó+ˆØˆ<ØØÐØ‰Jä! *§/¡/°4·9±9Ó=ˆJŒOÜ" :×#3Ñ#3°T·Z±ZÓ@ˆJÔÜ" :×#3Ñ#3°T·Z±ZÓ@ˆJÔÜ! *§/¡/°4·9±9Ó=ˆJ�Oð
>ð Ðs   ‚=A  Á 	AÁAÚgeomc                 óˆ  — d| vsd| vry| d   }| d   dk7  rt        |«      S d}d}g }|D ]D  }t        |«      }|€Œ|j                  dk(  rd}n|j                  dk(  rd}|j                  |«       ŒF d}|D ]Ê  }|r-|r+|j                  dk(  rd|_        |xj                  d	z  c_        |€|}Œ7t	        |j                  |j                  «      |_        t	        |j
                  |j
                  «      |_        t        |j                  |j                  «      |_        t        |j                  |j                  «      |_        ŒÌ |S )
z4
    Get the bounding box from geojson geometry
    ÚcoordinatesÚtypeNÚMultiPolygonFéLÿÿÿTé´   éh  )r   r   r   Úappendr   r   r   r   )r   r    Úfound_minus_180Úfound_plus_180ÚbboxesÚcoordinate_setr   Ú	grid_bboxs           r   Ú_bbox_from_geomr,   -   s;  € ð ˜DÑ  F°$Ñ$6ØØ�}Ñ%€KØˆF�|�~Ò%Ü  Ó-Ð-Ø€OØ€NØ€FØ%ò ˆÜ  Ó0ˆØˆ<ØØ�9‰9˜ÒØ"‰OØ�Y‰Y˜#ÒØ!ˆNØ�‰�dÕðð €IØò 
<ˆÙ™~°$·)±)¸tÒ2CØˆDŒIØ�IŠI˜Ñ�IØÐØ‰Iä  §¡°·±Ó;ˆIŒNÜ! )§/¡/°4·:±:Ó>ˆIŒOÜ! )§/¡/°4·:±:Ó>ˆIŒOÜ  §¡°·±Ó;ˆI�Nð
<ð Ðó    Úfeaturer   Úspatial_testÚinclude_world_coveragec                 ó´  — | j                  d«      }|�Åt        |«      }|€y|j                  |j                  z
  dkD  rA|j                  |j
                  z
  dkD  r%|syt        d«       |_        t        d«      |_        nH|j                  dkD  r9|j                  dk  r*|xj                  dz  c_        |xj                  dz  c_         t        ||«      |«      S y)	zC
    Filter by the bounding box. Designed to use with 'filter'
    ÚgeometryFig  é³   Úinfr$   r#   r%   )Úgetr,   r   r   r   r   ÚfloatÚgetattr)r.   r   r/   r0   r   Ú	geom_bboxs         r   Ú_filter_bboxr9   Q   s½   € ð �;‰;�zÓ"€DØÐÜ# DÓ)ˆ	ØÐØà�N‰N˜YŸ^™^Ñ+¨cÒ1Ø—‘ )§/¡/Ñ1°CÒ7á)ØÜ# E›l˜]ˆIŒNÜ" 5›\ˆI�NØ�^‰^˜cÒ! d§i¡i°$Ò&6Ø�NŠN˜cÑ!�NØ�NŠN˜cÑ!�NØ*Œw�t˜\Ó*¨9Ó5Ð5Ør-   Ú	source_idÚarea_of_useÚfilenamec                 óä   — | j                  d«      }|sy|j                  d«      }|j                  d«      }|r|sy|du xs ||v }|du xs ||j                  dd«      v }|du xs ||v }	|r|r|	ryy)	zA
    Filter by the properties. Designed to use with 'filter'
    Ú
propertiesFÚnamer:   Nr;   Ú T)r5   )
r.   r:   r;   r<   r>   Ú
p_filenameÚp_source_idÚsource_id__matchedÚarea_of_use__matchedÚfilename__matcheds
             r   Ú_filter_propertiesrF   k   sŸ   € ð —‘˜\Ó*€JÙØØ—‘ Ó'€JØ—.‘. Ó-€KÙ™[ØØ" dÐ*ÒF¨i¸;Ð.FÐØ&¨$Ð.ò °+ÀÇÁØ�róBð 3Ðð ! DÐ(ÒB¨H¸
Ð,BÐÙÑ2Ñ7HØØr-   Ú	grid_namec                 óÚ   — t        t        «       | «      j                  «       ryt        «       j	                  t
        j                  «      D ]  }t        || «      j                  «       sŒ y y)zX
    Run through all of the PROJ directories to see if the
    file already exists.
    FT)r   r   Úexistsr
   ÚsplitÚosÚpathsep)rG   Údata_dirs     r   Ú_is_download_neededrN   …   sY   € ô
 ÔÓ Ó+×2Ñ2Ô4ØÜ “N×(Ñ(¬¯©Ó4ò ˆÜ�˜)Ó$×+Ñ+Õ-Ùðð r-   c                 óh   — | j                  d«      }|sy|j                  d«      }|syt        |«      S )zM
    Filter grids so only those that need to be downloaded are included.
    r>   Fr?   )r5   rN   )r.   r>   r<   s      r   Ú_filter_download_neededrP   ’   s7   € ð —‘˜\Ó*€JÙØØ�~‰~˜fÓ%€HÙØÜ˜xÓ(Ð(r-   c                 óø   ‡— t        j                  «       }t        | d«      5 Št        ˆfd„d«      D ]  }|j	                  |«       Œ 	 ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w)z7
    Return sha256 checksum of file given by path.
    Úrbc                  ó&   •— ‰ j                  d«      S )Ni   )Úread)Úfiles   €r   ú<lambda>z_sha256sum.<locals>.<lambda>¦   s   ø€  $§)¡)¨EÓ"2€ r-   r-   N)ÚhashlibÚsha256ÚopenÚiterÚupdateÚ	hexdigest)Ú
input_fileÚhasherÚchunkrU   s      @r   Ú
_sha256sumr`   Ÿ   sr   ø€ ô
 �^‰^Ó€FÜ	ˆj˜$Ó	ð ! 4ÜÓ2°CÓ8ò 	!ˆEØ�M‰M˜%Õ ñ	!÷!ð ×ÑÓÐ÷	!ð ×ÑÓÐús   ¢&A!Á!A9c                 ól  — |rt        d| › �«       t        ||› d�«      }	 t        | |«       |�|t        |«      k7  rt	        d|› �«      ‚|j                  t        ||«      «       	 t        j                  |«       y# t        $ r Y yw xY w# 	 t        j                  |«       w # t        $ r Y w w xY wxY w)z.
    Download resource file from PROJ url
    zDownloading: z.partNzSHA256 mismatch: )	Úprintr   r   r`   ÚRuntimeErrorÚreplacerK   ÚremoveÚFileNotFoundError)Úfile_urlÚ
short_nameÚ	directoryÚverboserX   Útmp_paths         r   Ú_download_resource_filerl   ¬   s¸   € ñ Ü�˜h˜ZÐ(Ô)Ü�I * ¨UÐ3Ó4€Hð	Ü�H˜hÔ'ØÐ &¬J°xÓ,@Ò"@ÜÐ!2°:°,Ð?Ó@Ð@Ø×Ñœ˜i¨Ó4Ô5ð	Ü�I‰I�hÕøÜ ò 	Ùð	ûð	Ü�I‰I�hÕøÜ ò 	Ùð	ýsB   ¡AB Á'A= Á=	B	ÂB	ÂB3ÂB$Â#B3Â$	B0Â-B3Â/B0Â0B3Útarget_directoryc                 ón  — | €t        d«      } t        | d«      }|j                  «       rOt        j                  «       t        j
                  |j                  «       j                  «      z
  j                  dkD  rt        t        «       › d�d| ¬«       t        j                  |j                  d¬«      «      S )zR
    Returns
    -------
    dict[str, Any]:
        The PROJ grid data list.
    Tzfiles.geojsonr   z/files.geojson)rg   rh   ri   zutf-8)Úencoding)r   r   rI   r   ÚnowÚfromtimestampÚstatÚst_mtimeÚdaysrl   r   ÚjsonÚloadsÚ	read_text)rm   Ú
local_paths     r   Ú_load_grid_geojsonry   Á   s›   € ð ÐÜ,¨TÓ2ÐÜÐ&¨Ó8€JØ×ÑÔÜ	�‰‹œ(×0Ñ0°·±Ó1B×1KÑ1KÓLÑ	L×RÑRÐUVÒVäÜ)Ó+Ð,¨NÐ;Ø&Ø&õ	
ô
 �:‰:�j×*Ñ*°GÐ*Ó<Ó=Ð=r-   Úinclude_already_downloadedc                 óî  — t        |¬«      d   }|��!|j                  dkD  rD|j                  |j                  kD  r+|xj                  dz  c_        |xj                  dz  c_        n±|j                  dk  rD|j                  |j                  kD  r+|xj                  dz  c_        |xj                  dz  c_        n^t        |j                  «      dk  rFt        |j                  «      dk  r.|j                  |j                  k  r|xj                  dz  c_        t	        t        t        |||¬«      |«      }t	        t        t        | ||¬«      |«      }|rt        |«      S t        t	        t        |«      «      S )a=  
    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: str | Path, 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.
    )rm   Úfeaturesr$   r%   r#   )r   r/   r0   )r:   r;   r<   )
ry   r   r   ÚabsÚfilterr   r9   rF   ÚtuplerP   )	r:   r;   r<   r   r/   r0   rz   rm   r|   s	            r   Úget_transform_grid_listr€   Ö   s.  € ôF "Ð3CÔDÀZÑP€HØÑØ�9‰9�sŠ?˜tŸy™y¨4¯9©9Ò4Ø�IŠI˜Ñ�IØ�IŠI˜ÑŽIØ�Y‰Y˜Ò $§)¡)¨d¯i©iÒ"7Ø�IŠI˜Ñ�IØ�IŠI˜ÑŽIÜ�—‘‹^˜cÒ!¤c¨$¯)©)£n°sÒ&:¸t¿y¹yÈ4Ï9É9Ò?TØ�IŠI˜Ñ�IÜÜÜØØ)Ø'=ô	ð ó
ˆô ÜÜØØ#Øô		
ð 	ó€Hñ "Ü�X‹ÐÜ”Ô/°Ó:Ó;Ð;r-   )NNN)FN)N)NNNNÚ
intersectsTFN)#Ú__doc__rW   ru   rK   r   Ú	functoolsr   Úpathlibr   Útypingr   Úurllib.requestr   Úpyproj._syncr   Ú
pyproj.aoir	   Úpyproj.datadirr
   r   Úlistr   ÚdictÚstrr,   Úboolr9   rF   rN   rP   r`   rl   ry   r   r€   © r-   r   ú<module>r�      sæ  ðñó Û Û 	Ý Ý Ý Ý Ý &å *Ý ß :ð˜dð  t¨d¡{ó ð0!˜$˜s C˜x™.ð !¨T°D©[ó !ðHØ�#�s�(‰^ðØ#'ðØ7:ðØTXðà	óð8 !Ø"Øñ	Ø�#�s�(‰^ðà�T‰zðð �t‘ðð �D‰jð	ð
 
óð4
 3ð 
¨4ó 
ð
) T¨#¨s¨(¡^ð 
)¸ó 
)ò
ð <@óñ*>¨¨t©°dÑ):ð >ÀdÈ3ÐPSÈ8Ánó >ð, !Ø"ØØØ$Ø#'Ø',Ø*.ñB<Ø�T‰zðB<à�t‘ðB<ð �D‰jðB<ð �‰+ð	B<ð
 ðB<ð !ðB<ð !%ðB<ð ˜D‘j 4Ñ'ðB<ð ôB<r-   