Ë
    xìqjÚû  ã                   óz  — d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZ ddl m!Z!m"Z"m#Z# dd	l$m%Z%m&Z& dd
l'm(Z( ddl)m*Z*  ejV                  dejX                  «      Z- G d„ dej\                  «      Z/d-de0de1de2fd„Z3de2de2fd„Z4de2de2fd„Z5de2de2e6z  fd„Z7de2e6z  fd„Z8dede1fd„Z9 G d„ d«      Z: G d„ de:«      Z; G d„ d e;«      Z< G d!„ d"e;«      Z= G d#„ d$e;«      Z> G d%„ d&e;«      Z? G d'„ d(e;«      Z@ G d)„ d*e;«      ZA G d+„ d,e;«      ZBy).zx
This module interfaces with PROJ to produce a pythonic interface
to the coordinate reference system (CRS) information.
é    N)ÚCallable)ÚAnyÚOptional)Ú_CRSÚ	AreaOfUseÚAuthorityMatchInfoÚAxisÚCoordinateOperationÚCoordinateSystemÚDatumÚ	EllipsoidÚPrimeMeridianÚ_load_proj_jsonÚis_projÚis_wkt)Ú!_GEOGRAPHIC_GRID_MAPPING_NAME_MAPÚ_GRID_MAPPING_NAME_MAPÚ)_INVERSE_GEOGRAPHIC_GRID_MAPPING_NAME_MAPÚ_INVERSE_GRID_MAPPING_NAME_MAPÚ_horizontal_datum_from_paramsÚ_try_list_if_string)ÚToWGS84Transformation)ÚCartesian2DCSÚEllipsoidal2DCSÚ
VerticalCS)ÚProjVersionÚ
WktVersion)ÚCRSError)ÚGeoda9  
    \+              # parameter starts with '+' character
    (?P<param>\w+)    # capture parameter name
    \=?             # match both key only and key-value parameters
    (?P<value>\S+)? # capture all characters up to next space (None if no value)
    \s*?            # consume remaining whitespace, if any
c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚCRSLocalz…
    Threading local instance for cython CRS class.

    For more details, see:
    https://github.com/pyproj4/pyproj/issues/782
    c                 ó0   •— d | _         t        ‰| �	  «        y ©N)ÚcrsÚsuperÚ__init__)ÚselfÚ	__class__s    €úJ/var/www/html/truck-me/venv/lib/python3.12/site-packages/pyproj/crs/crs.pyr&   zCRSLocal.__init__>   s   ø€ ØˆŒÜ‰ÑÕó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   Ú__classcell__©r(   s   @r)   r!   r!   6   s   ø„ ñ÷ð r*   r!   Ú
projparamsÚ
allow_jsonÚreturnc           	      óú  — t        | t        «      st        d«      ‚d| vrd| vr|rt        j                  | «      S g }| j                  «       D ]Ž  \  }}t        |t        t        f«      r(dj                  |D �cg c]  }t        |«      ‘Œ c}«      }|�t        |«      dk(  r|j                  d|› �«       Œit        |«      dk(  rŒx|j                  d|› d|› �«       Œ� t        d	j                  |«      «      S c c}w )
NzCRS input is not a dictÚprojÚinitú,ÚTrueú+ÚFalseú=ú )Ú
isinstanceÚdictr   ÚjsonÚdumpsÚitemsÚlistÚtupleÚjoinÚstrÚappendÚ_prepare_from_string)r1   r2   ÚpjargsÚkeyÚvalueÚvals         r)   Ú_prepare_from_dictrL   C   sé   € Ü�j¤$Ô'ÜÐ0Ó1Ð1à�ZÑ F°*Ñ$<ÁÜ�z‰z˜*Ó%Ð%à€FØ ×&Ñ&Ó(ò 
-‰
ˆˆUä�eœd¤E˜]Ô+Ø—H‘H°%Ö8¨3œc #�hÒ8Ó9ˆEàˆ=œC ›J¨&Ò0Ø�M‰M˜A˜c˜U˜)Õ$Ü�‹Z˜7Ò"Øà�M‰M˜A˜c˜U ! E 7Ð+Õ,ð
-ô   §¡¨Ó 0Ó1Ð1ùò 9s   Á8C8
Úin_crs_stringc                 óü  — t        j                  dd| j                  «       «      } d}| j                  |«      scg }d}| j	                  «       D ];  }|s&|j                  |«      r|j                  d|«       d}Œ+|j                  |«       Œ= dj                  |«      } d| vrd	| v r| d
z  } n| dz  } | j                  dd«      j                  «       } | j                  d«      rt        j                  dt        d¬«       | S )Nz[\s+]?=[\s+]?r;   )ú+initz+projr6   r5   Fr   Tr<   ztype=crsr9   z
 +type=crsz	 type=crsz
+init=EPSGz
+init=epsg)rO   r6   zù'+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6é   )Ú
stacklevel)ÚreÚsubÚlstripÚ
startswithÚsplitÚinsertrF   rD   ÚreplaceÚstripÚwarningsÚwarnÚFutureWarning)rM   Ústarting_paramsÚkvpairsÚfirst_item_insertedÚkvpairs        r)   Ú_prepare_from_proj_stringra   Y   s  € Ü—F‘FÐ+¨S°-×2FÑ2FÓ2HÓI€Mà8€OØ×#Ñ# OÔ4ØˆØ#ÐØ#×)Ñ)Ó+ò 	'ˆFÙ&¨F×,=Ñ,=¸oÔ,NØ—‘˜q &Ô)Ø&*Ñ#à—‘˜vÕ&ð	'ð Ÿ™ Ó)ˆð ˜Ñ&Ø�-ÑØ˜\Ñ)‰Mà˜[Ñ(ˆMð "×)Ñ)¨,¸ÓE×KÑKÓM€MØ×ÑÐ 1Ô2Ü�‰ð,ô
 Øõ	
ð Ðr*   c                 ó.  — t        | t        «      st        d«      ‚| st        d| ›�«      ‚d| v r2	 t        j                  | d¬«      }|st        d«      ‚t        |«      } | S t        | «      rt        | «      } | S # t
        $ r}t        d«      |‚d }~ww xY w)NzCRS input is not a stringz CRS string is empty or invalid: ú{F)Ústrictz'CRS appears to be JSON but is not validzCRS is empty JSON)	r=   rE   r   r?   ÚloadsÚ
ValueErrorrL   r   ra   )rM   Úcrs_dictÚerrs      r)   rG   rG      s¬   € Ü�m¤SÔ)ÜÐ2Ó3Ð3ÙÜÐ9¸-Ð9JÐKÓLÐLØ
ˆmÑð	OÜ—z‘z -¸Ô>ˆHñ ÜÐ.Ó/Ð/Ü*¨8Ó4ˆð Ðô 
�Ô	Ü1°-Ó@ˆØÐøô ò 	OÜÐDÓEÈ3ÐNûð	Oús   ±A: Á:	BÂBÂBÚ	auth_nameÚ	auth_codec                 ó   — | › d|› �S )Nú:© )ri   rj   s     r)   Ú_prepare_from_authorityrn   “   s   € Øˆ[˜˜)˜Ð%Ð%r*   c                 ó   — t        d| «      S )NÚEPSG)rn   ©rj   s    r)   Ú_prepare_from_epsgrr   —   s   € Ü" 6¨9Ó5Ð5r*   c                 ó    — t        | t        «      ryt        | t        «      r| j                  «       ryt	        | d«      r| j
                  dk(  ryy)NTÚshaperm   F)r=   ÚintrE   Ú	isnumericÚhasattrrt   rq   s    r)   Ú_is_epsg_coderx   ›   sB   € Ü�)œSÔ!ØÜ�)œSÔ! i×&9Ñ&9Ô&;ØÜˆy˜'Ô" y§¡¸"Ò'<ØØr*   c                   óö  — e Zd ZdZdZdedz  ddfd„Zed„ «       Zede	de	e
z  dd fd	„«       Zede	e
z  dd fd
„«       Zede	dd fd„«       Zede	dd fd„«       Zede	dd fd„«       Zde	fd„Zededd fd„«       Zdedz  fd„Zededd fd„«       Zede	dd fd„«       Zededd fd„«       Zdefd„Zej4                  dfdee	z  dedefd„Ze	 	 	 d[d ed!edz  d"edz  d#edz  dd f
d$„«       Zdee   fd%„Z d&edefd'„Z!d\d&ed(edefd)„Z"ede#d    fd*„«       Z$ede#d    fd+„«       Z%ede#d    fd,„«       Z&eded    fd-„«       Z'ede	dz  fd.„«       Z(ede	fd/„«       Z)ede	fd0„«       Z*edee+   fd1„«       Z,ede-dz  fd2„«       Z.ede/dz  fd3„«       Z0ede1dz  fd4„«       Z2ede3dz  fd5„«       Z4ede5dz  fd6„«       Z6ede7dz  fd7„«       Z8ede	fd8„«       Z9ede	fd9„«       Z:ej4                  ddfd:ee	z  d;ed<edz  de	fd=„Z;d]d;ed>e
de	fd?„Z<defd@„Z=e>j~                  fd:e>e
z  de	fdA„Z@d^dBe
de
dz  fdC„ZAd_de	dz  dBe
fdD„ZB	 d_de	dz  dBe
deeC   fdE„ZDdZdFe	dz  dd fdG„ZEdZdFe	dz  dd fdH„ZFedefdI„«       ZGedefdJ„«       ZHedefdK„«       ZIedefdL„«       ZJedefdM„«       ZKedefdN„«       ZLedefdO„«       ZMedP„ «       ZNedefdQ„«       ZOded    fdR„ZPd&eQdefdS„ZRdee	e	f   fdT„ZSdUee	ef   fdV„ZTde
fdW„ZUde	fdX„ZVde	fdY„ZWy)`ÚCRSa/  
    A pythonic Coordinate Reference System manager.

    .. versionadded:: 2.0.0

    See: :c:func:`proj_create`

    The functionality is based on other fantastic projects:

    * `rasterio <https://github.com/mapbox/rasterio/blob/c13f0943b95c0eaa36ff3f620bd91107aa67b381/rasterio/_crs.pyx>`_
    * `opendatacube <https://github.com/opendatacube/datacube-core/blob/83bae20d2a2469a6417097168fd4ede37fd2abe5/datacube/utils/geometry/_base.py>`_

    Attributes
    ----------
    srs: str
        The string form of the user input used to create the CRS.

    Nr1   r3   c                 ó¢  — d}|rÄt        |t        «      r|j                  }n§t        |«      rt	        |«      }n�t        |t
        «      rt        |«      }ntt        |t        «      rt        |«      }nXt        |t        t        f«      rt        |«      dk(  r	t        |Ž }n+t        |d«      r|j                  «       }nt        d|›�«      ‚|r)t        |d¬«      }t        dj!                  ||f«      «      }|| _        t#        «       | _        t        |t        «      r|| j$                  _        yt        | j                  «      | j$                  _        y)	u…  
        Initialize a CRS class instance with:
          - PROJ string
          - Dictionary of PROJ parameters
          - PROJ keyword arguments for parameters
          - JSON string with PROJ parameters
          - CRS WKT string
          - An authority string [i.e. 'epsg:4326']
          - An EPSG integer code [i.e. 4326]
          - A tuple of ("auth_name": "auth_code") [i.e ('epsg', '4326')]
          - An object with a `to_wkt` method.
          - A :class:`pyproj.crs.CRS` class

        Example usage:

        >>> from pyproj import CRS
        >>> crs_utm = CRS.from_user_input(26915)
        >>> crs_utm
        <Projected CRS: EPSG:26915>
        Name: NAD83 / UTM zone 15N
        Axis Info [cartesian]:
        - E[east]: Easting (metre)
        - N[north]: Northing (metre)
        Area of Use:
        - name: North America - 96Â°W to 90Â°W and NAD83 by country
        - bounds: (-96.0, 25.61, -90.0, 84.0)
        Coordinate Operation:
        - name: UTM zone 15N
        - method: Transverse Mercator
        Datum: North American Datum 1983
        - Ellipsoid: GRS 1980
        - Prime Meridian: Greenwich
        <BLANKLINE>
        >>> crs_utm.area_of_use.bounds
        (-96.0, 25.61, -90.0, 84.0)
        >>> crs_utm.ellipsoid
        ELLIPSOID["GRS 1980",6378137,298.257222101,
            LENGTHUNIT["metre",1],
            ID["EPSG",7019]]
        >>> crs_utm.ellipsoid.inverse_flattening
        298.257222101
        >>> crs_utm.ellipsoid.semi_major_metre
        6378137.0
        >>> crs_utm.ellipsoid.semi_minor_metre
        6356752.314140356
        >>> crs_utm.prime_meridian
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8901]]
        >>> crs_utm.prime_meridian.unit_name
        'degree'
        >>> crs_utm.prime_meridian.unit_conversion_factor
        0.017453292519943295
        >>> crs_utm.prime_meridian.longitude
        0.0
        >>> crs_utm.datum
        DATUM["North American Datum 1983",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]],
            ID["EPSG",6269]]
        >>> crs_utm.coordinate_system
        CS[Cartesian,2],
            AXIS["(E)",east,
                ORDER[1],
                LENGTHUNIT["metre",1,
                    ID["EPSG",9001]]],
            AXIS["(N)",north,
                ORDER[2],
                LENGTHUNIT["metre",1,
                    ID["EPSG",9001]]]
        >>> print(crs_utm.coordinate_operation.to_wkt(pretty=True))
        CONVERSION["UTM zone 15N",
            METHOD["Transverse Mercator",
                ID["EPSG",9807]],
            PARAMETER["Latitude of natural origin",0,
                ANGLEUNIT["degree",0.0174532925199433],
                ID["EPSG",8801]],
            PARAMETER["Longitude of natural origin",-93,
                ANGLEUNIT["degree",0.0174532925199433],
                ID["EPSG",8802]],
            PARAMETER["Scale factor at natural origin",0.9996,
                SCALEUNIT["unity",1],
                ID["EPSG",8805]],
            PARAMETER["False easting",500000,
                LENGTHUNIT["metre",1],
                ID["EPSG",8806]],
            PARAMETER["False northing",0,
                LENGTHUNIT["metre",1],
                ID["EPSG",8807]],
            ID["EPSG",16015]]
        >>> crs = CRS(proj='utm', zone=10, ellps='WGS84')
        >>> print(crs.to_wkt(pretty=True))
        PROJCRS["unknown",
            BASEGEOGCRS["unknown",
                DATUM["Unknown based on WGS84 ellipsoid",
                    ELLIPSOID["WGS 84",6378137,298.257223563,
                        LENGTHUNIT["metre",1],
                        ID["EPSG",7030]]],
                PRIMEM["Greenwich",0,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8901]]],
            CONVERSION["UTM zone 10N",
                METHOD["Transverse Mercator",
                    ID["EPSG",9807]],
                PARAMETER["Latitude of natural origin",0,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8801]],
                PARAMETER["Longitude of natural origin",-123,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8802]],
                PARAMETER["Scale factor at natural origin",0.9996,
                    SCALEUNIT["unity",1],
                    ID["EPSG",8805]],
                PARAMETER["False easting",500000,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8806]],
                PARAMETER["False northing",0,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8807]],
                ID["EPSG",16010]],
            CS[Cartesian,2],
                AXIS["(E)",east,
                    ORDER[1],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]],
                AXIS["(N)",north,
                    ORDER[2],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]]]
        >>> geod = crs.get_geod()
        >>> f"+a={geod.a:.0f} +f={geod.f:.8f}"
        '+a=6378137 +f=0.00335281'
        >>> crs.is_projected
        True
        >>> crs.is_geographic
        False
        Ú rP   Úto_wktzInvalid CRS input: F)r2   r<   N)r=   r   Úsrsrx   rr   rE   rG   r>   rL   rB   rC   Úlenrn   rw   r}   r   rD   r!   Ú_localr$   )r'   r1   ÚkwargsÚ
projstringÚ
projkwargss        r)   r&   zCRS.__init__¹   s  € ðT ˆ
áÜ˜*¤dÔ+Ø'Ÿ^™^‘
Ü˜zÔ*Ü/°
Ó;‘
Ü˜J¬Ô,Ü1°*Ó=‘
Ü˜J¬Ô-Ü/°
Ó;‘
Ü˜J¬¬u¨Ô6¼3¸z»?ÈaÒ;OÜ4°jÐA‘
Ü˜ XÔ.Ø'×.Ñ.Ó0‘
äÐ!4°Z°NÐCÓDÐDáÜ+¨F¸uÔEˆJÜ-¨c¯h©h¸
ÀJÐ7OÓ.PÓQˆJàˆŒÜ“jˆŒÜ�j¤$Ô'Ø(ˆD�K‰K�Oä" 4§8¡8›nˆD�K‰K�Or*   c                 ó¢   — | j                   j                  €$t        | j                  «      | j                   _        | j                   j                  S )zH
        Retrieve the Cython based _CRS object for this thread.
        )r€   r$   r   r~   ©r'   s    r)   Ú_crszCRS._crs`  s3   € ð
 �;‰;�?‰?Ð"Ü" 4§8¡8›nˆD�K‰KŒOØ�{‰{�‰Ðr*   ri   Úcodec                 ó8   — | j                  t        ||«      «      S )a?  
        .. versionadded:: 2.2.0

        Make a CRS from an authority name and authority code

        Parameters
        ----------
        auth_name: str
            The name of the authority.
        code : int or str
            The code used by the authority.

        Returns
        -------
        CRS
        )Úfrom_user_inputrn   )Úclsri   r‡   s      r)   Úfrom_authorityzCRS.from_authorityi  s   € ð$ ×"Ñ"Ô#:¸9ÀdÓ#KÓLÐLr*   c                 ó6   — | j                  t        |«      «      S )z­Make a CRS from an EPSG code

        Parameters
        ----------
        code : int or str
            An EPSG code.

        Returns
        -------
        CRS
        )r‰   rr   )rŠ   r‡   s     r)   Ú	from_epsgzCRS.from_epsg}  s   € ð ×"Ñ"Ô#5°dÓ#;Ó<Ð<r*   Úin_proj_stringc                 óh   — t        |«      st        d|› �«      ‚| j                  t        |«      «      S )zÜ
        .. versionadded:: 2.2.0

        Make a CRS from a PROJ string

        Parameters
        ----------
        in_proj_string : str
            A PROJ string.

        Returns
        -------
        CRS
        zInvalid PROJ string: )r   r   r‰   ra   )rŠ   rŽ   s     r)   Ú
from_proj4zCRS.from_proj4Œ  s7   € ô  �~Ô&ÜÐ2°>Ð2BÐCÓDÐDØ×"Ñ"Ô#<¸^Ó#LÓMÐMr*   Úin_wkt_stringc                 óh   — t        |«      st        d|› �«      ‚| j                  t        |«      «      S )zÙ
        .. versionadded:: 2.2.0

        Make a CRS from a WKT string

        Parameters
        ----------
        in_wkt_string : str
            A WKT string.

        Returns
        -------
        CRS
        zInvalid WKT string: )r   r   r‰   rG   )rŠ   r‘   s     r)   Úfrom_wktzCRS.from_wkt   s6   € ô  �mÔ$ÜÐ1°-°ÐAÓBÐBØ×"Ñ"Ô#7¸Ó#FÓGÐGr*   rM   c                 ó6   — | j                  t        |«      «      S )az  
        Make a CRS from:

        Initialize a CRS class instance with:
         - PROJ string
         - JSON string with PROJ parameters
         - CRS WKT string
         - An authority string [i.e. 'epsg:4326']

        Parameters
        ----------
        in_crs_string : str
            An EPSG, PROJ, or WKT string.

        Returns
        -------
        CRS
        )r‰   rG   )rŠ   rM   s     r)   Úfrom_stringzCRS.from_string´  s   € ð( ×"Ñ"Ô#7¸Ó#FÓGÐGr*   c                 ód   — | j                  d¬«      }|rdj                  |«      S | j                  S )a  
        .. versionadded:: 2.2.0

        Convert the CRS to a string.

        It attempts to convert it to the authority string.
        Otherwise, it uses the string format of the user
        input to create the CRS.

        Returns
        -------
        str
        éd   ©Úmin_confidencerl   )Úto_authorityrD   r~   )r'   Ú	auth_infos     r)   Ú	to_stringzCRS.to_stringÊ  s2   € ð ×%Ñ%°SÐ%Ó9ˆ	ÙØ—8‘8˜IÓ&Ð&Ø�x‰xˆr*   rJ   c                 ó0   — t        || «      r|S  | |fi |¤ŽS ©a†  
        Initialize a CRS class instance with:
          - PROJ string
          - Dictionary of PROJ parameters
          - PROJ keyword arguments for parameters
          - JSON string with PROJ parameters
          - CRS WKT string
          - An authority string [i.e. 'epsg:4326']
          - An EPSG integer code [i.e. 4326]
          - A tuple of ("auth_name": "auth_code") [i.e ('epsg', '4326')]
          - An object with a `to_wkt` method.
          - A :class:`pyproj.crs.CRS` class

        Parameters
        ----------
        value : obj
            A Python int, dict, or str.

        Returns
        -------
        CRS
        )r=   )rŠ   rJ   r�   s      r)   r‰   zCRS.from_user_inputÝ  s#   € ô0 �e˜SÔ!ØˆLÙ�5Ñ#˜FÑ#Ð#r*   c                 ó°   — | j                   €yt        | j                   j                  | j                   j                  | j                   j                  ¬«      S )zs
        Returns
        -------
        pyproj.geod.Geod:
            Geod object based on the ellipsoid.
        N)ÚaÚrfÚb)Ú	ellipsoidr   Úsemi_major_metreÚinverse_flatteningÚsemi_minor_metrer…   s    r)   Úget_geodzCRS.get_geodù  sE   € ð �>‰>Ð!ØÜØ�n‰n×-Ñ-Ø�~‰~×0Ñ0Ø�n‰n×-Ñ-ô
ð 	
r*   Ú	proj_dictc                 ó6   — | j                  t        |«      «      S )z÷
        .. versionadded:: 2.2.0

        Make a CRS from a dictionary of PROJ parameters.

        Parameters
        ----------
        proj_dict : str
            PROJ params in dict format.

        Returns
        -------
        CRS
        )r‰   rL   )rŠ   r¨   s     r)   Ú	from_dictzCRS.from_dict  s   € ð  ×"Ñ"Ô#5°iÓ#@ÓAÐAr*   Úcrs_jsonc                 ó6   — | j                  t        |«      «      S )zÜ
        .. versionadded:: 2.4.0

        Create CRS from a CRS JSON string.

        Parameters
        ----------
        crs_json: str
            CRS JSON string.

        Returns
        -------
        CRS
        )r‰   r   )rŠ   r«   s     r)   Ú	from_jsonzCRS.from_json  s   € ð  ×"Ñ"¤?°8Ó#<Ó=Ð=r*   rg   c                 óJ   — | j                  t        j                  |«      «      S )zÜ
        .. versionadded:: 2.4.0

        Create CRS from a JSON dictionary.

        Parameters
        ----------
        crs_dict: dict
            CRS dictionary.

        Returns
        -------
        CRS
        )r‰   r?   r@   )rŠ   rg   s     r)   Úfrom_json_dictzCRS.from_json_dict,  s   € ð  ×"Ñ"¤4§:¡:¨hÓ#7Ó8Ð8r*   c                 óº   — | j                  «       }|€i S d„ }i }t        j                  |«      D ])  }|j                  «       \  }}|� ||«      }|dusŒ%|||<   Œ+ |S )a¶  
        .. versionadded:: 2.2.0

        Converts the CRS to dictionary of PROJ parameters.

        .. warning:: You will likely lose important projection
          information when converting to a PROJ string from
          another format. See: https://proj.org/faq.html#what-is-the-best-format-for-describing-coordinate-reference-systems

        Returns
        -------
        dict:
            PROJ params in dict format.

        c                 óÒ   — | j                  «       dk(  ry| j                  «       dk(  ry	 t        | «      S # t        $ r Y nw xY w	 t        | «      S # t        $ r Y t	        | «      S w xY w)NÚtrueTÚfalseF)Úlowerru   rf   Úfloatr   )rK   s    r)   Ú_parsezCRS.to_dict.<locals>._parseS  sp   € Ø�y‰y‹{˜fÒ$ØØ�y‰y‹{˜gÒ%ØðÜ˜3“x�øÜò ÙðúðÜ˜S“zÐ!øÜò ØÜ& sÓ+Ð+ðús!   ª
5 µ	AÁ AÁ
A Á	A&Á%A&F)Úto_proj4Ú_RE_PROJ_PARAMÚfinditerÚgroups)r'   Úproj_stringr¶   r¨   ÚparamrI   rJ   s          r)   Úto_dictzCRS.to_dict>  sw   € ð" —m‘m“oˆØÐØˆIò	,ð ˆ	Ü#×,Ñ,¨[Ó9ò 	'ˆEØŸ™›‰JˆC�ØÐ Ù˜u›�Ø˜EÒ!Ø!&�	˜#’ð	'ð Ðr*   FÚwkt_versionÚerrcheckc                 óê  — d| j                  |«      i}| j                  rˆ| j                  r|| j                  j                  rf| j                  rZ| j                  j                  ||¬«      }|j                  d«       |j                  |«       | j                  j                  |d<   |S | j                  rH| j                  D ]7  }|j                  ||¬«      }|j                  d«       |j                  |«       Œ9 |S | j                  rF| j                  «       }d|v r|d   d   |d<   | j                  r| j                  j                  |d<   |S | j                  ri|j                  | j                  j                  | j                  j                   | j                  j"                  ¬«       | j                  j                  |d	<   | j$                  r2| j$                  j&                  |d
<   | j$                  j                  |d<   | j(                  rR| j(                  j                  |d<   | j(                  j                  r#| j(                  j                  j                  |d<   | j*                  r½| j                  rª| j                  j,                  j/                  «       t0        vr5|r,t3        j4                  d| j                  j,                  › �«       d|d   iS |j                  t1        | j                  j,                  j/                  «          | j                  «      «       |S d|d<   |S d}| j                  s'| j6                  r| j                  }| j                  |d<   |sdn)|j,                  j/                  «       j9                  dd«      }|t:        vrC|r:|r#t3        j4                  d|j,                  › �«       nt3        j4                  d«       d|d   iS |j                  t;        |   |«      «       |S )aS  
        .. versionadded:: 2.2.0

        This converts a :obj:`pyproj.crs.CRS` object
        to a Climate and Forecast (CF) Grid Mapping Version 1.8 dict.

        :ref:`build_crs_cf`

        Parameters
        ----------
        wkt_version: str or pyproj.enums.WktVersion
            Version of WKT supported by CRS.to_wkt.
            Default is :attr:`pyproj.enums.WktVersion.WKT2_2019`.
        errcheck: bool, default=False
            If True, will warn when parameters are ignored.

        Returns
        -------
        dict:
            CF-1.8 version of the projection.

        Úcrs_wkt)r¾   r¿   Útowgs84Úgeoid_modelÚnameÚ
geoid_nameÚgeopotential_datum_name)Úsemi_major_axisÚsemi_minor_axisr¥   Úreference_ellipsoid_nameÚlongitude_of_prime_meridianÚprime_meridian_nameÚgeographic_crs_nameÚhorizontal_datum_namez"Unsupported coordinate operation: Úlatitude_longitudeÚgrid_mapping_nameNÚprojected_crs_namer<   Ú_zCoordinate operation not found.)r}   Úis_boundÚcoordinate_operationrÂ   Ú
source_crsÚto_cfÚpopÚupdateÚis_compoundÚsub_crs_listÚis_verticalÚto_json_dictÚdatumrÄ   r£   r¤   r¦   r¥   Úprime_meridianÚ	longitudeÚgeodetic_crsÚis_geographicÚmethod_namer´   r   rZ   r[   Úis_projectedrX   r   )	r'   r¾   r¿   Úcf_dictÚsub_cfÚsub_crsÚ	vert_jsonrÓ   Úcoordinate_operation_names	            r)   rÕ   z	CRS.to_cfl  s®  € ð8 $-¨d¯k©k¸+Ó.FÐ"Gˆð �MŠMØ×)Ò)Ø×)Ñ)×1Ò1Ø—’à%)§_¡_×%:Ñ%:Ø'Ø!ð &;ó &ˆFð �J‰J�yÔ!Ø�N‰N˜6Ô"Ø!%×!:Ñ!:×!BÑ!BˆG�IÑØˆNð ×ÒØ×,Ñ,ò '�Ø Ÿ™°;È˜ÓR�Ø—
‘
˜9Ô%Ø—‘˜vÕ&ð'ð ˆNð ×ÒØ×)Ñ)Ó+ˆIØ 	Ñ)Ø(1°-Ñ(@ÀÑ(H�˜Ñ%Ø�zŠzØ59·Z±Z·_±_�Ð1Ñ2ØˆNð �>Š>Ø�N‰NØ $§¡× ?Ñ ?Ø $§¡× ?Ñ ?Ø#'§>¡>×#DÑ#Dð ô ð
 37·.±.×2EÑ2EˆGÐ.Ñ/Ø×ÒØ59×5HÑ5H×5RÑ5RˆGÐ1Ñ2Ø-1×-@Ñ-@×-EÑ-EˆGÐ)Ñ*ð ×ÒØ-1×->Ñ->×-CÑ-CˆGÐ)Ñ*Ø× Ñ ×&Ò&Ø37×3DÑ3D×3JÑ3J×3OÑ3O�Ð/Ñ0à×ÒØ×(Ò(à×-Ñ-×9Ñ9×?Ñ?ÓAÜDñEñ  Ü Ÿ™Ø@Ø#×8Ñ8×DÑDÐEðGôð & w¨yÑ'9Ð:Ð:Ø—‘Ü=Ø×1Ñ1×=Ñ=×CÑCÓEñà×/Ñ/ó1ôð ˆNð 0D�Ð+Ñ,ØˆNð  $ÐØ�}Š} ×!2Ò!2Ø#'×#<Ñ#<Ð Ø,0¯I©IˆGÐ(Ñ)ñ (ñ à%×1Ñ1×7Ñ7Ó9×AÑAÀ#ÀsÓKð 	"ð
 %Ô,JÑJÙÙ'Ü—M‘MØ<Ø/×;Ñ;Ð<ð>õô
 —M‘MÐ"CÔDà˜w yÑ1Ð2Ð2à�‰Ü*Ð+DÑEØ$óô	
ð
 ˆr*   Úin_cfÚellipsoidal_csÚcartesian_csÚvertical_csc                 óš  — d}d| v rt        | d   «      S d| v rt        | d   «      S | j                  d«      }|€t        d«      ‚t        | «      }	 t        |   }| j                  d«      }|rt        |xs d||¬	«      }	na|rS||vrOt        |«      }	|�N|	j                  «       }
t        j                  |«      j                  «       |
d
<   t        |
«      }	nt        |¬«      }	|dk(  r|	S |�t        |	 || «      |¬«      S 	 t        |   }t        | j                  dd«       || «      |	|¬«      }d}d| v r.t        |dt        |j                  gt!        | d   «      ¢­Ž ¬«      }d| vr|xs |S t#        d| d   | j                  d«      |¬«      }t%        d|xs ||g¬«      S # t
        $ r d}Y �ŒSw xY w# t
        $ r t        d|› �«      d‚w xY w)a�  
        .. versionadded:: 2.2.0

        .. versionadded:: 3.0.0 ellipsoidal_cs, cartesian_cs, vertical_cs

        This converts a Climate and Forecast (CF) Grid Mapping Version 1.8
        dict to a :obj:`pyproj.crs.CRS` object.

        :ref:`build_crs_cf`

        Parameters
        ----------
        in_cf: dict
            CF version of the projection.
        ellipsoidal_cs: Any, optional
            Input to create an Ellipsoidal Coordinate System.
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or an Ellipsoidal Coordinate System created from :ref:`coordinate_system`.
        cartesian_cs: Any, optional
            Input to create a Cartesian Coordinate System.
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or :class:`pyproj.crs.coordinate_system.Cartesian2DCS`.
        vertical_cs: Any, optional
            Input to create a Vertical Coordinate System accepted by
            :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or :class:`pyproj.crs.coordinate_system.VerticalCS`

        Returns
        -------
        CRS
        )ÚunknownÚ	undefinedrÁ   Úspatial_refrÏ   Nz4CF projection parameters missing 'grid_mapping_name'rÌ   rî   )rÄ   rÜ   ré   Úcoordinate_system)ré   rÎ   )Úbase_crsÚ
conversionré   zUnsupported grid mapping name: rÐ   )rÄ   rò   rß   rê   rÂ   zWGS 84)rÔ   Ú
target_crsÚtransformationrÆ   rÅ   )rÄ   rÜ   rÃ   rë   )rÄ   Ú
components)rz   Úgetr   r   r   ÚKeyErrorÚGeographicCRSrÛ   r   r‰   ÚDerivedGeographicCRSr   ÚProjectedCRSÚBoundCRSr   rß   r   ÚVerticalCRSÚCompoundCRS)rè   ré   rê   rë   Úunknown_namesrÏ   rÜ   Úgeographic_conversion_methodrÌ   Úgeographic_crsÚgeographic_crs_jsonÚconversion_methodÚprojected_crsÚ	bound_crsÚvertical_crss                  r)   Úfrom_cfzCRS.from_cfï  sY  € ðP 1ˆØ˜ÑÜ�u˜YÑ'Ó(Ð(Ø˜EÑ!Ü�u˜]Ñ+Ó,Ð,à!ŸI™IÐ&9Ó:ÐØÐ$ÜÐQÓRÐRô .¨eÓ4ˆð	0ä1Ð2CÑDð )ð $Ÿi™iÐ(=Ó>ÐÙÜ"/Ø(Ò7¨KØØ-ô#‰Nñ
 !Ð%8ÀÑ%MÜ Ð!4Ó5ˆNØÐ)Ø&4×&AÑ&AÓ&CÐ#ä$×4Ñ4°^ÓD×QÑQÓSð $Ð$7Ñ8ô "%Ð%8Ó!9‘ä*¸.ÔIˆNØÐ 4Ò4Ø!Ð!Ø'Ð3Ü'Ø'Ù7¸Ó>Ø-ôð ð	Ü 6Ð7HÑ IÐô
 %Ø—‘Ð/°Ó=Ù(¨Ó/Ø'Ø%ô	
ˆð ˆ	Ø˜ÑÜ Ø(Ø#Ü4Ø!×.Ñ.ð Ü1DÀUÈ9ÑEUÓ1Vò ôˆIð %¨EÑ1ØÒ- Ð-ô #ØØÐ1Ñ2ØŸ	™	 ,Ó/Ø#ô	
ˆô Ø¨)Ò*D°}ÀlÐ)Sô
ð 	
øôC ò 	0Ø+/Ó(ð	0ûô@ ò 	ÜØ1Ð2CÐ1DÐEóàðð	ús   Á	F Ã?	F1 ÆF.Æ-F.Æ1G
c                 óú  — g }d„ }| j                   dk(  �r| j                  rõ| j                  j                  «       }|j                  dd«      j	                  «       j                  d«      }t        |«      dk(  r|› d�}| j                  d   }d	d	|j                  d
d«      j                  «       j                  dd«      ddœ}|j                  j                  «       j                  d
d«      j	                  «       }|r
|› d|› �|d<   |j                  |«       | j                  r3|j                  | j                  j                   || «      ¬«      «       |S | j                  ri| j                   r]| j                   j                  rG|j                  | j                   j                  j                   || j                   «      ¬«      «       |S | j"                  D ]!  }|j                  |j%                  «       «       Œ# |S )a1  
        .. versionadded:: 3.0.0

        This converts all coordinate systems (cs) in the CRS
        to a list of Climate and Forecast (CF) Version 1.8 dicts.

        :ref:`build_crs_cf`

        Returns
        -------
        list[dict]:
            CF-1.8 version of the coordinate systems.
        c                 ó’   — 	 | j                   xr* | j                   j                  j                  «       t        v S # t        $ r Y yw xY w)NF)rÓ   rá   r´   r   r÷   )r$   s    r)   Úrotated_polez"CRS.cs_to_cf.<locals>.rotated_pole~  sP   € ðà×,Ñ,ò AØ×0Ñ0×<Ñ<×BÑBÓDÜ@ðAðøô
 ò Ùðús   ‚7: º	AÁAzTemporal CRSÚtime_originz
1875-05-20ÚzZé   z-01-01r   ÚtimeÚcalendarÚproleptic_gregorianr<   rÑ   ÚT)Ústandard_nameÚ	long_namer  Úaxisr|   z since Úunits)r	  )Ú	type_namerÜ   rÛ   rö   rY   Úrstripr   Ú	axis_infor´   rX   Ú	unit_namerF   rð   ÚextendrÕ   rÒ   rÔ   rÙ   Úcs_to_cf)	r'   Úcf_axis_listr	  Ú
datum_jsonÚoriginr  Úcf_temporal_axisr  rå   s	            r)   r  zCRS.cs_to_cfn  sÍ  € ð ˆò	ð �>‰>˜^Ó+°·
²
ØŸ™×0Ñ0Ó2ˆJØ—^‘^ M°<Ó@×FÑFÓH×OÑOÐPTÓUˆFÜ�6‹{˜aÒØ"˜8 6Ð*�Ø—>‘> !Ñ$ˆDà!'Ø#à—N‘N :Ð/DÓEß‘U“Wß‘W˜S #Ó&àñ	 Ðð Ÿ™×,Ñ,Ó.×6Ñ6°zÀ2ÓF×LÑLÓNˆIáØ/8¨k¸ÀÀÐ,IÐ  Ñ)Ø×ÑÐ 0Ô1Ø×!Ò!Ø×ÑØ×&Ñ&×,Ñ,¹,ÀtÓ:LÐ,ÓMôð Ðð �]Š]˜tŸš°4·?±?×3TÒ3TØ×ÑØ—‘×1Ñ1×7Ñ7Ù!-¨d¯o©oÓ!>ð 8ó ôð Ðð  ×,Ñ,ò 8�Ø×#Ñ# G×$4Ñ$4Ó$6Õ7ð8àÐr*   Úotherc                 ó–   — 	 t         j                  |«      }| j                  j	                  |j                  «      S # t        $ r Y yw xY w)ab  
        Check if the CRS objects are the exact same.

        Parameters
        ----------
        other: Any
            Check if the other CRS is the exact same to this object.
            If the other object is not a CRS, it will try to create one.
            On Failure, it will return False.

        Returns
        -------
        bool
        F)rz   r‰   r   r†   Úis_exact_same©r'   r  s     r)   r!  zCRS.is_exact_same¬  sF   € ð	Ü×'Ñ'¨Ó.ˆEð �y‰y×&Ñ& u§z¡zÓ2Ð2øô ò 	Ùð	ús   ‚< ¼	AÁAÚignore_axis_orderc                 óš   — 	 t         j                  |«      }| j                  j	                  |j                  |¬«      S # t        $ r Y yw xY w)aü  

        .. versionadded:: 2.5.0

        Check if the CRS objects are equivalent.

        Parameters
        ----------
        other: Any
            Check if the other object is equivalent to this object.
            If the other object is not a CRS, it will try to create one.
            On Failure, it will return False.
        ignore_axis_order: bool, default=False
            If True, it will compare the CRS class and ignore the axis order.

        Returns
        -------
        bool
        F)r#  )rz   r‰   r   r†   Úequals)r'   r  r#  s      r)   r%  z
CRS.equalsÁ  sL   € ð(	Ü×'Ñ'¨Ó.ˆEð �y‰y×Ñ §
¡
Ð>OÐÓPÐPøô ò 	Ùð	ús   ‚> ¾	A
Á	A
c                 ó|   — | j                   j                  €dS | j                  | j                   j                  «      S ©z’
        .. versionadded:: 2.2.0

        Returns
        -------
        CRS:
            The geodeticCRS / geographicCRS from the CRS.

        N)r†   rß   r(   r…   s    r)   rß   zCRS.geodetic_crsÛ  s;   € ð �y‰y×%Ñ%Ð-ð ð	
ð —‘ §	¡	× 6Ñ 6Ó7ð	
r*   c                 ó|   — | j                   j                  €dS | j                  | j                   j                  «      S ©z«
        The base CRS of a BoundCRS or a DerivedCRS/ProjectedCRS,
        or the source CRS of a CoordinateOperation.

        Returns
        -------
        CRS
        N)r†   rÔ   r(   r…   s    r)   rÔ   zCRS.source_crsì  s;   € ð �y‰y×#Ñ#Ð+ð ð	
ð —‘ §	¡	× 4Ñ 4Ó5ð	
r*   c                 ó|   — | j                   j                  €dS | j                  | j                   j                  «      S ©zª
        .. versionadded:: 2.2.0

        Returns
        -------
        CRS:
            The hub CRS of a BoundCRS or the target CRS of a CoordinateOperation.

        N)r†   ró   r(   r…   s    r)   ró   zCRS.target_crsü  s;   € ð �y‰y×#Ñ#Ð+ð ð	
ð —‘ §	¡	× 4Ñ 4Ó5ð	
r*   c                 ór   — | j                   j                  D �cg c]  }| j                  |«      ‘Œ c}S c c}w ©zŒ
        If the CRS is a compound CRS, it will return a list of sub CRS objects.

        Returns
        -------
        list[CRS]
        )r†   rÙ   r(   ©r'   rå   s     r)   rÙ   zCRS.sub_crs_list  s+   € ð 8<·y±y×7MÑ7MÖN¨G�—‘˜wÕ'ÒNÐNùÒNs   ™4c                 ó   — | j                   r"| j                  r| j                  j                  S | j                  r,| j                  D ]  }|j                  sŒ|j                  c S  y| j                  r\d| j                  j
                  j                  «       v r6| j                  j
                  j                  «       j                  d«      d   S y)zã
        .. versionadded:: 2.6.0

        Finds the UTM zone in a Projected CRS, Bound CRS, or Compound CRS

        Returns
        -------
        str | None:
            The UTM zone number and letter if applicable.
        zUTM ZONEz	UTM ZONE éÿÿÿÿN)rÒ   rÔ   Úutm_zonerÙ   rÓ   rÄ   ÚupperrV   r.  s     r)   r1  zCRS.utm_zone  s¯   € ð �=Š=˜TŸ_š_Ø—?‘?×+Ñ+Ð+Ø×ÒØ×,Ñ,ò ,�Ø×#Ó#Ø"×+Ñ+Ò+ð,ð ð	 ×%Ò%Ø˜d×7Ñ7×<Ñ<×BÑBÓDÑDà×,Ñ,×1Ñ1×7Ñ7Ó9×?Ñ?ÀÓLÈRÑPÐPØr*   c                 ó.   — | j                   j                  S )zx
        Returns
        -------
        str:
            The name of the CRS (from :cpp:func:`proj_get_name`).
        )r†   rÄ   r…   s    r)   rÄ   zCRS.name1  s   € ð �y‰y�~‰~Ðr*   c                 ó.   — | j                   j                  S )zj
        Returns
        -------
        str:
            The name of the type of the CRS object.
        )r†   r  r…   s    r)   r  zCRS.type_name;  s   € ð �y‰y×"Ñ"Ð"r*   c                 ó.   — | j                   j                  S )a;  
        Retrieves all relevant axis information in the CRS.
        If it is a Bound CRS, it gets the axis list from the Source CRS.
        If it is a Compound CRS, it gets the axis list from the Sub CRS list.

        Returns
        -------
        list[Axis]:
            The list of axis information.
        )r†   r  r…   s    r)   r  zCRS.axis_infoE  s   € ð �y‰y×"Ñ"Ð"r*   c                 ó.   — | j                   j                  S )z{
        Returns
        -------
        AreaOfUse:
            The area of use object with associated attributes.
        )r†   Úarea_of_user…   s    r)   r7  zCRS.area_of_useS  s   € ð �y‰y×$Ñ$Ð$r*   c                 ó.   — | j                   j                  S )zš
        .. versionadded:: 2.2.0

        Returns
        -------
        Ellipsoid:
            The ellipsoid object with associated attributes.
        )r†   r£   r…   s    r)   r£   zCRS.ellipsoid]  s   € ð �y‰y×"Ñ"Ð"r*   c                 ó.   — | j                   j                  S )z£
        .. versionadded:: 2.2.0

        Returns
        -------
        PrimeMeridian:
            The prime meridian object with associated attributes.
        )r†   rÝ   r…   s    r)   rÝ   zCRS.prime_meridiani  ó   € ð �y‰y×'Ñ'Ð'r*   c                 ó.   — | j                   j                  S )zX
        .. versionadded:: 2.2.0

        Returns
        -------
        Datum
        )r†   rÜ   r…   s    r)   rÜ   z	CRS.datumu  s   € ð �y‰y�‰Ðr*   c                 ó.   — | j                   j                  S )zc
        .. versionadded:: 2.2.0

        Returns
        -------
        CoordinateSystem
        )r†   rð   r…   s    r)   rð   zCRS.coordinate_system€  s   € ð �y‰y×*Ñ*Ð*r*   c                 ó.   — | j                   j                  S )zf
        .. versionadded:: 2.2.0

        Returns
        -------
        CoordinateOperation
        )r†   rÓ   r…   s    r)   rÓ   zCRS.coordinate_operation‹  s   € ð �y‰y×-Ñ-Ð-r*   c                 ó.   — | j                   j                  S )zy
        .. versionadded:: 2.4.0

        Returns
        -------
        str:
            Remarks about object.
        )r†   Úremarksr…   s    r)   r?  zCRS.remarks–  s   € ð �y‰y× Ñ Ð r*   c                 ó.   — | j                   j                  S )zt
        .. versionadded:: 2.4.0

        Returns
        -------
        str:
            Scope of object.
        )r†   Úscoper…   s    r)   rA  z	CRS.scope¢  s   € ð �y‰y�‰Ðr*   ÚversionÚprettyÚoutput_axis_rulec                 ód   — | j                   j                  |||¬«      }|€t        d|› d�«      ‚|S )aA  
        Convert the projection to a WKT string.

        Version options:
          - WKT2_2015
          - WKT2_2015_SIMPLIFIED
          - WKT2_2019
          - WKT2_2019_SIMPLIFIED
          - WKT1_GDAL
          - WKT1_ESRI

        .. versionadded:: 3.6.0 output_axis_rule

        Parameters
        ----------
        version: pyproj.enums.WktVersion, optional
            The version of the WKT output.
            Default is :attr:`pyproj.enums.WktVersion.WKT2_2019`.
        pretty: bool, default=False
            If True, it will set the output to be a multiline string.
        output_axis_rule: bool, optional, default=None
            If True, it will set the axis rule on any case. If false, never.
            None for AUTO, that depends on the CRS and version.

        Returns
        -------
        str
        )rB  rC  rD  z.CRS cannot be converted to a WKT string of a 'zG' version. Select a different version of a WKT string or edit your CRS.)r†   r}   r   )r'   rB  rC  rD  Úwkts        r)   r}   z
CRS.to_wkt®  sU   € ðD �i‰i×ÑØ FÐ=Mð ó 
ˆð ˆ;ÜØ@ÀÀ	ð JOð Oóð ð ˆ
r*   Úindentationc                 óZ   — | j                   j                  ||¬«      }|€t        d«      ‚|S )a‚  
        .. versionadded:: 2.4.0

        Convert the object to a JSON string.

        Parameters
        ----------
        pretty: bool, default=False
            If True, it will set the output to be a multiline string.
        indentation: int, default=2
            If pretty is True, it will set the width of the indentation.

        Returns
        -------
        str
        )rC  rG  z.CRS cannot be converted to a PROJ JSON string.)r†   Úto_jsonr   )r'   rC  rG  Ú	proj_jsons       r)   rI  zCRS.to_jsonÚ  s5   € ð" —I‘I×%Ñ%¨VÀÐ%ÓMˆ	ØÐÜÐKÓLÐLØÐr*   c                 ó6   — | j                   j                  «       S )z‰
        .. versionadded:: 2.4.0

        Convert the object to a JSON dictionary.

        Returns
        -------
        dict
        )r†   rÛ   r…   s    r)   rÛ   zCRS.to_json_dictð  s   € ð �y‰y×%Ñ%Ó'Ð'r*   c                 óX   — | j                   j                  |¬«      }|€t        d«      ‚|S )a.  
        Convert the projection to a PROJ string.

        .. warning:: You will likely lose important projection
          information when converting to a PROJ string from
          another format. See:
          https://proj.org/faq.html#what-is-the-best-format-for-describing-coordinate-reference-systems

        Parameters
        ----------
        version: pyproj.enums.ProjVersion
            The version of the PROJ string output.
            Default is :attr:`pyproj.enums.ProjVersion.PROJ_4`.

        Returns
        -------
        str
        )rB  z)CRS cannot be converted to a PROJ string.)r†   r·   r   )r'   rB  r5   s      r)   r·   zCRS.to_proj4ü  s1   € ð& �y‰y×!Ñ!¨'Ð!Ó2ˆØˆ<ÜÐFÓGÐGØˆr*   r™   c                 ó:   — | j                   j                  |¬«      S )a`  
        Return the EPSG code best matching the CRS
        or None if it a match is not found.

        Example:

        >>> from pyproj import CRS
        >>> ccs = CRS("EPSG:4328")
        >>> ccs.to_epsg()
        4328

        If the CRS is bound, you can attempt to get an epsg code from
        the source CRS:

        >>> from pyproj import CRS
        >>> ccs = CRS("+proj=geocent +datum=WGS84 +towgs84=0,0,0")
        >>> ccs.to_epsg()
        >>> ccs.source_crs.to_epsg()
        4978
        >>> ccs == CRS.from_epsg(4978)
        False

        Parameters
        ----------
        min_confidence: int, default=70
            A value between 0-100 where 100 is the most confident.
            :ref:`min_confidence`


        Returns
        -------
        int | None:
            The best matching EPSG code matching the confidence level.
        r˜   )r†   Úto_epsg)r'   r™   s     r)   rN  zCRS.to_epsg  s   € ðF �y‰y× Ñ °Ð Ó?Ð?r*   c                 ó<   — | j                   j                  ||¬«      S )a!  
        .. versionadded:: 2.2.0

        Return the authority name and code best matching the CRS
        or None if it a match is not found.

        Example:

        >>> from pyproj import CRS
        >>> ccs = CRS("EPSG:4328")
        >>> ccs.to_authority()
        ('EPSG', '4328')

        If the CRS is bound, you can get an authority from
        the source CRS:

        >>> from pyproj import CRS
        >>> ccs = CRS("+proj=geocent +datum=WGS84 +towgs84=0,0,0")
        >>> ccs.to_authority()
        >>> ccs.source_crs.to_authority()
        ('EPSG', '4978')
        >>> ccs == CRS.from_authorty('EPSG', '4978')
        False

        Parameters
        ----------
        auth_name: str, optional
            The name of the authority to filter by.
        min_confidence: int, default=70
            A value between 0-100 where 100 is the most confident.
            :ref:`min_confidence`

        Returns
        -------
        tuple(str, str) or None:
            The best matching (<auth_name>, <code>) for the confidence level.
        ©ri   r™   )r†   rš   ©r'   ri   r™   s      r)   rš   zCRS.to_authority9  s&   € ðL �y‰y×%Ñ%Ø°ð &ó 
ð 	
r*   c                 ó<   — | j                   j                  ||¬«      S )aT  
        .. versionadded:: 3.2.0

        Return the authority names and codes best matching the CRS.

        Example:

        >>> from pyproj import CRS
        >>> ccs = CRS("EPSG:4328")
        >>> ccs.list_authority()
        [AuthorityMatchInfo(auth_name='EPSG', code='4326', confidence=100)]

        If the CRS is bound, you can get an authority from
        the source CRS:

        >>> from pyproj import CRS
        >>> ccs = CRS("+proj=geocent +datum=WGS84 +towgs84=0,0,0")
        >>> ccs.list_authority()
        []
        >>> ccs.source_crs.list_authority()
        [AuthorityMatchInfo(auth_name='EPSG', code='4978', confidence=70)]
        >>> ccs == CRS.from_authorty('EPSG', '4978')
        False

        Parameters
        ----------
        auth_name: str, optional
            The name of the authority to filter by.
        min_confidence: int, default=70
            A value between 0-100 where 100 is the most confident.
            :ref:`min_confidence`

        Returns
        -------
        list[AuthorityMatchInfo]:
            List of authority matches for the CRS.
        rP  )r†   Úlist_authorityrQ  s      r)   rS  zCRS.list_authorityc  s&   € ðP �y‰y×'Ñ'Ø°ð (ó 
ð 	
r*   rÄ   c                 óX   — | j                  | j                  j                  |¬«      «      S ©až  
        .. versionadded:: 3.1.0

        Convert the current CRS to the 3D version if it makes sense.

        New vertical axis attributes:
          - ellipsoidal height
          - oriented upwards
          - metre units

        Parameters
        ----------
        name: str, optional
            CRS name. Defaults to use the name of the original CRS.

        Returns
        -------
        CRS
        ©rÄ   )r(   r†   Úto_3d©r'   rÄ   s     r)   rW  z	CRS.to_3d�  s"   € ð( �~‰~˜dŸi™iŸo™o°4˜oÓ8Ó9Ð9r*   c                 óX   — | j                  | j                  j                  |¬«      «      S )a#  
        .. versionadded:: 3.6.0

        Convert the current CRS to the 2D version if it makes sense.

        Parameters
        ----------
        name: str, optional
            CRS name. Defaults to use the name of the original CRS.

        Returns
        -------
        CRS
        rV  )r(   r†   Úto_2drX  s     r)   rZ  z	CRS.to_2d¥  s"   € ð �~‰~˜dŸi™iŸo™o°4˜oÓ8Ó9Ð9r*   c                 ó.   — | j                   j                  S )aW  
        This checks if the CRS is geographic.
        It will check if it has a geographic CRS
        in the sub CRS if it is a compound CRS and will check if
        the source CRS is geographic if it is a bound CRS.

        Returns
        -------
        bool:
            True if the CRS is in geographic (lon/lat) coordinates.
        )r†   rà   r…   s    r)   rà   zCRS.is_geographic¶  s   € ð �y‰y×&Ñ&Ð&r*   c                 ó.   — | j                   j                  S )a6  
        This checks if the CRS is projected.
        It will check if it has a projected CRS
        in the sub CRS if it is a compound CRS and will check if
        the source CRS is projected if it is a bound CRS.

        Returns
        -------
        bool:
            True if CRS is projected.
        )r†   râ   r…   s    r)   râ   zCRS.is_projectedÅ  s   € ð �y‰y×%Ñ%Ð%r*   c                 ó.   — | j                   j                  S )aS  
        .. versionadded:: 2.2.0

        This checks if the CRS is vertical.
        It will check if it has a vertical CRS
        in the sub CRS if it is a compound CRS and will check if
        the source CRS is vertical if it is a bound CRS.

        Returns
        -------
        bool:
            True if CRS is vertical.
        )r†   rÚ   r…   s    r)   rÚ   zCRS.is_verticalÔ  s   € ð �y‰y×$Ñ$Ð$r*   c                 ó.   — | j                   j                  S )zY
        Returns
        -------
        bool:
            True if CRS is bound.
        )r†   rÒ   r…   s    r)   rÒ   zCRS.is_boundå  s   € ð �y‰y×!Ñ!Ð!r*   c                 ó.   — | j                   j                  S )z}
        .. versionadded:: 3.1.0

        Returns
        -------
        bool:
            True if CRS is compound.
        )r†   rØ   r…   s    r)   rØ   zCRS.is_compoundï  s   € ð �y‰y×$Ñ$Ð$r*   c                 ó.   — | j                   j                  S )z†
        .. versionadded:: 2.2.0

        Returns
        -------
        bool:
            True if CRS is local/engineering.
        )r†   Úis_engineeringr…   s    r)   ra  zCRS.is_engineeringû  r:  r*   c                 ó.   — | j                   j                  S )zÕ
        This checks if the CRS is geocentric and
        takes into account if the CRS is bound.

        Returns
        -------
        bool:
            True if CRS is in geocentric (x/y) coordinates.
        )r†   Úis_geocentricr…   s    r)   rc  zCRS.is_geocentric  ó   € ð �y‰y×&Ñ&Ð&r*   c                 ó.   — | j                   j                  S )z‚
        .. versionadded:: 3.2.0

        Returns
        -------
        bool:
            True if CRS is a Derived CRS.
        )r†   Ú
is_derivedr…   s    r)   rf  zCRS.is_derived  s   € ð �y‰y×#Ñ#Ð#r*   c                 ó.   — | j                   j                  S )z
        .. versionadded:: 3.7.0

        Check if the CRS is deprecated

        Returns
        -------
        bool
        )r†   Úis_deprecatedr…   s    r)   rh  zCRS.is_deprecated   rd  r*   c                 ó6   — | j                   j                  «       S )zž
        .. versionadded:: 3.7.0

        Return a list of non-deprecated objects related to this.

        Returns
        -------
        list[CRS]
        )r†   Úget_non_deprecatedr…   s    r)   rj  zCRS.get_non_deprecated-  s   € ð �y‰y×+Ñ+Ó-Ð-r*   c                 ó$   — | j                  |«      S r#   )r%  r"  s     r)   Ú__eq__z
CRS.__eq__9  s   € Ø�{‰{˜5Ó!Ð!r*   c                 ó   — d| j                   iS )Nr~   ©r~   r…   s    r)   Ú__getstate__zCRS.__getstate__<  s   € Ø�t—x‘xÐ Ð r*   Ústatec                 óX   — | j                   j                  |«       t        «       | _        y r#   )Ú__dict__r×   r!   r€   )r'   rp  s     r)   Ú__setstate__zCRS.__setstate__?  s   € Ø�‰×Ñ˜UÔ#Ü“jˆ�r*   c                 ó4   — t        | j                  «       «      S r#   )Úhashr}   r…   s    r)   Ú__hash__zCRS.__hash__C  s   € Ü�D—K‘K“MÓ"Ð"r*   c                 ó   — | j                   S r#   rn  r…   s    r)   Ú__str__zCRS.__str__F  s   € Ø�x‰xˆr*   c                 ó†  — g }| j                   D ]  }|j                  dt        |«      dg«       Œ! dj                  |«      }d}d}| j                  r,| j                  j
                  rt        | j                  «      }nÌ| j                  rF| j                  r:t        | j                  j                  «      }d| j                  j                  › d�}nzg }dg}| j                  D ]D  }	|j                  t        |	j                  «      «       |j                  d|	j                  dg«       ŒF dj                  |«      }dj                  |«      }d}
| j                  r>dj                  ddt        | j                  «      d	| j                  j                  dg«      }
| j                  «       }t        |«      d
k  r|ndj                  |d d
 dg«      }|xs d}d| j                  › d|› d| j                  › d|xs d› d|› d| j                   xs d› d|
› d| j"                  › d| j$                  xs d› d| j&                  xs d› d|› |› �S )Nz- ú
r|   zSource CRS: z	Sub CRS:
ú|zCoordinate Operation:
z- name: z
- method: é2   r<   z...z- undefined
ú<z: z>
Name: z
Axis Info [rî   z]:
zArea of Use:
z- undefinedzDatum: z
- Ellipsoid: z
- Prime Meridian: )r  r  rE   rD   rð   Ú	axis_listrÒ   rÔ   rÄ   rÙ   rF   rÓ   rá   rœ   r   r  r7  rÜ   r£   rÝ   )r'   Úaxis_info_listr  Úaxis_info_strÚsource_crs_reprÚsub_crs_reprÚcoordinate_system_nameÚcoordinate_system_namesÚsub_crs_repr_listrå   rÓ   Úsrs_reprs               r)   Ú__repr__zCRS.__repr__I  sT  € à$&ˆØ—N‘Nò 	;ˆDØ×!Ñ! 4¬¨T«°DÐ"9Õ:ð	;àŸ™ Ó/ˆð ˆØˆØ×!Ò! d×&<Ñ&<×&FÒ&FÜ%(¨×)?Ñ)?Ó%@Ñ"Ø�]Š]˜tŸšÜ%(¨¯©×)JÑ)JÓ%KÐ"Ø ,¨T¯_©_×-AÑ-AÐ,BÀ"ÐE‰Oà&(Ð#Ø!- ÐØ×,Ñ,ò E�Ø'×.Ñ.¬s°7×3LÑ3LÓ/MÔNØ!×(Ñ(¨$°·±¸dÐ)CÕDðEð &)§X¡XÐ.EÓ%FÐ"ØŸ7™7Ð#4Ó5ˆLð  "ÐØ×$Ò$Ø#%§7¡7à-ØÜ˜×1Ñ1Ó2Ø"Ø×-Ñ-×9Ñ9Øðó	$Ð ð —>‘>Ó#ˆÜ" 8›}°Ò2‘8¸¿¹À(È3ÈBÀ-ÐQVÐAWÓ8XˆØ%Ò8¨ˆà�—‘Ð˜r ( ð ,Ø—Y‘Y�Kð  Ø0Ò?°KÐ@ÀØˆoØØ×ÑÒ0 =Ð1°Ø#Ð$Ø�d—j‘j�\ð "Ø ŸN™NÒ9¨kÐ:ð ;!Ø!%×!4Ñ!4Ò!C¸Ð DÀBØÐØˆnðð	
r*   r#   )NNN)F)FrP   )éF   )Nrˆ  )Xr+   r,   r-   r.   r   r&   Úpropertyr†   ÚclassmethodrE   ru   r‹   r�   r�   r“   r•   rœ   r‰   r   r§   r>   rª   r­   r¯   r½   r   Ú	WKT2_2019ÚboolrÕ   Ústaticmethodr  rB   r  r!  r%  r   rß   rÔ   ró   rÙ   r1  rÄ   r  r	   r  r   r7  r   r£   r   rÝ   r   rÜ   r   rð   r
   rÓ   r?  rA  r}   rI  rÛ   r   ÚPROJ_5r·   rN  rš   r   rS  rW  rZ  rà   râ   rÚ   rÒ   rØ   ra  rc  rf  rh  rj  Úobjectrl  ro  rs  rv  rx  r‡  rm   r*   r)   rz   rz   ¥   sö  „ ññ&e- 3¨¡:ð e-À4ó e-ðN ñó ðð ðM sð M°#¸±)ð MÀò Mó ðMð& ð=˜S 3™Yð =¨5ò =ó ð=ð ðN¨ð N°ò Nó ðNð& ðH Sð H¨Uò Hó ðHð& ðH¨ð H°ò Hó ðHð*˜3ó ð& ð$ Cð $°eò $ó ð$ð6
˜$ ™+ó 
ð ðB $ð B¨5ò Bó ðBð" ð> ð >¨ò >ó ð>ð" ð9 dð 9¨uò 9ó ð9ð",˜ó ,ð` )3×(<Ñ(<ØñAà #Ñ%ðAð ðAð 
ó	AðF ð &*Ø#'Ø"&ñ	|
Øð|
à˜d™
ð|
ð ˜D‘jð|
ð ˜4‘Zð	|
ð
 
ò|
ó ð|
ð|<˜$˜t™*ó <ð|3 3ð 3¨4ó 3ñ*Q˜Cð Q°Dð QÀTó Qð4 ð
˜h u™oò 
ó ð
ð  ð
˜H U™Oò 
ó ð
ð ð
˜H U™Oò 
ó ð
ð  ðO˜d 5™kò Oó ðOð ð˜# ™*ò ó ðð0 ð�cò ó ðð ð#˜3ò #ó ð#ð ð#˜4 ™:ò #ó ð#ð ð%˜Y¨Ñ-ò %ó ð%ð ð	#˜9 tÑ+ò 	#ó ð	#ð ð	( °Ñ 4ò 	(ó ð	(ð ð�u˜t‘|ò ó ðð ð+Ð#3°dÑ#:ò +ó ð+ð ð.Ð&9¸DÑ&@ò .ó ð.ð ð	!˜ò 	!ó ð	!ð ð	�sò 	ó ð	ð %/×$8Ñ$8ØØ(,ñ	*à˜cÑ!ð*ð ð*ð  ™+ð	*ð
 
ó*ñX˜dð ¸ð ÀSó ð,
(˜dó 
(ð 5@×4FÑ4Fñ  ¨cÑ 1ð È3ó ñ0#@ cð #@°3¸±:ó #@ñJ(
 c¨D¡jð (
Èó (
ðV CEñ*
Ø˜t™ð*
Ø<?ð*
à	Ð Ñ	!ó*
ñX:˜# ™*ð :°ó :ñ,:˜# ™*ð :°ó :ð" ð'˜tò 'ó ð'ð ð&˜dò &ó ð&ð ð%˜Tò %ó ð%ð  ð"˜$ò "ó ð"ð ð	%˜Tò 	%ó ð	%ð ð	( ò 	(ó ð	(ð ð
'˜tò 
'ó ð
'ð ñ	$ó ð	$ð ð
'˜tò 
'ó ð
'ð
. D¨¡Kó 
.ð"˜Fð " tó "ð!˜d 3¨ 8™nó !ð! $ s¨C x¡.ó !ð#˜#ó #ð˜ó ð7
˜#ô 7
r*   rz   c                   óä   ‡ — e Zd ZdZedeedf   fd„«       Zd„ Ze	de
ddfˆ fd„«       Zeded   fd	„«       Zeded   fd
„«       Zeded   fd„«       Zeded   fd„«       Zddedz  ddfd„Zˆ xZS )ÚCustomConstructorCRSzÆ
    This class is a base class for CRS classes
    that use a different constructor than the main CRS class.

    .. versionadded:: 3.2.0

    See: https://github.com/pyproj4/pyproj/issues/847
    r3   .c                 ó   — t         ‚)zt
        These are the type names of the CRS class
        that are expected when using the from_* methods.
        )ÚNotImplementedErrorr…   s    r)   Ú_expected_typesz$CustomConstructorCRS._expected_types�  s
   € ô "Ð!r*   c                 ó€   — | j                   | j                  vr&t        d| j                   › d| j                  › d�«      ‚y)zl
        This validates that the type of the CRS is expected
        when using the from_* methods.
        zInvalid type z. Expected ú.N)r  r”  r   r…   s    r)   Ú_check_typez CustomConstructorCRS._check_type•  sG   € ð
 �>‰> ×!5Ñ!5Ñ5ÜØ §¡Ð/¨{¸4×;OÑ;OÐ:PÐPQÐRóð ð 6r*   rJ   rz   c                 óŽ   •— t        || «      r|S | j                  | «      }t        t        |�  |fi |¤Ž |j                  «        |S rž   )r=   Ú__new__r%   r‘  r&   r—  )rŠ   rJ   r�   r$   r(   s       €r)   r‰   z$CustomConstructorCRS.from_user_inputŸ  sF   ø€ ô0 �e˜SÔ!ØˆLØ�k‰k˜#ÓˆÜÔ" CÑ1°%ÑB¸6ÒBØ�‰ÔØˆ
r*   c                 óp   — | j                   j                  €dS t        | j                   j                  «      S r'  )r†   rß   rz   r…   s    r)   rß   z!CustomConstructorCRS.geodetic_crs¾  s-   € ð —y‘y×-Ñ-Ð5ˆtÐV¼3¸t¿y¹y×?UÑ?UÓ;VÐVr*   c                 óp   — | j                   j                  €dS t        | j                   j                  «      S r)  )r†   rÔ   rz   r…   s    r)   rÔ   zCustomConstructorCRS.source_crsË  s-   € ð —y‘y×+Ñ+Ð3ˆtÐR¼¸T¿Y¹Y×=QÑ=QÓ9RÐRr*   c                 óp   — | j                   j                  €dS t        | j                   j                  «      S r+  )r†   ró   rz   r…   s    r)   ró   zCustomConstructorCRS.target_crs×  s-   € ð —y‘y×+Ñ+Ð3ˆtÐR¼¸T¿Y¹Y×=QÑ=QÓ9RÐRr*   c                 óf   — | j                   j                  D �cg c]  }t        |«      ‘Œ c}S c c}w r-  )r†   rÙ   rz   r.  s     r)   rÙ   z!CustomConstructorCRS.sub_crs_listä  s&   € ð -1¯I©I×,BÑ,BÖC ”�G•ÒCÐCùÒCs   ™.NrÄ   c                 óL   — t        | j                  j                  |¬«      «      S rU  )rz   r†   rW  rX  s     r)   rW  zCustomConstructorCRS.to_3dï  s   € ô( �4—9‘9—?‘?¨�?Ó-Ó.Ð.r*   r#   )r+   r,   r-   r.   r‰  rC   rE   r”  r—  rŠ  r   r‰   r   rß   rÔ   ró   rB   rÙ   rW  r/   r0   s   @r)   r‘  r‘  ƒ  sñ   ø„ ñð ð"  s¨C x¡ò "ó ð"òð ð Cð °eô ó ðð< ð
W˜h u™oò 
Wó ð
Wð ð	S˜H U™Oò 	Só ð	Sð ð
S˜H U™Oò 
Só ð
Sð ðD˜d 5™kò Dó ðDñ/˜# ™*ð /°÷ /r*   r‘  c            	       óF   ‡ — e Zd ZdZdZ	 	 	 d	dedededz  ddfˆ fd„Zˆ xZS )
rø   zR
    .. versionadded:: 2.5.0

    This class is for building a Geographic CRS
    )zGeographic CRSzGeographic 2D CRSzGeographic 3D CRSNrÄ   rÜ   ré   r3   c                 óø   •— t        j                  |«      j                  «       }dd|t        j                  |xs
 t	        «       «      j                  «       dœ}|d   dk(  r||d<   n||d<   t
        ‰| �  |«       y)	aC  
        Parameters
        ----------
        name: str, default="undefined"
            Name of the CRS.
        datum: Any, default="urn:ogc:def:ensemble:EPSG::6326"
            Anything accepted by :meth:`pyproj.crs.Datum.from_user_input` or
            a :class:`pyproj.crs.datum.CustomDatum`.
        ellipsoidal_cs: Any, optional
            Input to create an Ellipsoidal Coordinate System.
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or an Ellipsoidal Coordinate System created from :ref:`coordinate_system`.
        ú2https://proj.org/schemas/v0.2/projjson.schema.jsonrø   )ú$schemaÚtyperÄ   rð   r£  ÚDatumEnsembleÚdatum_ensemblerÜ   N)r   r‰   rÛ   r   r   r%   r&   )r'   rÄ   rÜ   ré   r  r(   s        €r)   r&   zGeographicCRS.__init__  s‚   ø€ ô& ×%Ñ% eÓ,×9Ñ9Ó;ˆàKØ#ØÜ!1×!AÑ!AØÒ3¤/Ó"3ó"ç‰l‹nñ
Ðð �‰=˜OÒ+Ø49ÐÐ 0Ò1à+0Ð Ñ(Ü‰ÑÐ,Õ-r*   )rî   zurn:ogc:def:ensemble:EPSG::6326N©	r+   r,   r-   r.   r”  rE   r   r&   r/   r0   s   @r)   rø   rø     sO   ø„ ñð S€Oð  Ø6Ø%)ñ	 .àð .ð ð .ð ˜d™
ð	 .ð
 
÷ .ñ  .r*   rø   c                   óH   ‡ — e Zd ZdZdZ	 	 d
dedededz  deddf
ˆ fd	„Zˆ xZS )rù   zZ
    .. versionadded:: 2.5.0

    This class is for building a Derived Geographic CRS
    )zDerived Geographic CRSzDerived Geographic 2D CRSzDerived Geographic 3D CRSNrñ   rò   ré   rÄ   r3   c           	      ó  •— dd|t         j                  |«      j                  «       t        j                  |«      j                  «       t	        j                  |xs
 t        «       «      j                  «       dœ}t        ‰| �  |«       y)a×  
        Parameters
        ----------
        base_crs: Any
            Input to create the Geodetic CRS, a :class:`GeographicCRS` or
            anything accepted by :meth:`pyproj.crs.CRS.from_user_input`.
        conversion: Any
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or a conversion from :ref:`coordinate_operation`.
        ellipsoidal_cs: Any, optional
            Input to create an Ellipsoidal Coordinate System.
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or an Ellipsoidal Coordinate System created from :ref:`coordinate_system`.
        name: str, default="undefined"
            Name of the CRS.
        r¡  rù   ©r¢  r£  rÄ   rñ   rò   rð   N)rz   r‰   rÛ   r
   r   r   r%   r&   )r'   rñ   rò   ré   rÄ   Úderived_geographic_crs_jsonr(   s         €r)   r&   zDerivedGeographicCRS.__init__?  sv   ø€ ð0 LØ*ØÜ×+Ñ+¨HÓ5×BÑBÓDÜ-×=Ñ=Øóç‰l‹nÜ!1×!AÑ!AØÒ3¤/Ó"3ó"ç‰l‹nñ'
Ð#ô 	‰ÑÐ4Õ5r*   )Nrî   ©	r+   r,   r-   r.   r”  r   rE   r&   r/   r0   s   @r)   rù   rù   2  sU   ø„ ñð€Oð &*Øñ#6àð#6ð ð#6ð ˜d™
ð	#6ð
 ð#6ð 
÷#6ñ #6r*   rù   c                   ó:   ‡ — e Zd ZdZdZ	 	 ddededdfˆ fd„Zˆ xZS )	ÚGeocentricCRSzR
    .. versionadded:: 3.2.0

    This class is for building a Geocentric CRS
    )zGeocentric CRSrÄ   rÜ   r3   Nc                 ó    •— dd|t        j                  |«      j                  «       ddddddœd	d
dddœdddddœgdœdœ}t        ‰| �  |«       y)a0  
        Parameters
        ----------
        name: str, default="undefined"
            Name of the CRS.
        datum: Any, default="urn:ogc:def:datum:EPSG::6326"
            Anything accepted by :meth:`pyproj.crs.Datum.from_user_input` or
            a :class:`pyproj.crs.datum.CustomDatum`.
        r¡  ÚGeodeticCRSÚ	CartesianzGeocentric XÚXÚgeocentricXÚmetre)rÄ   ÚabbreviationÚ	directionÚunitzGeocentric YÚYÚgeocentricYzGeocentric ZÚZÚgeocentricZ)Úsubtyper  ©r¢  r£  rÄ   rÜ   rð   N)r   r‰   rÛ   r%   r&   )r'   rÄ   rÜ   Úgeocentric_crs_jsonr(   s       €r)   r&   zGeocentricCRS.__init__n  s„   ø€ ð MØ!ØÜ×*Ñ*¨5Ó1×>Ñ>Ó@à&ð !/Ø(+Ø%2Ø 'ñ	ð !/Ø(+Ø%2Ø 'ñ	ð !/Ø(+Ø%2Ø 'ñ	ðñ"ñ
Ðô: 	‰ÑÐ,Õ-r*   )rî   zurn:ogc:def:datum:EPSG::6326r¦  r0   s   @r)   r­  r­  e  s=   ø„ ñð *€Oð  Ø3ñ+.àð+.ð ð+.ð 
÷	+.ñ +.r*   r­  c                   óP   ‡ — e Zd ZdZdZ	 	 	 d
dedededz  dedz  ddf
ˆ fd	„Zˆ xZS )rú   zR
    .. versionadded:: 2.5.0

    This class is for building a Projected CRS.
    )zProjected CRSzDerived Projected CRSNrò   rÄ   rê   rß   r3   c           	      ó,  •— dd|t         j                  |xs
 t        «       «      j                  «       t	        j                  |«      j                  «       t        j                  |xs
 t        «       «      j                  «       dœ}t        ‰| �!  |«       y)aæ  
        Parameters
        ----------
        conversion: Any
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or a conversion from :ref:`coordinate_operation`.
        name: str, optional
            The name of the Projected CRS. Default is undefined.
        cartesian_cs: Any, optional
            Input to create a Cartesian Coordinate System.
            Anything accepted by :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or :class:`pyproj.crs.coordinate_system.Cartesian2DCS`.
        geodetic_crs: Any, optional
            Input to create the Geodetic CRS, a :class:`GeographicCRS` or
            anything accepted by :meth:`pyproj.crs.CRS.from_user_input`.
        r¡  rú   r©  N)	rz   r‰   rø   rÛ   r
   r   r   r%   r&   )r'   rò   rÄ   rê   rß   Úproj_crs_jsonr(   s         €r)   r&   zProjectedCRS.__init__¥  s{   ø€ ð0 LØ"ØÜ×+Ñ+ØÒ/¤£óç‰l‹nÜ-×=Ñ=Øóç‰l‹nÜ!1×!AÑ!AØÒ/¤£ó"ç‰l‹nñ
ˆô 	‰Ñ˜Õ'r*   )rî   NNr«  r0   s   @r)   rú   rú   œ  s]   ø„ ñð A€Oð
  Ø#'Ø#'ñ%(àð%(ð ð%(ð ˜D‘jð	%(ð
 ˜D‘jð%(ð 
÷%(ñ %(r*   rú   c                   óN   ‡ — e Zd ZdZdZ	 	 d
dedededz  dedz  ddf
ˆ fd	„Zˆ xZS )rü   z•
    .. versionadded:: 2.5.0

    This class is for building a Vertical CRS.

    .. warning:: geoid_model support only exists in PROJ >= 6.3.0

    )zVertical CRSNrÄ   rÜ   rë   rÃ   r3   c                 óâ   •— dd|t        j                  |«      j                  «       t        j                  |xs
 t	        «       «      j                  «       dœ}|�d|i|d<   t
        ‰| �  |«       y)a!  
        Parameters
        ----------
        name: str
            The name of the Vertical CRS (e.g. NAVD88 height).
        datum: Any
            Anything accepted by :meth:`pyproj.crs.Datum.from_user_input`
        vertical_cs: Any, optional
            Input to create a Vertical Coordinate System accepted by
            :meth:`pyproj.crs.CoordinateSystem.from_user_input`
            or :class:`pyproj.crs.coordinate_system.VerticalCS`
        geoid_model: str, optional
            The name of the GEOID Model (e.g. GEOID12B).
        r¡  rü   r¼  NrÄ   rÃ   )r   r‰   rÛ   r   r   r%   r&   )r'   rÄ   rÜ   rë   rÃ   Úvert_crs_jsonr(   s         €r)   r&   zVerticalCRS.__init__Ù  sp   ø€ ð, LØ!ØÜ×*Ñ*¨5Ó1×>Ñ>Ó@Ü!1×!AÑ!AØÒ+œz›|ó"ç‰l‹nñ
ˆð Ð"Ø,2°KÐ+@ˆM˜-Ñ(ä‰Ñ˜Õ'r*   )NNr¦  r0   s   @r)   rü   rü   Í  sY   ø„ ñð (€Oð #'Ø"&ñ!(àð!(ð ð!(ð ˜4‘Zð	!(ð
 ˜4‘Zð!(ð 
÷!(ñ !(r*   rü   c                   ó:   ‡ — e Zd ZdZdZdedee   ddfˆ fd„Zˆ xZ	S )rý   zQ
    .. versionadded:: 2.5.0

    This class is for building a Compound CRS.
    )zCompound CRSrÄ   rõ   r3   Nc           	      óš   •— dd||D �cg c]%  }t         j                  |«      j                  «       ‘Œ' c}dœ}t        ‰| �  |«       yc c}w )a#  
        Parameters
        ----------
        name: str
            The name of the Compound CRS.
        components: list[Any], optional
            List of CRS to create a Compound Coordinate System.
            List of anything accepted by :meth:`pyproj.crs.CRS.from_user_input`
        r¡  rý   )r¢  r£  rÄ   rõ   N)rz   r‰   rÛ   r%   r&   )r'   rÄ   rõ   Ú	componentÚcompound_crs_jsonr(   s        €r)   r&   zCompoundCRS.__init__  sX   ø€ ð LØ!Øð ",öàô ×#Ñ# IÓ.×;Ñ;Õ=òñ	
Ðô 	‰ÑÐ*Õ+ùòs   ‰*A
)
r+   r,   r-   r.   r”  rE   rB   r   r&   r/   r0   s   @r)   rý   rý   ý  s2   ø„ ñð (€Oð,˜Sð ,¨d°3©ið ,¸D÷ ,ñ ,r*   rý   c                   ó8   ‡ — e Zd ZdZdZdedededdfˆ fd„Zˆ xZS )	rû   zN
    .. versionadded:: 2.5.0

    This class is for building a Bound CRS.
    )z	Bound CRSrÔ   ró   rô   r3   Nc                 óú   •— ddt         j                  |«      j                  «       t         j                  |«      j                  «       t        j                  |«      j                  «       dœ}t        ‰| �  |«       y)a  
        Parameters
        ----------
        source_crs: Any
            Input to create a source CRS.
        target_crs: Any
            Input to create the target CRS.
        transformation: Any
            Input to create the transformation.
        r¡  rû   )r¢  r£  rÔ   ró   rô   N)rz   r‰   rÛ   r
   r%   r&   )r'   rÔ   ró   rô   Úbound_crs_jsonr(   s        €r)   r&   zBoundCRS.__init__&  sh   ø€ ð LØÜ×-Ñ-¨jÓ9×FÑFÓHÜ×-Ñ-¨jÓ9×FÑFÓHÜ1×AÑAØóç‰l‹nñ
ˆô 	‰Ñ˜Õ(r*   )r+   r,   r-   r.   r”  r   r&   r/   r0   s   @r)   rû   rû     s6   ø„ ñð %€Oð) 3ð )°Cð )Èð )ÐQU÷ )ñ )r*   rû   )T)Cr.   r?   rR   Ú	threadingrZ   Úcollections.abcr   Útypingr   r   Úpyproj._crsr   r   r   r	   r
   r   r   r   r   r   r   r   Úpyproj.crs._cf1x8r   r   r   r   r   r   Úpyproj.crs.coordinate_operationr   Úpyproj.crs.coordinate_systemr   r   r   Úpyproj.enumsr   r   Úpyproj.exceptionsr   Úpyproj.geodr   Úcompiler±  r¸   Úlocalr!   r>   rŒ  rE   rL   ra   rG   ru   rn   rr   rx   rz   r‘  rø   rù   r­  rú   rü   rý   rû   rm   r*   r)   ú<module>r×     sw  ðñó Û 	Û Û Ý $ß  ÷÷ ÷ ó ÷÷ õ Bß SÑ Sß 0Ý &Ý à�—‘ðð ‡D�Dó	€ô
ˆy�‰ô 
ñ2 4ð 2°Tð 2ÀSó 2ð,#¨Sð #°Só #ðL¨ð °ó ð(& sð &°s¸S±yó &ð6 #¨¡)ó 6ð˜Sð  Tó ÷[
ñ [
ô|.@/˜3ô @/ôF).Ð(ô ).ôX06Ð/ô 06ôf4.Ð(ô 4.ôn.(Ð'ô .(ôb-(Ð&ô -(ô`,Ð&ô ,ô@)Ð#õ )r*   